我有一个微调器,可以在值更改时启动第二个活动。这很好用。
返回后一切正常。但如果我现在旋转移动OnItemSelectedListener被调用!为什么?微调器应位于-1位置。这意味着不会调用回调。
android如何知道选择了哪个微调器项目?我试图通过向基类发送savedInstanceState的null值来预先恢复此信息。
以下是一些代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
setContentView(R.layout.menu);
String db=MyDatabase.getData();
if(db == null)
db="";
Spinner spinner=(Spinner)findViewById(R.id.spinner);
MyAdapter adapter=new MyAdapter(this, db, "ID", "Name");
spinner.setAdapter(adapter);
adapter.setHint(spinner, "Please select...");
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id2) {
int id=((SpinnerItem)parent.getAdapter().getItem(position)).getId();
Intent intent=new Intent();
intent.setClass(MainMenu.this, Other.class);
intent.putExtra("id", id);
startActivity(intent);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
这是我的适配器:
public class MyAdapter extends ArrayAdapter<SpinnerItem> {
private final Context context;
private String hint;
public MyAdapter(Context context, String input, String key, String value) {
super(context, android.R.layout.simple_spinner_item, create(input, key, value));
this.context=context;
}
private static SpinnerItem[] create(String input, String key, String value) {
Vector<SpinnerItem> list=new Vector<SpinnerItem>();
// fill the list
return list.toArray(new SpinnerItem[] {});
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// show the hint
if(position == -1) {
TextView tv=new TextView(context);
tv.setTextColor(Color.DKGRAY);
tv.setText(hint);
return tv;
}
return super.getView(position, convertView, parent);
}
public void setHint(Spinner spinner, String hint) {
if(spinner.getAdapter() == null) {
throw new IllegalStateException("Set your adapter first!");
}
this.hint=hint;
try {
final Method m=AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt", int.class);
m.setAccessible(true);
m.invoke(spinner, -1);
final Method n=AdapterView.class.getDeclaredMethod("setSelectedPositionInt", int.class);
n.setAccessible(true);
n.invoke(spinner, -1);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
答案 0 :(得分:1)
当您旋转设备时,您的Activity会重新启动或重新创建,将此行添加到活动代码中的AndroidManifest文件中以避免它。
android:configChanges="keyboardHidden|orientation"
答案 1 :(得分:1)
更改方向时,onCreate()
的活动会被调用。
和 作为创建活动时微调器的方法onItemSelectedListener() get called
的微调器的行为。
在这种情况下发生了这种情况
此处给出了此类问题的解决方案StackOverflow Question's Link 通过采用两个计数器 checkBoxCounter and checkBoxInitialized
来检查他是如何处理此问题的,并尝试在您的情况下实施相同的。