1

私のアプリケーションが最初に行うことは、その Visibility を設定することによって、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 inいくつかのレイアウトが表示されましたが、 onCreate()`のみが表示されたため、すべて正常に機能しました。

@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可視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

私の経験に基づくと、getview は最後にトリガーされるようであり、getview がレイアウト xml ファイルの初期化として非表示のチェックボックスをリセットするため、「onRestoreInstanceState()」と「onConfigurationChanged()」がそれを作成できなかった理由です。

したがって、私が見つけた唯一の解決策は、答えを得るために getview でそれらを制御する必要があるということでした。

于 2012-04-28T14:33:55.407 に答える
0

onCreate をオーバーライドする方法と同様に、画面の向きが変わったときに実行するように設定できる onConfigurationChanged(...) をオーバーライドできます。

画面が回転したときに OnConfigurationChanged(...) がトリガーされるようにするには、マニフェストを編集してその関係/ルールを配置する必要があります。

それは簡単ですが、少し説明が必要で、以前にこの質問で回答されました: ローテーション Android でのアクティビティの再起動

編集:これは、構成の変更を処理する方法に関する開発ガイドです http://developer.android.com/guide/topics/resources/runtime-changes.html

編集 #2: まず、Imran のソリューションを使用することをお勧めします。開発者ガイドによりよく従っており、最終結果は同じになります。

次に、onConfigurationChanged ソリューションについて説明します。

onCreate で何をしているか見てみましょう:

1) ビューを設定します。(この時点でチェックボックスは非表示になっていますよね?)

2) DB を呼び出し、チェックボックスを表示するかどうかを決定します (編集モード)。

3) すべてのチェックボックスを表示します。

現在、onConfigurationChanged は setContentView も呼び出しており、その時点ですべてのチェックボックスが再び非表示になっています。したがって、チェックボックスを表示するプロセスを繰り返す必要があります (上記の #3)。値を保持する必要があるため、おそらく手順 2 を繰り返す必要はありませんが、アプリのロジックがどのように機能するのかわかりません。そのため、手順 2 をやり直す必要があるかもしれません。

それは理にかなっていますか?

于 2012-04-26T16:30:09.707 に答える