2013-05-11 103 views
1

我是一位有經驗的Java程序員。我開始研究一個小型的Android項目,並且我非常沮喪於Android有多少複雜的編程才更加靈活。 的確,我遇到的問題如下:我有一個菜單項,我需要在畝應用程序中的幾個菜單中使用。有沒有辦法創建一個菜單項對象(可能將某個功能與它相關聯)並傳遞給它,所以任何活動都可以將它添加到它自己的Contex菜單中?Android和菜單

我試過這個: 創建了一個「res.menu.mymenu.xml」文件,其中包含一個菜單項,其菜單項來自另一個「res.menu.mymenu2.xml」文件。然後,我已經試過這樣:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(getMenuToInflate(), menu); 
    menu.add(0, R.id.mnhidefrom, 0, ((MenuItem)findViewById(R.id.mnhidefrom)).getTitle()); 
    HideMenuAction.prepareAndGetHideMeMenuItem(menu, menuInfo); //creating an intent for "hide" menu item that will hold some data needed when user clicks the menu item. 
} 

,但沒有運氣...我得到的「menu.add」行「空指針異常」 ......

有一個正常的,面向對象的方式,創建一個菜單項,它會知道它應該做什麼,而不管外部任何東西(比如它所屬的菜單),只需像其他任何對象一樣傳遞它並將其添加到任何我喜歡的菜單中(就像我可以使用Swing菜單和JMenuItems)?

+0

getMenuToInflate()返回什麼? – Squonk 2013-05-11 22:46:58

+0

它返回應該保存這些菜單項的上下文菜單的ID。 ( 「R.menu.somecontextmenu」) – guest86 2013-05-11 22:49:50

回答

2

艾哈邁德有故事的一半。這將爲您提供始終可用的菜單選項基礎。添加特定於每個擴展活動的菜單選項的方法是爲其編寫一個片段。該片段將包含在活動佈局中,但您可以使其不佔用任何空間或將其用於填充。當Fragment實現onCreateOptionsMenu時,它添加的選擇與Activity創建的選擇合併。

閱讀一切本指南的詳細信息,在選項菜單中要做到: http://developer.android.com/guide/topics/ui/menus.html

0

有一個正常的,面向對象的方式

是的,有。這就是所謂的繼承!

創建您膨脹OptionsMenu一旦基地Activity和擴大這一Activity您的所有Activities。現在

public class BaseActivity extends Activity { 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.blabla: 
      // do something 
      break; 
     case R.id.blablab: 
      // do something 
      break; 
     } 

     return true; 
    } 

} 

,你可以這樣做:

public class MainActivity extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     super.onCreateOptionsMenu(menu); 

     return true; 
    } 

} 
0

我用BaseActivity作爲艾哈邁德描述。它工作正常。 現在我想在一個特定的Activity(它擴展了BaseActivity)中顯示一個特殊的菜單項。

@Override 
public boolean onOptionsItemSelected(android.view.MenuItem item) { 

    switch (item.getItemId()) { 
    case 0: 
     Intent intent = new Intent(this, BlaActivity.class); 
      startActivity(intent); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem item = menu.add(Menu.NONE, 0, 0, "Edit"); 
    item.setIcon(R.drawable.content_edit); 
    return super.onCreateOptionsMenu(menu); 
} 

這可以像我期望的那樣工作,但我無法讓新插入的menuitem獲得第一個位置。 我需要它在第一個位置,所以它直接顯示在ActionBar中,並且用戶看到沒有點擊選項按鈕就有新的選項。

編輯:我自己找到了解決方案。

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem item = menu.add(Menu.NONE, 0, 0, "Bearbeiten"); 
    item.setIcon(R.drawable.content_edit); 
    if (android.os.Build.VERSION.SDK_INT >= 11) { 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); //<----- 
    } 
    return super.onCreateOptionsMenu(menu); 
}