我是一名有经验的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一样)?
答案 0 :(得分:2)
阅读本指南中选项菜单的所有内容,了解更多详情: 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);
}