-1

デバイスが回転した場合に一部のデータを保持するために onSaveInstanceState メソッドをオーバーライドする方法を理解するのに役立つコードがあります。

コードは非常に単純で、興味深いことは何もありません。2 つのボタンがあり、ユーザーがいずれかをクリックすると、両方が無効になります。ボタンが無効になった後、デバイスを回転させると、ボタンが再び有効になることを除いて、問題なく動作します。

onSaveInstanceState にオーバーライドを追加しましたが、回転でクラッシュします。何が間違っているのかわかりません。

コードは次のとおりです。

2 つのボタンがあります。

private Button mButton1;
private Button mButton2;

ボタンとブール値をパラメーターとして受け取るメソッドで、ボタンを切り替えることができます。

public void disBut(Button x, boolean enbl){

        x.setEnabled(enbl);
    }

前のメソッドを使用して両方のボタンを無効にし、リスナーで呼び出されるメソッド:

private void checkAnaswer(boolean userTrue){   

        disBut(mButton1, false);
        disBut(mButton2, false);
    }

ボタンのリスナー:

   mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkAnaswer(true);    
            }
        });    
        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkAnaswer(false);   
            }
        });

これはすべて正常に機能します。onSavedInstance のオーバーライドについては、次のとおりです。

2 つのキーと 2 つのブール値があります。ボタンごとに 1 つ:

     boolean bundleBt1;
boolean bundleBt2;

private static final String BUTTON_ONE = "one";
private static final String BUTTON_TWO = "two";

次に、ボタンのいずれかが有効になっているかどうかを確認し、それに応じてブール値に値を割り当て、キーと一緒にキーと値のペアとして保存します。

 @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);

         bundleBt1 = mButton1.isEnabled() ? true : false;
         bundleBt2 = mButton2.isEnabled() ? true : false;

        savedInstanceState.putBoolean(BUTTON_ONE, bundleBt1);
        savedInstanceState.putBoolean(BUTTON_TWO, bundleBt2);   
    }

最後に、スーパークラスを呼び出した後、空でないかどうかを確認します。そうでない場合は、各ブール値にそれぞれのキーに格納されている値を割り当て、ボタンを有効/無効にするメソッド内でブール値を使用します。

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {

            bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
            disBut(mButton1, bundleBt1);

            bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);    
            disBut(mButton2, bundleBt2);    
        }

コードの構文に問題がないことを確認するために、ここにその完全性を示します。

public class MainActivity extends AppCompatActivity {

    private Button mButton1;
    private Button mButton2;

    boolean bundleBt1;
    boolean bundleBt2;

    private static final String BUTTON_ONE = "one";
    private static final String BUTTON_TWO = "two";      

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {

            bundleBt1 = savedInstanceState.getBoolean(BUTTON_ONE);
            disBut(mButton1, bundleBt1);

            bundleBt2 = savedInstanceState.getBoolean(BUTTON_TWO);    
            disBut(mButton2, bundleBt2);    
        }   

        mButton1 = (Button) findViewById(R.id.true_button);
        mButton2 = (Button) findViewById(R.id.false_button);    

        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkAnaswer(true);    
            }
        });


        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkAnaswer(false);   
            }
        });    
    }   

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);

         bundleBt1 = mButton1.isEnabled() ? true : false;
         bundleBt2 = mButton2.isEnabled() ? true : false;

        savedInstanceState.putBoolean(BUTTON_ONE, bundleBt1);
        savedInstanceState.putBoolean(BUTTON_TWO, bundleBt2);   
    }
 private void checkAnaswer(boolean userTrue){  

        disBut(mButton1, false);
        disBut(mButton2, false);
    }

    public void disBut(Button x, boolean enbl){

        x.setEnabled(enbl);
    }    
}
4

1 に答える 1