纺纱工如何知道它的价值?

时间:2011-10-19 10:48:56

标签: android spinner rotation

我有一个微调器,可以在值更改时启动第二个活动。这很好用。

返回后一切正常。但如果我现在旋转移动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);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

当您旋转设备时,您的Activity会重新启动或重新创建,将此行添加到活动代码中的AndroidManifest文件中以避免它。

android:configChanges="keyboardHidden|orientation"

答案 1 :(得分:1)

更改方向时,onCreate()的活动会被调用。

默认情况下

作为创建活动时微调器的方法onItemSelectedListener() get called的微调器的行为。

在这种情况下发生了这种情况

此处给出了此类问题的解决方案StackOverflow Question's Link 通过采用两个计数器 checkBoxCounter and checkBoxInitialized来检查他是如何处理此问题的,并尝试在您的情况下实施相同的。