-1

我有一段代码旨在帮助我了解如何覆盖 onSaveInstanceState 方法,以便在设备旋转时保留一些数据。

代码非常简单,没有做任何有趣的事情:有两个按钮,当用户单击其中任何一个时,它都会禁用它们。它工作得很好,除了按钮被禁用后,如果你旋转设备,它们会重新启用。

我已经为 onSaveInstanceState 添加了一个覆盖,但现在它会随着旋转而崩溃。我不知道我做错了什么。

这是代码:

有两个按钮:

private Button mButton1;
private Button mButton2;

一种将 Button 和 boolean 作为参数的方法,因此我可以切换按钮:

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:

我有两个键和两个布尔值。每个按钮一个:

     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

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

如果savedInstanceState不为 null,则该disBut函数将在 null 对象上运行,因为您稍后会为按钮充气。我没有看到你的堆栈跟踪,但那肯定是一个错误。

为之前的按钮 ( mButton1 = (Button) findViewById(R.id.true_button); mButton2 = (Button) findViewById(R.id.false_button);) 充气以恢复活动状态。

于 2017-11-27T16:00:53.377 回答