2017-08-31 74 views
-1

我正在製作一個計算器(這些位未顯示在下面的代碼中),並且我在應用程序底部有一個工具欄,我可以從菜單切換其可見性。這是我目前MainActivity類別:Android工具欄在可見/不見時保存狀態

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,並且我正在聲明具有正確名稱的工具欄。那麼,爲什麼我會得到一個空對象引用?

+0

爲您的活動 –

+0

創建自定義工具欄這是什麼行它摔碎在 –

+0

, 'toolbar_btm.setVisibility(savedInstanceState .getInt(「TOOLBAR_​​VISIBLE」));' – tobulos1

回答

1
  1. 您有一個名爲toolbar_btm 2個varaibles。一個是全球性的,未分配的,另一個在onOptionsItemSelected(MenuItem item)。該局部變量「覆蓋」局部變量(在功能中)
  2. 您應該將工具欄聲明爲全局變量,然後在OnCreate()中指定其值,或者如果該變量不起作用,則使用替代函數OnResume()。第二次使用Toolbar關鍵字,您可以分配值而不是,所以這樣。

    toolbar_btm = findViewById(R.id.toolbar_bottom);

UPDATE:

  • 你也可以完全放棄工具欄和使用動作條代替。這個片段將切換在活動(不分段)動作條可見:還原功能之後
  •  
         ActionBar actionBar = getActionBar(); 
    
         if(actionBar.isShowing()) 
          actionBar.hide(); 
         else 
          actionBar.show(); 
    
         this.invalidateOptionsMenu(); 
    
    +0

    用'onResume()'試過,但是和以前一樣給出了同樣的錯誤。我還添加了'toolbar_btm = findViewById(R.id.toolbar_bottom);'到'onCreate',但是沒有運氣。我還將該工具欄聲明爲全局的,並使用局部變量作爲菜單,但結果相同。現在,例外是'setVisibility(int)'。 – tobulos1

    1

    您沒有指定您的工具欄變量。選擇菜單選項後,您使用的是本地選項。把這個代碼在onCreate()

    toolbar_btm = findViewById(R.id.toolbar_bottom); 
    
    +0

    嗨,謝謝你!我將它添加到'onCreate'(請參閱上面的更新代碼),但它仍然會引發異常:當我打開一個空對象引用時嘗試調用虛擬方法'void android.widget.Toolbar.setVisibility(int)'設備處於橫向模式。 – tobulos1

    +0

    嘗試添加'if(savedInstanceState!= null)toolbar_btm.setVisibility(savedInstanceState.getInt(「TOOLBAR_​​VISIBLE」)); '在'onCreate()'中。並從'onRestoreInstanceState'刪除設置可見性 – matip

    +0

    我做了這個,但仍然是相同的錯誤:'嘗試調用虛擬方法'null android.widget.Toolbar.setVisibility(int)'對空引用',它指向'if(savedInstanceState!= null)...'所在的行。你在'toolbar_btm = findViewById(R.id.toolbar_bottom)之前還是之後放入了 – tobulos1

    相關問題