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