我的应用第一个所做的是通过设置其可见性ListView
来加载其项目隐身CheckBoxes
的{{1}}。当用户选中菜单按钮时,它将打开和关闭View.Gone
可见性和其他一些布局。下面是代码,我删除了一些不必要的部分:
CheckBox
它工作正常,但问题是当屏幕旋转时应用程序不起作用(更改屏幕方向)。一切都很好,因为它显示了一些布局,但只有private void editmodeSwitch(boolean flag){
// get topbar, bottombar, and bottombar2
LinearLayout topbar = (LinearLayout) findViewById(R.id.task_topbar_linearLayout);
LinearLayout bottombar = (LinearLayout) findViewById(R.id.task_bottombar1_linearlayout);
LinearLayout bottombar2 = (LinearLayout) findViewById(R.id.task_bottombar2_linearlayout);
if(flag){
isEditmodeOn = true;
// make topbar and bottombar2 visilble, but bottombar gone
topbar.setVisibility(View.VISIBLE);
bottombar.setVisibility(View.GONE);
bottombar2.setVisibility(View.VISIBLE);
// make checkboxes visible in listview visible as well
for(int i=0; i<listView.getChildCount(); i++){
LinearLayout ll = (LinearLayout) listView.getChildAt(i);
CheckBox cb = (CheckBox) ll.findViewById(R.id.task_row_checkBox1);
cb.setVisibility(View.VISIBLE);
}
}
else{
isEditmodeOn = false;
topbar.setVisibility(View.GONE);
bottombar.setVisibility(View.VISIBLE);
bottombar2.setVisibility(View.GONE);
// set each checkbox false and its visibility gone
for(int i=0; i<listView.getChildCount(); i++){
LinearLayout ll = (LinearLayout) listView.getChildAt(i);
CheckBox cb = (CheckBox) ll.findViewById(R.id.task_row_checkBox1);
cb.setVisibility(View.GONE);
cb.setChecked(false);
}
}
}
onCreate()`:
CheckBoxes in list items. Below is the code in
我猜测最后加载了@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.task_layout);
initialize();
loadDB();
updateListAdapter(list_title, list_date);
// in case of screen rotation
if(savedInstanceState != null){
isEditmodeOn = savedInstanceState.getBoolean(EDITMODE_CHECK);
isItemChecked = savedInstanceState.getBoolean(ITEM_CHECK);
if(isEditmodeOn){
if(!isItemChecked){
Log.i(tag, "item NOT checked");
editmodeSwitch(true);
} else{
//this is something different so please don't mind
deditmodeSwitch(savedInstanceState.getBooleanArray(LIST_CB_CHECK));
}
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save values for rotation
outState.putBoolean(EDITMODE_CHECK, isEditmodeOn);
outState.putBoolean(ITEM_CHECK, isItemChecked);
outState.putBooleanArray(LIST_CB_CHECK, list_cb_check);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(tag, "you're in onRestoreInstanceState()");
// in case of screen rotation
if(savedInstanceState != null){
isEditmodeOn = savedInstanceState.getBoolean(EDITMODE_CHECK);
isItemChecked = savedInstanceState.getBoolean(ITEM_CHECK);
if(isEditmodeOn){
if(!isItemChecked){
Log.i(tag, "item NOT checked");
editmodeSwitch(true);
} else{
// this is for something else so please ignore this part
editmodeSwitch(savedInstanceState.getBooleanArray(LIST_CB_CHECK));
}
}
}
。因此,即使ListView
中的代码使onCreate()
可见,CheckBoxes
也会再次变为不可见,因为它在xml中的初始化将会这样做。但是,我被困在这里,需要你的建议来解决这个问题。任何人都可以帮助我吗?
以下是getview的布局xml文件的复选框代码。
CheckBoxes
答案 0 :(得分:1)
覆盖onSaveInstanceState
以节省屏幕轮值,onRestoreInstanceState
为:
protected void onCreate(Bundle savedInstanceState) {
if(null != savedInstanceState)
{
Boolean IntTest = savedInstanceState.getBoolean("ITEM_CHECK");
Boolean StrTest = savedInstanceState.getBoolean("ITEM_CHECK");
Log.e(TAG, "onCreate get the savedInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save away the CheckBoxes states, so we still have it if the activity
// needs to be killed while paused.
savedInstanceState.putBoolean(EDITMODE_CHECK, 0);
savedInstanceState.putBoolean(ITEM_CHECK, 0);
super.onSaveInstanceState(savedInstanceState);
Log.e(TAG, "onSaveInstanceState");
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Boolean IntTest = savedInstanceState.getBoolean(EDITMODE_CHECK);
Boolean StrTest = savedInstanceState.getBoolean(ITEM_CHECK);
Log.e(TAG, "onRestoreInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);
}
答案 1 :(得分:0)
与覆盖onCreate的方式类似,您可以覆盖onConfigurationChanged(...),您可以设置在屏幕更改方向时运行。
为了在屏幕旋转时触发OnConfigurationChanged(...),您需要编辑清单并将该关系/规则放入。
这很容易做,但需要一些解释,之前在这个问题中得到了解答: Activity restart on rotation Android
编辑:这是关于如何处理配置更改的开发指南 http://developer.android.com/guide/topics/resources/runtime-changes.html
编辑#2:首先,让我建议使用Imran的解决方案。它更好地遵循开发者指南,最终结果将是相同的。
现在,对于onConfigurationChanged解决方案。
看看你在onCreate上做了什么:
1)设置视图。 (此时隐藏了复选框。对吧?)
2)调用您的数据库并确定是否应显示复选框(编辑模式)
3)使所有复选框都可见。
现在,onConfigurationChanged也会调用setContentView,此时会再次隐藏所有复选框。因此,您需要重复使复选框可见的过程(上面的#3)。您可能不需要重复步骤#2,因为应保留该值,但我不确定您的应用程序的逻辑是如何工作的,因此可能需要重新执行步骤#2
这有意义吗?
答案 2 :(得分:0)
根据我的经验,getview似乎在最后被触发,这就是为什么'onRestoreInstanceState()'和'onConfigurationChanged()'无法使它成为getview将重置我的复选框在布局xml文件中初始化时不可见。
因此,我能找到的唯一解决方案是我必须在getview中控制它们以获得答案。