EditText
のようにヒントのオプションがないので、スピナーウィジェットにヒントを追加しようとしています。クリックすると、ヒントではなく男性と女性のみを表示する必要があります。
XMLを使用してのみそれを行う方法
スピナーのXMLコード。
<Spinner
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/spinner1"
Android:entries="@array/gender"
Android:layout_marginTop="10dp"
Android:layout_marginLeft="25dp"
Android:layout_marginRight="25dp"
Android:layout_gravity="center_horizontal" />
スピナーの文字列配列
<string-array name="gender">
<item>Male</item>
<item>Female</item>
</string-array>
アダプタでは、最初の項目を無効に設定できます。以下はサンプルコードです
@Override
public boolean isEnabled(int position) {
if (position == 0) {
// Disable the first item from Spinner
// First item will be use for hint
return false;
} else {
return true;
}
}
そして、最初の項目を灰色に設定します。
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
View view = super.getDropDownView(position, convertView, parent);
TextView tv = (TextView) view;
if (position == 0) {
// Set the hint text color gray
tv.setTextColor(Color.GRAY);
} else {
tv.setTextColor(Color.BLACK);
}
return view;
}
ユーザーが最初のアイテムを選択した場合、何もしません。
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedItemText = (String) parent.getItemAtPosition(position);
// If user change the default selection
// First item is disable and it is used for hint
if (position > 0) {
// Notify the selected item text
Toast.makeText(getApplicationContext(), "Selected : " + selectedItemText, Toast.LENGTH_SHORT).show();
}
}
詳細については、以下のリンクを参照してください。
スピナーを使用する方法は2つあります。
静的な方法
Android:spinnerMode="dialog"
そして設定:
Android:Prompt="@string/hint_resource"
動的な方法
spinner.setPrompt("Gender");
注:ヒントのように機能しますが、実際には機能しません。
助けてください!
これは非常に簡単な方法で行うことができます。組み込み値(Android.R.layout.simple_list_item_1)を使用してアダプターを設定する代わりに、TextViewとDropDownの両方に独自のxmlレイアウトを作成し、それらを使用します。 TextViewレイアウトで、ヒントテキストとヒントカラーを定義します。最後のステップでは、Stringsで定義されたアイテム配列の最初のアイテムとしてアイテムを作成して空にします。
<string-array name="professional_qualification_array">
<item></item>
<item>B.Pharm</item>
<item>M.Pharm</item>
<item>PharmD</item>
</string-array>
Spinner TextViewのXMLレイアウトを作成(spnr_qualification.xml)
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@Android:id/text1"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textSize="20sp"
Android:hint="Qualification"
Android:textColorHint="@color/light_gray"
Android:textColor="@color/blue_black" />
スピナーDropDownのXMLレイアウトを作成します。(drpdn_qual.xml)
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@Android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
Android:maxLines="1"
Android:layout_width="match_parent"
Android:layout_height="?android:attr/listPreferredItemHeight"
Android:ellipsize="Marquee"
Android:textColor="#FFFFFF"/>
メインXMLレイアウトでスピナーを定義する
<Spinner
Android:id="@+id/spnQualification"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:layout_marginTop="10dp"
Android:paddingLeft="10dp"
Android:paddingBottom="5dp"
Android:paddingTop="5dp"
/>
そして最後に、コードでスピナーのアダプターを設定しながら、カスタムXMLレイアウトを使用します。
ArrayAdapter<CharSequence> qual_adapter = ArrayAdapter.createFromResource(this, R.array.professional_qualification_array,R.layout.spnr_qualification);
qual_adapter.setDropDownViewResource(R.layout.drpdn_qual);
spnQualification.setAdapter(qual_adapter)
ステップ1:
配列は次のようになります。あなたのヒントの最後のアイテム
例:private String [] yourArray = new String [] {"Staff"、 "Student"、 "Your Hint"};
ステップ2:
HintAdpater.Javaを作成します(コピーして貼り付けてください)
このクラスは最後の項目を返しません。したがって、ヒントは表示されません。
HintAdapter.Java
package ajax.com.vvcoe.utils;
import Android.content.Context;
import Android.widget.ArrayAdapter;
import Java.util.List;
public class HintAdapter extends ArrayAdapter<String> {
public HintAdapter(Context context, int resource) {
super(context, resource);
}
public HintAdapter(Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
}
public HintAdapter(Context context, int resource, String[] objects) {
super(context, resource, objects);
}
public HintAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
super(context, resource, textViewResourceId, objects);
}
public HintAdapter(Context context, int resource, List<String> objects) {
super(context, resource, objects);
}
public HintAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public int getCount() {
// don't display last item. It is used as hint.
int count = super.getCount();
return count > 0 ? count - 1 : count;
}
}
ステップ3:
このようにスピナーアダプターを設定します
HintAdapter hintAdapter=new HintAdapter(this,Android.R.layout.simple_list_item_1,yourArray);
yourSpinner.setAdapter(hintAdapter);
// show hint
yourSpinner.setSelection(hintAdapter.getCount());
クレジットはこの回答から@Yakiv Mospanに送られます- https://stackoverflow.com/a/22774285/3879847
一部の変更のみを変更します。
このように文字列配列の最終位置にヒントを作成しますCityはここのヒントです
array_city = new String[]{"Irbed", "Amman", "City"};
そして、アレイアダプタで
ArrayAdapter<String> adapter_city = new ArrayAdapter<String>(getContext(), Android.R.layout.simple_spinner_item, array_city) {
@Override
public int getCount() {
// to show hint "Select Gender" and dont able to select
return 2;
}
};
そのため、アダプターは最初の2つの項目だけを返し、最後にonCreate() methodまたはwhat、で、スピナーにヒントを選択させます
yourSpinner.setSelection(2);
トリックはこの行です
((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));
onItemSelectedで使用します。ここに、より多くのコンテキストを持つコードがあります
List<String> list = getLabels(); // First item will be the placeholder
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(mContext, Android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// First item will be gray
if (position == 0) {
((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));
} else {
((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.primary_text));
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
私が見つけた最も簡単な方法はこれでした:TextViewまたはLinearLayoutを作成し、RelativeLayoutにスピナーとともに配置します。最初、textviewには、「Select one ...」というヒントのようにテキストが表示されます。最初のクリック後、このTextViewは非表示になり、無効になり、その直後のSpinnerを呼び出します。
ステップ1:
スピナープットを見つけるactivity.xmlで:
<RelativeLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<Spinner
Android:id="@+id/sp_main"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:spinnerMode="dropdown" />
<LinearLayout
Android:id="@+id/ll_hint_spinner"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_centerInParent="true"
Android:gravity="center">
<TextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center"
Android:text="Select..."/>
</LinearLayout>
</RelativeLayout>
ステップ2:
Activity.Javaタイプで:
public class MainActivity extends AppCompatActivity {
private LinearLayout ll_hint_spinner;
private Spinner sp_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll_hint_spinner = findViewById(R.id.ll_hint_spinner);
sp_main = findViewById(R.id.sp_main);
//Action after clicking LinearLayout / Spinner;
ll_hint_spinner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//By clicking "Select ..." the Spinner is requested;
sp_main.performClick();
//Make LinearLayout invisible
setLinearVisibility(false);
//Disable LinearLayout
ll_hint_spinner.setEnabled(false);
//After LinearLayout is off, Spinner will function normally;
sp_main.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sp_main.setSelection(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
setLinearVisibility(true);
}
});
}
});
}
//Method to make LinearLayout invisible or visible;
public void setLinearVisibility(boolean visible) {
if (visible) {
ll_hint_spinner.setVisibility(View.VISIBLE);
} else {
ll_hint_spinner.setVisibility(View.INVISIBLE);
}
}
}
画像の例ではカスタムスピナーを使用しましたが、最後の例の結果は同じです。
注:githubに例があります: https://github.com/MurilloComino/Spinner_hint
ドロップダウンリストから省略された「ヒント」を追加することができました。コードが少し変に見えるのは、Xamarin.Androidを使用しているためです。C#で記述されていますが、すべての目的(heh)および目的でJavaと同等の効果があります。
要点は、GetDropDownViewメソッドのヒントであるかどうかを検出するカスタムArrayAdapterを作成したことです。その場合、空のXMLを膨張させて、ドロップダウンからヒントを隠します。
私のspinnerItem.xmlは...
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/spinnerText"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingLeft="@dimen/text_left_padding"
Android:textAppearance="?android:attr/textAppearanceLarge"/>
ヒントを隠す「空の」hintSpinnerDropdownItem.xml.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
ヒントなしでCustomObjの配列を渡します。そのため、親コンストラクタに渡される前にヒントを最初に挿入するための追加のAddPromptメソッドがあります。
public class CustomArrayAdapter: ArrayAdapter<CustomObj>
{
private const int HintPosition = 0;
private const CustomObj HintValue = null;
private const string Hint = "Hint";
public CustomArrayAdapter(Context context, int textViewResourceId, CustomObj[] customObjs) : base(context, textViewResourceId, AddPrompt(customObjs))
{
private static CustomObj[] AddPrompt(CustomObj[] customObjs)
{
CustomObj[] customObjsWithHint = new CustomObj[customObjs.Length + 1];
CustomObj[] hintPlaceholder = { HintValue };
Array.Copy(hintPlaceholder , customObjsWithHint , 1);
Array.Copy(customObjs, 0, customObjsWithHint , 1, customObjs.Length);
return customObjsWithHint ;
}
public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent)
{
CustomObj customObj = GetItem(position);
bool isHint = customObj == HintValue;
if (convertView == null)
{
convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
}
TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
textView.Text = isHint ? Hint : customObj.Value;
textView.SetTextColor(isHint ? Color.Gray : Color.Black);
return convertView;
public override Android.Views.View GetDropDownView(int position, Android.Views.View convertView, ViewGroup parent)
{
CustomObj customObj = GetItem(position);
if (position == HintPosition)
{
convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.hintSpinnerDropdownItem, parent, false);
}
else
{
convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
textView.Text = customObj.Value;
}
return convertView;
}
}
私のために働いたのは、最初のヒントを含むアイテムのリストでスピナーを設定することです。
final MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner);
spinner.setItems("Select something in this list", getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));
ユーザーがリスト内で実際に何かを選択したら、spinner.setItemsメソッドを使用して、ヒント以外のすべてにリストを設定します。
spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {
@Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
spinner.setItems(getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));
}
ユーザーがリストで何かを選択するとすぐに、ヒントは削除されます。