1

我的应用程序首先要做的是通过设置可见性来加载不可见ListView的项目。当用户点击菜单按钮时,它将打开和关闭可见性和其他一些布局。下面是代码,我删除了一些不必要的部分:CheckBoxesView.GoneCheckBox

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);
        }
    }
}

它工作正常,但问题是屏幕旋转时应用程序不起作用(更改屏幕方向)。一切正常,因为它显示了一些布局,但只有CheckBoxes in list items. Below is the code inonCreate()`:

@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正在加载。因此,即使 in 中的代码onCreate()可见CheckBoxes,它CheckBoxes也会再次变为不可见,因为它在 xml 中的初始化将这样做。但是,我被困在这里,需要您的建议来解决这个问题。谁能帮我?

以防万一,下面是 getview 的布局 xml 文件的复选框代码。

<CheckBox android:id="@+id/task_row_checkBox1" android:gravity="right" 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:visibility="gone"
    />
4

3 回答 3

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);
        }
于 2012-04-26T16:47:24.270 回答
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 步。

那有意义吗?

于 2012-04-26T16:30:09.707 回答
0

根据我的经验,getview 似乎在最后被触发,这就是为什么 'onRestoreInstanceState()' 和 'onConfigurationChanged()' 无法成功的原因,因为 getview 将重置我的复选框作为布局 xml 文件中的初始化不可见。

因此,我能找到的唯一解决方案是我必须在 getview 中控制它们以获得答案。

于 2012-04-28T14:33:55.407 回答