Android和菜单

时间:2013-05-11 22:26:01

标签: android menuitem

我是一名有经验的Java程序员。我开始研究一个小型的Android项目,因为Android有多少复杂的编程只是为了更灵活,我感到非常沮丧。 确切地说,我遇到的问题如下:我有一个菜单项,我需要在mu app内的几个菜单中使用。有没有办法创建一个菜单项对象(可能将一些函数与它关联)并只是传递它,所以任何活动都可以将它添加到它自己的上下文菜单中?

我试过这个: 创建了一个“res.menu.mymenu.xml”文件,其中包含一个菜单项,其id与另一个“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一样)?

3 个答案:

答案 0 :(得分:2)

艾哈迈德有一半的故事。这将为您提供始终可用的菜单选项。添加特定于每个扩展活动的菜单选项的方法是为其编写片段。该片段将包含在活动布局中,但您可以不占用任何空间或将其用于填充。当Fragment实现onCreateOptionsMenu时,它添加的选项将与Activity创建的选项合并。

阅读本指南中选项菜单的所有内容,了解更多详情: http://developer.android.com/guide/topics/ui/menus.html

答案 1 :(得分:0)

  

是否存在正常的,面向对象的方式

是的。它被称为继承!

创建一个基础Activity,在其中为OptionsMenu充气,并为所有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;
    }

}

答案 2 :(得分:0)

我使用了Ahmad描述的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);
}