1

画面の向きを処理する方法を説明するデモ アプリを作成しています。ユーザーがインクリメントボタンを押したときにカウントをインクリメントし、その逆のカウントをインクリメントするシンプルなカウンターアプリです。これが私のコードです。マニフェストファイルに android:configChanges="keyboardHidden|orientation" を含め、 onConfigurationChanged メソッドもオーバーライドしました。残念ながら、カウントの値を保持することができず、エミュレータを横向きに切り替えるとカウントが 0 にリセットされます。この問題を解決するにはどうすればよいですか?

public class Counter_demoActivity extends Activity {

int count=0;
TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //UIActivity();
    Button add1=(Button)findViewById(R.id.btn1);
    Button sub1=(Button)findViewById(R.id.btn2);
    tv=(TextView)findViewById(R.id.tv1);
    add1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count++;
        tv.setText("Your Count is " + count);
    }
});
   sub1.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
        count--;
        tv.setText("Your Count is " +count);
    }
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    //UIActivity();
}
/*public void UIActivity(){
    this.tv=(TextView)this.findViewById(R.id.tv1);
    this.count=getChangingConfigurations();
}*/

}

私のマニフェストファイル:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.arif.counter_demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    >
    <activity
        android:label="@string/app_name"
        android:name=".Counter_demoActivity"
        android:configChanges="keyboardHidden|orientation|keyboard" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>
4

6 に答える 6

3

これを行う必要がないのに onConfigurationChanged をオーバーライドしている理由...あなたの場合、マニフェストファイルの android:configChanges="keyboardHidden|orientation" を削除しないでください コードを削除するだけです

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
//UIActivity();
}

あなたのプロジェクトから。それをきれいにして再構築してください...

于 2011-11-22T05:56:45.850 に答える
1

このメソッドを削除します

@Override
public void onConfigurationChanged(Configuration newConfig) {
      ....
}

追加するマニフェストで確認してください

android:configChanges="keyboardHidden|orientation"

Counter_demoActivity または他の場所で?

以下の行を使用して、アクティビティが再作成されているかどうかを確認してください。create メソッドでアクティビティに行を記録してから、方向を変更します。logcat に行が表示されますか?

android:configChanges="orientation|keyboard|keyboardHidden"

于 2011-11-22T05:57:29.740 に答える
1

何がうまくいかなかったのかは言いませんが、あえて推測してみましょう。どこかで null ポインター例外が発生しています。onCreate()コードの問題の 1 つは、 を実行するときに、ほとんどのロジックを繰り返す必要があることですonConfigurationChanged。アクティビティにまったく新しい一連のビューがあります。それ以外の場合、メンバー フィールドtvは null になり、ボタンにアタッチされたリスナーはありません。

編集保存されていないコメントからcount、マニフェストに何か問題があり、システムが向きの変更でアクティビティを破棄して再作成していると思います。このような変更を保持するには、値を含む Integer を返すcountようにオーバーライドし、呼び出して Integer にキャストすることでその値にアクセスします。onRetainNonConfigurationInstance()countonCreate()getLastNonConfigurationInstance()

于 2011-11-22T05:58:19.833 に答える
1

これは、同じ問題が発生したときにブログで見つけたトリックです。それを試してみてください

メソッド getsavedstuff() を作成する

private void getsavedstuff() {
    Object mObject  = getLastNonConfigurationInstance();
}

setContentView の直後に使用します

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getsavedstuff();
}
于 2011-11-22T06:02:50.480 に答える
0

ここに理にかなった解決策があります:)

public class Counter_demoActivity extends Activity {
final private static String COUNT_TITLE = "title";
private int restoredCount;
int count;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button add1=(Button)findViewById(R.id.btn1);
    Button sub1=(Button)findViewById(R.id.btn2);
    tv=(TextView)findViewById(R.id.tv1);
    add1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count++;
        tv.setText("Your Count is " + count);
    }
});
   sub1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count--;
        tv.setText("Your Count is " +count);
    }
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(COUNT_TITLE, count);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
     restoredCount =  savedInstanceState.getInt(COUNT_TITLE);
     count=restoredCount;
                 tv.setText("Your Count is " + restoredCount);
    super.onRestoreInstanceState(savedInstanceState);
}

}

于 2011-11-23T04:57:38.037 に答える
0

問題は、onConfigurationChanged 内で setContentView を呼び出していることです。

onConfigurationChanged を上書きして android:configChanges="keyboard|keyboardHidden|orientation" を追加すると、アクティビティは破棄および再作成されず、代わりに onConfigurationChanged が呼び出されます。実装しない場合は、super.onConfigurationChanged が呼び出されます。スーパークラスの構成変更メソッドは、すべてのフィールドなどから値を削除せずにレイアウトを回転させます。あなたの場合、レイアウトは正しく回転され、その後、呼び出してレイアウトを自分でリセットしますsetContentView(R.layout.main);

于 2011-11-23T12:14:56.097 に答える