web-dev-qa-db-ja.com

XMLのスピナーにヒントを追加する方法

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>
41
A-JaY

アダプタでは、最初の項目を無効に設定できます。以下はサンプルコードです

@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();
    }
}

詳細については、以下のリンクを参照してください。

AndroidでSpinnerにヒントを追加する方法

41
Dotnetpickles

スピナーを使用する方法は2つあります。

静的な方法

Android:spinnerMode="dialog"

そして設定:

Android:Prompt="@string/hint_resource"

動的な方法

spinner.setPrompt("Gender");

注:ヒントのように機能しますが、実際には機能しません。

助けてください!

10
Saurabh Vardani

これは非常に簡単な方法で行うことができます。組み込み値(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)
7

ステップ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

一部の変更のみを変更します。

3
Ranjith Kumar

このように文字列配列の最終位置にヒントを作成します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);
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) {
            }
        });
2
David Rearte

私が見つけた最も簡単な方法はこれでした: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);
        }
    }
}

例1同じ例2同じ例

画像の例ではカスタムスピナーを使用しましたが、最後の例の結果は同じです。

注:githubに例があります: https://github.com/MurilloComino/Spinner_hint

1
Murillo Comino

ドロップダウンリストから省略された「ヒント」を追加することができました。コードが少し変に見えるのは、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;
    }
}
0
Patrick Ma

私のために働いたのは、最初のヒントを含むアイテムのリストでスピナーを設定することです。

    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));

}

ユーザーがリストで何かを選択するとすぐに、ヒントは削除されます。

0
Simon