Android 纵向和横向保存状态

Android 纵向和横向保存状态,android,spinner,Android,Spinner,我已经看了各种各样的东西来尝试和解决这个问题,但是onCreate或其他东西缺少了一些东西 我可以在纵向和横向之间移动,没有问题,我甚至可以保存一些数据。我的问题在于某些纺纱机 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("NS1", ns1.getSelectedItemPosition()

我已经看了各种各样的东西来尝试和解决这个问题,但是onCreate或其他东西缺少了一些东西

我可以在纵向和横向之间移动,没有问题,我甚至可以保存一些数据。我的问题在于某些纺纱机

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("NS1", ns1.getSelectedItemPosition());
    outState.putInt("NS2", ns2.getSelectedItemPosition());
    outState.putInt("NS3", ns3.getSelectedItemPosition());
    outState.putInt("NS4", ns4.getSelectedItemPosition());
    outState.putInt("NS5", ns5.getSelectedItemPosition());
    outState.putInt("NS6", ns6.getSelectedItemPosition());
    outState.putInt("AS", announcespinner.getSelectedItemPosition());
    outState.putInt("FS", feastselectorspinner.getSelectedItemPosition());
    outState.putInt("CS", choirspinner.getSelectedItemPosition());
    outState.putInt("SS", saintspinner.getSelectedItemPosition());
    outState.putBoolean("AK", akonly.isChecked());
    outState.putBoolean("PK", pkonly.isChecked());

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){

    feastselectorspinner.setSelection(savedInstanceState.getInt("FS"));
    pkonly.setChecked(savedInstanceState.getBoolean("PK"));
    akonly.setChecked(savedInstanceState.getBoolean("AK"));

            //savedInstanceWait = false;
            //updateNewSongSpinners();
    ns1.setSelection(savedInstanceState.getInt("NS1"));
    ns2.setSelection(savedInstanceState.getInt("NS2"));
    ns3.setSelection(savedInstanceState.getInt("NS3"));
    ns4.setSelection(savedInstanceState.getInt("NS4"));
    ns5.setSelection(savedInstanceState.getInt("NS5"));
    ns6.setSelection(savedInstanceState.getInt("NS6"));

    saintspinner.setSelection(savedInstanceState.getInt("SS"));
    choirspinner.setSelection(savedInstanceState.getInt("CS"));
    announcespinner.setSelection(savedInstanceState.getInt("AS"));

}
它更新除nsx微调器之外的所有内容。我相信这与这些变化有关

如果选中/取消选中pkonly或akonly复选框,或在feastselectorspinner中选择其他选择,则nsx微调器将根据下面执行的数据库查询进行调整

private void updateNewSongSpinners(){
    if(!savedInstanceWait){
        db = new DatabaseHandler(Announcer.this);
        List<NewSong> listnewsong = db.getAkOrPkOrFeastSongs(akonly.isChecked(), pkonly.isChecked(), feastselectorspinner.getSelectedItem().toString());
        List<String> list = new ArrayList<String>();
        String t;
        list.add("Select New Song");
        for(NewSong lns : listnewsong){
            t = "";
            if(lns.getSongNum() < 10){
                t = "00";
            }else if(lns.getSongNum() < 100){
                t = "0";
            }
            t += Integer.toString(lns.getSongNum()) + " " + lns.getSongTitle();
            list.add(t);
        }

        ArrayAdapter<String> adapter  = new ArrayAdapter<String>(Announcer.this, R.layout.list_item, list);
        adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item);

        //reset all spinners
        ns1.setAdapter(adapter);
        ns2.setAdapter(adapter);
        ns3.setAdapter(adapter);
        ns4.setAdapter(adapter);
        ns5.setAdapter(adapter);
        ns6.setAdapter(adapter);
    }
}
private void updateNewSongSpinners(){
如果(!savedInstanceWait){
db=新的数据库处理程序(Announcer.this);
List listnewsong=db.getakorpkorfeaststongs(akonly.isChecked()、pkonly.isChecked()、feastselectorspinner.getSelectedItem().toString());
列表=新的ArrayList();
字符串t;
列表。添加(“选择新歌”);
对于(新闻歌曲lns:listnewsong){
t=“”;
if(lns.getSongNum()<10){
t=“00”;
}else if(lns.getSongNum()<100){
t=“0”;
}
t+=Integer.toString(lns.getSongNum())+“”+lns.getSongTitle();
列表。添加(t);
}
ArrayAdapter=新的ArrayAdapter(Announcer.this,R.layout.list_项,list);
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
//重置所有微调器
ns1.设置适配器(适配器);
ns2.设置适配器(适配器);
ns3.设置适配器(适配器);
ns4.设置适配器(适配器);
ns5.设置适配器(适配器);
ns6.设置适配器(适配器);
}
}
我缺少的是阻止nsx微调器返回其保存位置的内容。检索到的NS1…NS6值是正确的数字。我无法调试它,因为当我在纵向和横向之间切换时,它不会在我的手机和仿真器上进行调试,仿真器不会做任何事情

