1

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

我试过这个:创建了一个“res.menu.mymenu.xml”文件,其中包含一个与另一个“res.menu.mymenu2.xml”文件中的菜单项具有相同ID的菜单项。然后我试过这个:

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 一样)?

4

3 回答 3

2

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

阅读本指南中与选项菜单有关的所有内容以获取更多详细信息:http: //developer.android.com/guide/topics/ui/menus.html

于 2013-05-11T22:40:24.583 回答
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;
    }

}
于 2013-05-11T22:30:53.323 回答
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);
}

这按我的预期工作,但我无法让新插入的菜单项进入第一个位置。我需要它位于第一个位置,因此它直接显示在 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);
}
于 2013-10-10T21:00:38.347 回答