Oli*_*Oli 59 android android-spinner
我试图让Spinner加载没有选定的值.一旦用户选择了一个值,它就会将它们带到另一个页面.
这被证明是一个问题,因为目前,页面只是在用户选择之前立即加载.
我的微调器类的设置方式与Google的相同:http://developer.android.com/resources/tutorials/views/hello-spinner.html
所以基本上,是否有可能有一个微调器加载没有选择,因为目前,它加载我的字符串数组中的第一个项目.
Com*_*are 81
是否可能有一个没有选择加载的微调器
只有没有数据.如果您有1个以上的项目SpinnerAdapter,Spinner将始终有一个选择.
Spinners不是设计为命令小部件.用户不希望选择a Spinner来启动活动.请考虑使用其他内容,例如a ListView或GridView,而不是a Spinner.
编辑
顺便说一下,我忘了提一下 - 你总是可以在你的适配器中添加一个代表"没有选择"的额外条目,并将其作为初始选中的项目Spinner.
小智 29
或者,您可以覆盖您的微调器适配器,并为getView方法中的位置0提供空视图,并在getDropDownView方法中提供高度为0dp的视图.
这样,你有一个初始文本,例如"选择一个选项......",它在首次加载微调器时显示,但它不是用户选择的选项(技术上是这样,但因为高度为0) ,他们看不到它.
Jon*_*nik 20
这是Paul Bourdeaux的想法的完整实现,即返回getView()位置0 的特殊初始视图(或空视图).
它对我有用,而且相对简单.您可能会考虑这种方法,尤其是如果您已经为Spinner 设置了自定义适配器.(在我的例子中,我使用自定义适配器,以便轻松自定义项目的布局,每个项目都有几个TextView.)
适配器将是这些行:
public class MySpinnerAdapter extends ArrayAdapter<MyModel> {
public MySpinnerAdapter(Context context, List<MyModel> items) {
super(context, R.layout.my_spinner_row, items);
}
@Override
public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) {
if (position == 0) {
return initialSelection(true);
}
return getCustomView(position, convertView, parent);
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
if (position == 0) {
return initialSelection(false);
}
return getCustomView(position, convertView, parent);
}
@Override
public int getCount() {
return super.getCount() + 1; // Adjust for initial selection item
}
private View initialSelection(boolean dropdown) {
// Just an example using a simple TextView. Create whatever default view
// to suit your needs, inflating a separate layout if it's cleaner.
TextView view = new TextView(getContext());
view.setText(R.string.select_one);
int spacing = getContext().getResources().getDimensionPixelSize(R.dimen.spacing_smaller);
view.setPadding(0, spacing, 0, spacing);
if (dropdown) { // Hidden when the dropdown is opened
view.setHeight(0);
}
return view;
}
private View getCustomView(int position, View convertView, ViewGroup parent) {
// Distinguish "real" spinner items (that can be reused) from initial selection item
View row = convertView != null && !(convertView instanceof TextView)
? convertView :
LayoutInflater.from(getContext()).inflate(R.layout.my_spinner_row, parent, false);
position = position - 1; // Adjust for initial selection item
MyModel item = getItem(position);
// ... Resolve views & populate with data ...
return row;
}
}
Run Code Online (Sandbox Code Playgroud)
而已.请注意,如果您OnItemSelectedListener在Spinner中使用a,则onItemSelected()还需要调整position以将默认项目考虑在内,例如:
if (position == 0) {
return;
} else {
position = position - 1;
}
MyModel selected = items.get(position);
Run Code Online (Sandbox Code Playgroud)
在我的情况下,虽然在微调器中显示大小'2',但在完成某些选择之前没有任何反应!
我有一个xml文件(data_sizes.xml),它列出了所有微调器值.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="chunks">
<item>2</item>
<item>4</item>
<item>8</item>
<item>16</item>
<item>32</item>
</string-array>
</resources>
Run Code Online (Sandbox Code Playgroud)
在main.xml文件中:Spinner元素
<Spinner android:id="@+id/spinnerSize"
android:layout_marginLeft="50px"
android:layout_width="fill_parent"
android:drawSelectorOnTop="true"
android:layout_marginTop="5dip"
android:prompt="@string/SelectSize"
android:layout_marginRight="30px"
android:layout_height="35px" />
Run Code Online (Sandbox Code Playgroud)
然后在我的java代码中,我添加了:
在我的活动中:宣言
Spinner spinnerSize;
ArrayAdapter adapter;
Run Code Online (Sandbox Code Playgroud)
在public void函数中 - initControls():Definition
spinnerSize = (Spinner)findViewById(R.id.spinnerSize);
adapter = ArrayAdapter.createFromResource(this, R.array.chunks, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerSize.setAdapter(adapter);
spinnerSize.setOnItemSelectedListener(new MyOnItemSelectedListener());
Run Code Online (Sandbox Code Playgroud)
我的旋转听众:
/*Spinner Listener*/
class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
chunkSize = new Integer(parent.getItemAtPosition(pos).toString()).intValue();
}
public void onNothingSelected(AdapterView<?> parent) {
// Dummy
}
}
Run Code Online (Sandbox Code Playgroud)
使用如下所示的自定义微调器布局:
<?xml version="1.0" encoding="utf-8"?>
<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerTarget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14dp"
android:textColor="#000000"/>
Run Code Online (Sandbox Code Playgroud)
活动中:
// populate the list
ArrayList<String> dataList = new ArrayList<String>();
for (int i = 0; i < 4; i++) {
dataList.add("Item");
}
// set custom layout spinner_layout.xml and adapter
Spinner spinnerObject = (Spinner) findViewById(R.id.spinnerObject);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, R.drawable.spinner_layout, dataList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerObject.setAdapter(dataAdapter);
spinnerObject.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// to set value of first selection, because setOnItemSelectedListener will not dispatch if the user selects first element
TextView spinnerTarget = (TextView)v.findViewById(R.id.spinnerTarget);
spinnerTarget.setText(spinnerObject.getSelectedItem().toString());
return false;
}
});
spinnerObject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
private boolean selectionControl = true;
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// just the first time
if(selectionControl){
// find TextView in layout
TextView spinnerTarget = (TextView)parent.findViewById(R.id.spinnerTarget);
// set spinner text empty
spinnerTarget.setText("");
selectionControl = false;
}
else{
// select object
}
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119512 次 |
| 最近记录: |