如何在XML中的微调器中添加提示

时间:2016-05-04 06:20:01

标签: android xml spinner android-spinner

我正在尝试在微调器窗口小部件中添加一个提示,因为在EditText中没有Hint选项,我想将性别显示为提示,单击时它必须只显示男性和女性而不是提示。

如何只使用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>

16 个答案:

答案 0 :(得分:36)

在适配器中,您可以将第一项设置为已禁用。以下是示例代码

ADDED: [Salami  2   3   4   ]
ADDED: [Fish    1   6   2   ]
ADDED: [Jerky   3   1   6   ]
Print Array: []
Print Array string:

将第一项设置为灰色。

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

有关详细信息,请参阅以下链接。

How to add a hint to Spinner in Android

答案 1 :(得分:9)

有两种方法可以使用微调器:

静态方式

android:spinnerMode="dialog"

然后设置:

android:prompt="@string/hint_resource"

动态方式

spinner.setPrompt("Gender");

注意:它会像提示一样工作但实际上不是。

愿它有所帮助!

答案 2 :(得分:5)

这可以通过一种非常简单的方式完成。而不是使用内置值(android.R.layout.simple_list_item_1)设置适配器,为TextView和DropDown创建自己的xml布局,并使用它们。在TextView布局中,定义提示文本和提示颜色。最后一步,创建并清空项目作为字符串中定义的项目数组中的第一项。

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

答案 3 :(得分:3)

第1步:

你的阵列看起来像。最后一项你的提示

Ex:private String [] yourArray = new String [] {&#34; Staff&#34;,&#34; Student&#34;,&#34; Your Hint&#34;};

第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

我只修改了一些更改..

答案 4 :(得分: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) {
            }
        });

答案 5 :(得分:2)

对于Kotlin!

自定义阵列适配器以隐藏微调器的最后一项

 import android.content.Context
 import android.widget.ArrayAdapter
 import android.widget.Spinner

 class HintAdapter<T>(context: Context, resource: Int, objects: Array<T>) :
    ArrayAdapter<T>(context, resource, objects) {

    override fun getCount(): Int {
        val count = super.getCount()
        // The last item will be the hint.
        return if (count > 0) count - 1 else count
    }
}

Spinner Extension功能可在微调器上设置提示

fun Spinner.addHintWithArray(context: Context, stringArrayResId: Int) {
    val hintAdapter =
        HintAdapter<String>(
            context,
            android.R.layout.simple_spinner_dropdown_item,
            context.resources.getStringArray(stringArrayResId)
        )
    hintAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    adapter = hintAdapter
    setSelection(hintAdapter.count)
}

使用方法:通过在Spinner上传递上下文和数组来添加扩展名

spinnerMonth.addHintWithArray(context, R.array.months)

注意:提示应该是字符串数组的最后一项

<string-array name="months">
    <item>Jan</item>
    <item>Feb</item>
    <item>Mar</item>
    <item>Apr</item>
    <item>May</item>
    <item>Months</item>
</string-array>

答案 6 :(得分:1)

像这样在字符串数组中的最终位置发出提示 城市是这里的提示

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

因此适配器仅返回前两个项目 最后在 onCreate()方法或什么方法中,使Spinner选择提示

yourSpinner.setSelection(2);

答案 7 :(得分:1)

我发现的最简单的方法是: 创建一个TextView或LinearLayout并将其与微调器一起放置在RelativeLayout中。最初,textview的文本就像是提示“选择一个...”一样,在第一次单击后,此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);
        }
    }
}

Example1 SameExample2 SameExample3

我使用自定义微调器的图像示例,但是最后一个示例的结果是相同的。

注意:我在github中有一个示例:https://github.com/MurilloComino/Spinner_hint

答案 8 :(得分:0)

对我来说有用的是你会为你的微调器设置一个项目列表,包括开头的提示。

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

}

一旦用户选择列表中的内容,就会删除提示。

答案 9 :(得分:0)

您可以设置微调框提示:

spinner.setPrompt("Select gender...");

答案 10 :(得分:0)

