5

私の例は、互換性ライブラリの 1 つに付属しているサンプル アプリケーションの 1 つを基にしています。それがレイアウトファイルです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/fragment_menu_msg" />

<CheckBox android:id="@+id/menu1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:checked="true"
    android:text="@string/fragment1menu">
</CheckBox>

<CheckBox android:id="@+id/menu2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:checked="true"
    android:text="@string/fragment2menu">
</CheckBox>

</LinearLayout>

そして、ここにいくつかのJavaコードがあります:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_menu);

    ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
    Button btn = new Button(getApplication());
    btn.setId(1);
    btn.setText("Button 1");
    layout.addView(btn);

    mCheckBox1 = (CheckBox) findViewById(R.id.menu1);
    mCheckBox1.setOnClickListener(mClickListener);
}

final OnClickListener mClickListener = new OnClickListener() {
    public void onClick(View v) {

        ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
        Button btn = new Button(v.getContext());
        btn.setId(2);
        btn.setText("Button 2");
        layout.addView(btn);
    }
};

アクティビティが開始され、最初のチェックボックスが無効になり、1 つのボタン (ボタン 2) がレイアウトに追加され、画面の向きが変更され、ボタン 2 (onClickListener メソッドで追加された) が消えます。

Directupload.net のスクリーンショット

ランタイム変更の処理に関する多くのことを読みましたが、上記の例でボタン 2 が消えるのを防ぐ方法をまだ明確に把握していません。どんな助けでも大歓迎です。

4

4 に答える 4

1

向きを変更するとアクティビティが再開し、その状態がすべて失われます (この場合、動的に追加されたボタン)。これが発生する可能性がある他の状況があるため、これを処理する準備をする必要があります。たとえば、アプリケーションがバックグラウンドにあり、デバイスがメモリを解放する必要がある場合、アプリケーションが強制終了される可能性があります。

正しい解決策は、破棄される前にアクティビティの状態を保存し、再作成されたら復元することです。このようなもの:

@Override
protected void onSaveInstanceState(Bundle outState) {
    // save state of your activity to outState
}

@Override
public void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        // restore state of your activity from savedInstanceState
    }
}

詳細については、公式ドキュメントのアクティビティ状態の保存に関するトピックを参照してください。

于 2012-06-26T06:05:49.850 に答える
0

画面をポートレートモードに設定し、向きの変更中にアクティビティを停止して再作成する場合は、以下のコードのようにアクティビティに追加します。

コード:

<activity android:name=".YourActivityName" android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait" android:configChanges="keyboard|keyboardHidden|orientation"></activity>

このコードは私を助け、あなたのためにも機能します。

楽しみ。

:)

ハッピーコーディング...

于 2012-06-25T04:28:01.997 に答える
-1

このエントリをアクティビティ付きのマニフェストに入れ、 onConfigurationChanged 関数をオーバーライドします

android:configChanges="orientation|keyboardHidden|screenSize"

@Override
public void onConfigurationChanged(Configuration newConfig) {
   // super.onConfigurationChanged(newConfig);


}

これにより、向きの変更時にアクティビティの再作成が停止します......

于 2012-06-24T08:29:08.250 に答える
-1

アクティビティをマニフェストで次のようにします

  <activity
                android:name=".Hello"
                android:label="@string/app_name"
                android:screenOrientation="portrait"   <-- Screen will be forced to have portrait
                android:configChanges="orientation|keyboardHidden|screensize" > <-- No Restart in these cases

ScreenSize 属性は 4.0 で追加されたようですので、4.0 未満で実行している場合は言及しないでください。

于 2012-06-24T08:29:40.717 に答える