Android 微调器如何知道其值?

Android 微调器如何知道其值?,android,spinner,rotation,Android,Spinner,Rotation,我有一个微调器,它在值更改时启动第二个活动。这很有效 回来后一切都很好。但是如果我现在旋转手机,就会调用OnItemSelectedListener!为什么?微调器应位于位置-1。这意味着不会调用回调 android如何知道选择了哪个微调器项?我试图通过向基类发送savedInstanceState的空值来恢复此信息 下面是一些代码: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(nu

我有一个微调器,它在值更改时启动第二个活动。这很有效

回来后一切都很好。但是如果我现在旋转手机,就会调用OnItemSelectedListener!为什么?微调器应位于位置-1。这意味着不会调用回调

android如何知道选择了哪个微调器项?我试图通过向基类发送savedInstanceState的空值来恢复此信息

下面是一些代码:

@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) {
        }
    });
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(null);
setContentView(R.layout.menu);
String db=MyDatabase.getData();
if(db==null)
db=”“;
微调器微调器=(微调器)findViewById(R.id.Spinner);
MyAdapter=新的MyAdapter(这个,db,“ID”,“Name”);
旋转器。设置适配器(适配器);
adapter.setHint(微调器,“请选择…”);
spinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共位置(AdapterView父对象、视图、整型位置、长id2){
int id=((SpinnerItem)parent.getAdapter().getItem(position)).getId();
意图=新意图();
intent.setClass(main menu.this,Other.class);
意向。额外(“id”,id);
星触觉(意向);
}
@凌驾
未选择公共无效(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);
        }
    }
}
公共类MyAdapter扩展了ArrayAdapter{
私人最终语境;
私有字符串提示;
公共MyAdapter(上下文上下文、字符串输入、字符串键、字符串值){
super(context,android.R.layout.simple_微调器_项,创建(输入,键,值));
this.context=context;
}
私有静态SpinnerItem[]创建(字符串输入、字符串键、字符串值){
向量列表=新向量();
//填写清单
返回列表。toArray(新喷丝头项[]{});
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//暗示
如果(位置==-1){
TextView tv=新的TextView(上下文);
tv.setTextColor(Color.DKGRAY);
tv.setText(提示);
返回电视;
}
返回super.getView(position、convertView、parent);
}
公共void设置提示(微调器微调器、字符串提示){
if(spinner.getAdapter()==null){
抛出新的IllegalStateException(“首先设置适配器!”);
}
this.hint=hint;
试一试{
最终方法m=AdapterView.class.getDeclaredMethod(“setNextSelectedPositionInt”,int.class);
m、 setAccessible(true);
m、 调用(微调器,-1);
最终方法n=AdapterView.class.getDeclaredMethod(“setSelectedPositionInt”,int.class);
n、 setAccessible(true);
n、 调用(微调器,-1);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
}

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

android:configChanges="keyboardHidden|orientation"

当您更改方向时将调用活动的
onCreate()

默认情况下,作为微调器的行为,在创建活动时,会调用微调器的方法
onItemSelectedListener()

因此,在这种情况下,这种情况会发生在您身上


此处给出了此类问题的解决方案检查他是如何通过使用两个计数器处理问题的
checkBoxCounter和checkBoxInitialized
,并尝试在您的案例中实施相同的方法。

您能否进一步说明,无法获得您想要的内容。@Lalit Poptani当我返回到第一个活动并旋转手机时,
OnItemSelectedListener
被称为“我不想要的”,我会检查一下。但是如何在旋转时重置微调器?我的初始状态和文本请选择就足够了。您可以将位置存储在变量中,然后使用微调器方法sp.setSelection(位置);