我设法添加了一个从下拉列表中省略的“提示”。如果我的代码看起来有些怪异,那是因为我使用的是Xamarin.Android,所以它在C#中使用,但是对于所有意图(嘿)和目的,Java等效项都应具有相同的效果。

要点是,我创建了一个自定义ArrayAdapter,它将检测它是否是GetDropDownView方法中的提示。如果是这样,那么它将为空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;
    }
}

答案 11 :(得分:0)

步骤1.使用activity_layout.xml创建布局

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    tools:context=".MainActivity"
    android:background="#9C1AB1"
    >
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:padding="20dp"
        android:layout_centerInParent="true"
        android:layout_height="wrap_content"
        />
</RelativeLayout>

第2步。使用布局item_spinner.xml在android中自定义布局项目微调框

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textStyle="italic"
    android:fontFamily="sans-serif-medium"
    />

9月3日。创建类MainActivity .class

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        // Initializing a String Array
        String[] plants = new String[]{
                "Select an item...",
                "California sycamore",
                "Mountain mahogany",
                "Butterfly weed",
                "Carrot weed"
        };
}
}

请参阅下面的链接以获取详细信息。

How to add a hint to Spinner in Android

答案 12 :(得分:0)

如果位置为“ 0”,则非常简单,然后在OnItemSelectedListener中调用onNothingSelected方法。对我来说很好。

      spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            **if (position == 0)
            {
                onNothingSelected(parent);
            }**
            else {

                String mechanicType = mechanicTpes[position];
                Toast.makeText(FirstUser.this, "Mechanic Tpye : "+mechanicType, Toast.LENGTH_SHORT).show();
            }




        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            Toast.makeText(FirstUser.this, "NOTHING SELECTED IN SPINNER", Toast.LENGTH_SHORT).show();


        }
    });

答案 13 :(得分:0)

科特林

您会得到什么:

Gray color if the hint is selected

Drop down list with gray color of the hint

Black color if something else than the hint is selected

我添加了5.步骤,根据选定的项目更改微调器中文本的颜色,因为我在这里找不到它。在这种情况下,选择第一个项目时,需要将文本颜色更改为灰色,以使其看起来像提示。

  1. 在您的 activity_layout.xml

    中定义一个微调框
    <Spinner
        android:id="@+id/mySpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
  2. string.xml 中定义字符串数组,其中第一项将成为提示。

    <string-array name="your_string_array">
        <item>Hint...</item>
        <item>Item1</item>
        <item>Item2</item>
        <item>Item3</item>
    </string-array>
    
  3. 在您的 Activity.kt

    中的 onCreate 方法中设置微调器

    从资源获取字符串数组

        val items= resources.getStringArray(R.array.your_string_array)
    

    创建微调器适配器

        val spinnerAdapter= object : ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, items) {
    
        override fun isEnabled(position: Int): Boolean {
            // Disable the first item from Spinner
            // First item will be use for hint
            return position != 0
        }
    
        override fun getDropDownView(
            position: Int,
            convertView: View?,
            parent: ViewGroup
        ): View {
            val view: TextView = super.getDropDownView(position, convertView, parent) as TextView
            //set the color of first item in the drop down list to gray
            if(position == 0) {
                view.setTextColor(Color.GRAY)
            } else {
                //here is it possible to define color for other items by
                //view.setTextColor(Color.RED)
            }
            return view
        }
    
    }
    
  4. 设置下拉视图资源,并将适配器连接到微调器。

    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)     
    mySpinner.adapter = spinnerAdapter
    
  5. 根据所选项目更改微调器中文本的颜色

    mySpinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener{
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }
    
        override fun onItemSelected(
            parent: AdapterView<*>?,
            view: View?,
            position: Int,
            id: Long
        ) {
            val value = parent!!.getItemAtPosition(position).toString()
            if(value == items[0]){
                (view as TextView).setTextColor(Color.GRAY)
            }
        }
    
    }
    

答案 14 :(得分:-2)

如果您的 Spinner 不支持android:提示,请改用android.support.v7.widget.AppCompatSpinner。

<android.support.v7.widget.AppCompatSpinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:prompt="Gender" />

答案 15 :(得分:-4)

尝试使用以下属性:

android:prompt="Gender"