我正在尝试在微调器窗口小部件中添加一个提示,因为在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>
答案 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;
}
有关详细信息,请参阅以下链接。
答案 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"
};
}
}
请参阅下面的链接以获取详细信息。
答案 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.步骤,根据选定的项目更改微调器中文本的颜色,因为我在这里找不到它。在这种情况下,选择第一个项目时,需要将文本颜色更改为灰色,以使其看起来像提示。
在您的 activity_layout.xml
中定义一个微调框<Spinner
android:id="@+id/mySpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
在 string.xml 中定义字符串数组,其中第一项将成为提示。
<string-array name="your_string_array">
<item>Hint...</item>
<item>Item1</item>
<item>Item2</item>
<item>Item3</item>
</string-array>
在您的 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
}
}
设置下拉视图资源,并将适配器连接到微调器。
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
mySpinner.adapter = spinnerAdapter
根据所选项目更改微调器中文本的颜色
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"