2013-08-29 93 views
1

打開一旦我使用此代碼打開一個optionsmenu作爲一個彈出:OptionsMenu僅適用於Android 4.1

@Override 
public boolean onPrepareOptionsMenu(Menu menu){ 
    openMenu(); 
    return true; 
} 

private void openMenu(){ 
    View popUpView = getLayoutInflater().inflate(R.layout.menu, null); 
    popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT 
             , LayoutParams.WRAP_CONTENT 
             , true); 
    popUpMenu.setBackgroundDrawable(new BitmapDrawable()); 
    popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
    popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); 
    makePopUpMenuButtons(popUpView); 
} 

的問題是,在Android 4.1的菜單隻開一次。 我讀了一些關於invalidateOptionsMenu(),但我不知道在哪裏實現此方法。另外eclipse說「方法invalidateOptionsMenu()沒有在...上定義」。

有沒有人知道該怎麼做,以便菜單按鈕被點擊時每次打開選項菜單?

編輯:

我不使用Android的菜單對象,因爲我想有一個自定義的設計。這就是爲什麼我在onPrepareOptionsMenu中創建popop的原因。所以我不使用onOptionsItemSelected。我的問題是onPrepareOptionMenu只在第一次點擊時被調用,之後只有不規則的。

在Android 3.0及更高版本上,當菜單項出現在操作欄中時,選項菜單被認爲始終打開。當發生事件並且想要執行菜單更新時,必須調用invalidateOptionsMenu()來請求系統調用onPrepareOptionsMenu()。

本段說我必須調用invalidateOptionsMenu當我的API是3.0和更高。但是在我的項目中,所有API都低於4.1。我試圖顯示我的彈出後打電話到invalidateOptionsMenu,但是Eclipse提供了一個錯誤,因爲該方法是不確定的...

+0

我認爲你應該使用invalidateOptionsMenu( )在onOptionsItemSelected()或其他東西,或者至少向我們顯示onOptionsItemSelected()代碼。 – shkschneider

+0

我不使用onOptionsItemSelected()。請閱讀我的編輯 – bluerob

回答

0

此代碼解決我的問題:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_MENU) { 
     openMenu(); 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

private void openMenu(){ 
    View popUpView = getLayoutInflater().inflate(R.layout.menu, null); 
    popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT 
             , LayoutParams.WRAP_CONTENT 
             , true); 
    popUpMenu.setBackgroundDrawable(new BitmapDrawable()); 
    popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
    popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); 
    makePopUpMenuButtons(popUpView); 
} 

但我不知道這是否是最好的方式

1
@Override 
    public boolean onPrepareOptionsMenu(Menu menu){ 
     //You need to pass the menu to open menu method 
     openMenu(menu); 
     return true; 
    } 
    // 
    private void openMenu(Menu menu){ 
     //that menu can not be null 
     View popUpView = getLayoutInflater().inflate(R.layout.menu, menu); 
     popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT 
              , LayoutParams.WRAP_CONTENT 
              , true); 
     popUpMenu.setBackgroundDrawable(new BitmapDrawable()); 
     popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
     popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); 
     makePopUpMenuButtons(popUpView); 

} 

嘗試option menu

在運行時讀取這個更改菜單項在上面的鏈接款你的第二個查詢

編輯:

@Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // TODO Auto-generated method stub 

     menu.clear(); 

     menu.add(0, MENU_Unsubscribe, Menu.NONE, "Pop UP"); 

     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 

     if (item.getItemId() == MENU_Unsubscribe) { 
      View popUpView = getLayoutInflater().inflate(R.layout.activity_new, 
        null); 

      btnOK=(Button)popUpView.findViewById(R.id.btnOK); 



      popUpMenu = new PopupWindow(popUpView, 
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false); 
//   popUpMenu.setBackgroundDrawable 
      popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
      popUpMenu.showAtLocation(popUpView, Gravity.CENTER, 0, 0); 
      popUpMenu.setOutsideTouchable(true); 

      btnOK.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        popUpMenu.dismiss(); 
       } 
      }); 

     } 

     return super.onOptionsItemSelected(item); 
    } 
+0

當我這樣做時拋出ClassCastError:/請閱讀我的編輯 – bluerob

+0

好的,需要修改我的答案。 – Gru

+0

**編輯:** 爲什麼要添加** PopupWindow **'onPrepareOptionMenu()',想嘗試Popupwindow然後檢查這個[鏈接](http://www.pavanh.com/2013/05/android -popup-menu-example.html) – Gru

3

關注會使事情更加清楚:

1 onCreateOptionsMenu()

要爲活動指定的選項菜單,您可以覆蓋onCreateOptionsMenu()。在這種方法中,您可以將菜單資源(用XML定義)充入回調中提供的菜單中。 對於Android 2.3.x and lower,當用戶第一次打開菜單時,系統調用onCreateOptionsMenu()來創建選項菜單。但是,對於Android 3.0 and higher,系統在啓動活動時調用onCreateOptionsMenu(),以便將項目顯示到操作欄。

在系統調用onCreateOptionsMenu()後,它會保留您填充的菜單實例,並且不會再次調用onCreateOptionsMenu(),除非菜單由於某種原因而失效。但是,只應使用onCreateOptionsMenu()來創建初始菜單狀態,而不是在活動生命週期中進行更改。

2。onOptionsItemSelected()

當您從選項菜單中選擇一個項目時,系統會調用您的活動的方法onOptionsItemSelected()。此方法傳遞選定的MenuItem。

3 onPrepareOptionsMenu()

如果要修改基於活動的生命週期期間發生的事件的選項菜單中,您可以在onPrepareOptionsMenu()方法做到這一點。該方法將當前存在的Menu對象傳遞給您,以便您可以對其進行修改,例如添加,刪除或禁用項目。

Android 2.3.x and lower上,每當用戶打開選項菜單(按下菜單按鈕)時,系統會調用onPrepareOptionsMenu()

Android 3.0 and higher上,當菜單項出現在操作欄中時,選項菜單被認爲始終打開。發生事件並且想要執行菜單更新時,必須致電invalidateOptionsMenu()請求系統調用onPrepareOptionsMenu()

對於invalidateOptionsMenu()Refer this

對於onPrepareOptionsMenu()Refer this

因此,你可以嘗試如下:

爲了應對您的活動下的向後兼容性插件。

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.Menu1: 
      refreshMenu(); 
      break; 
     case R.id.Menu2: 
      refreshMenu(); 
      break;  
     } 
     return super.onOptionsItemSelected(item); 
    } 

    public void refreshMenu() { 
     if (Build.VERSION.SDK_INT >= 11) { 
      invalidateOptionsMenu(); 
     } 
    } 

您還可以refer this

+0

我不使用onOptionsItemSelected,因爲我沒有使用menuobject。相反,我有我的popup Windowow。我試圖放棄我的彈出後放棄invalidateOptionsMenu(),但日食說,該方法沒有定義。 – bluerob

+0

如果你可以重構你的代碼,你可以使用onCreateOptionsMenu()和invalidateOptionsMenu()來實現它,並且你不需要onPrepareOptionsMenu()。 –

相關問題