Android工具栏在可见/消失时保存状态

时间:2017-08-31 09:10:57

标签: java android

我正在制作一个计算器(这些位没有显示在下面的代码中)我在应用程序的底部有一个工具栏,我可以从菜单中切换它的可见性。这是我目前的MainActivity类:

public class MainActivity extends Activity implements OnClickListener {

        public Toolbar toolbar_btm;

        @Override
        public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar_btm = findViewById(R.id.toolbar_bottom);
        }

        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);

            //Toolbar toolbar_btm = findViewById(R.id.toolbar_bottom);
            outState.putInt("TOOLBAR_VISIBLE", toolbar_btm.getVisibility());
        }

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

            //Toolbar toolbar_btm = findViewById(R.id.toolbar_bottom);
            toolbar_btm.setVisibility(savedInstanceState.getInt("TOOLBAR_VISIBLE"));
        }

        //Toggles the toolbar to show/hide
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {
                case R.id.toolbar_toggle:
                    Toolbar toolbar_btmtog = findViewById(R.id.toolbar_bottom);
                    if (toolbar_btmtog.getVisibility() == View.GONE)
                        toolbar_btmtog.setVisibility(View.VISIBLE);
                    else if (toolbar_btmtog.getVisibility() == View.VISIBLE)
                        toolbar_btmtog.setVisibility(View.GONE);
                    return true;
                default:
                    return super.onOptionsItemSelected(item);
            }
        }
}

然而,我似乎无法在内存中保持这种可见/消失状态。我尝试过使用onSaveInstanceState和onRestoreInstanceState,但是当我运行我的代码时,它会抛出以下异常:

java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.calculator/com.example.calculator.MainActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'void 
android.widget.Toolbar.setVisibility(int)' on a null object reference

我根本无法弄清楚问题是什么。我正在使用putIntgetInt,我正在使用正确的名称声明工具栏。那么,为什么我得到一个空对象引用?

2 个答案:

答案 0 :(得分:1)

您没有分配工具栏变量。选择菜单选项后,您正在使用本地选项。将此代码放在onCreate()

toolbar_btm = findViewById(R.id.toolbar_bottom);

答案 1 :(得分:1)

  1. 您有两个名为toolbar_btm的变量。一个是全局的,未分配的,另一个是onOptionsItemSelected(MenuItem item)。该局部变量“覆盖”局部变量(在函数中)
  2. 您应该将工具栏声明为全局,然后在OnCreate()中指定其值,如果不起作用,则在重写的函数OnResume()中指定。您可以第二次使用Toolbar关键字通过分配值,就像这样。

    toolbar_btm = findViewById(R.id.toolbar_bottom);

  3. <强>更新

    1. 您也可以完全删除工具栏并改为使用ActionBar。此代码段将切换活动(非片段)中的操作栏可见性:
    2.         ActionBar actionBar = getActionBar();
      
              if(actionBar.isShowing())
                  actionBar.hide();
              else
                  actionBar.show();
      
              this.invalidateOptionsMenu();