savedInstanceWait用于查看是否存在竞争条件。我找不到

我不知所措。显然,正在onRestoreInstanceState()之后调用feastselectorspinner onClick()。这导致旋转器明显复位。我不知道为什么feastselectorspinner调用了它的函数,而其他的函数都没有重置它们的字段,但无论如何。下面是修复程序,我仍然想知道为什么它在restore()之后调用onclick()

private void updateNewSongSpinners(){
字符串str1、str2、str3、str4、str5、str6;
str1=ns1.getSelectedItem().toString();
str2=ns2.getSelectedItem().toString();
str3=ns3.getSelectedItem().toString();
str4=ns4.getSelectedItem().toString();
str5=ns5.getSelectedItem().toString();
str6=ns6.getSelectedItem().toString();
db=新的数据库处理程序(Announcer.this);
List listnewsong=db.getakorpkorfeaststongs(akonly.isChecked()、pkonly.isChecked()、feastselectorspinner.getSelectedItem().toString());
列表=新的ArrayList();
字符串t;
列表。添加(“选择新歌”);
对于(新闻歌曲lns:listnewsong){
t=“”;
if(lns.getSongNum()<10){
t=“00”;
}else if(lns.getSongNum()<100){
t=“0”;
}
t+=Integer.toString(lns.getSongNum())+“”+lns.getSongTitle();
列表。添加(t);
}
ArrayAdapter=新的ArrayAdapter(Announcer.this,R.layout.list_项,list);
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
//重置所有微调器
ns1.设置适配器(适配器);
ns2.设置适配器(适配器);
ns3.设置适配器(适配器);
ns4.设置适配器(适配器);
ns5.设置适配器(适配器);
ns6.设置适配器(适配器);
//如果可用,保留以前选择的歌曲
对于(int i=0;i
您不应该先设置适配器,然后再设置选择吗?从你发布的代码中不清楚先做什么。我试过了。pkonly、akonly和feastselectorspinner都调用updateNewSongSpinners()。我甚至尝试手动调用updateNewSongSpinners(),但由于无效,我将其注释掉了。另外,我添加这一行只是为了增加更多的混淆realTime.setText(String.valueOf(savedInstanceState.getInt(“NS1”)+“”+String.valueOf(NS1.getCount());结果是一个带有“21 472”的文本框,因此微调器中有多个值,我知道要转到哪个值,但没有转到哪个值。老实说,我不知道是什么原因导致了这一点,我甚至运行了另一个字符串输出,显然,在onRestoreInstanceState()之后,feastselectorspinner onClick()正在激活。我不知道为什么。但因为它被调用,所以会重置微调器。这是一个很好的解决方案,因为它对项目更有利。在updateNewSongSpinners()中,我记得当前所选歌曲的位置,然后记录新列表,如果列表包含在保留之前选择的歌曲,则无需重置该字段。
private void updateNewSongSpinners(){
    String str1, str2, str3, str4, str5, str6;

    str1 = ns1.getSelectedItem().toString();
    str2 = ns2.getSelectedItem().toString();
    str3 = ns3.getSelectedItem().toString();
    str4 = ns4.getSelectedItem().toString();
    str5 = ns5.getSelectedItem().toString();
    str6 = ns6.getSelectedItem().toString();


    db = new DatabaseHandler(Announcer.this);
    List<NewSong> listnewsong = db.getAkOrPkOrFeastSongs(akonly.isChecked(), pkonly.isChecked(), feastselectorspinner.getSelectedItem().toString());
    List<String> list = new ArrayList<String>();
    String t;
    list.add("Select New Song");
    for(NewSong lns : listnewsong){
        t = "";
        if(lns.getSongNum() < 10){
            t = "00";
        }else if(lns.getSongNum() < 100){
            t = "0";
        }
        t += Integer.toString(lns.getSongNum()) + " " + lns.getSongTitle();
        list.add(t);
    }

    ArrayAdapter<String> adapter  = new ArrayAdapter<String>(Announcer.this, R.layout.list_item, list);
    adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item);

    //reset all spinners
    ns1.setAdapter(adapter);
    ns2.setAdapter(adapter);
    ns3.setAdapter(adapter);
    ns4.setAdapter(adapter);
    ns5.setAdapter(adapter);
    ns6.setAdapter(adapter);

    //if available keep previously chosen song
    for(int i = 0; i < list.size(); i++){
        if(list.get(i).equals(str1)) ns1.setSelection(i);
        if(list.get(i).equals(str2)) ns2.setSelection(i);
        if(list.get(i).equals(str3)) ns3.setSelection(i);
        if(list.get(i).equals(str4)) ns4.setSelection(i);
        if(list.get(i).equals(str5)) ns5.setSelection(i);
        if(list.get(i).equals(str6)) ns6.setSelection(i);
    }
}