我试图通过单击菜单按钮调用startActivity(myIntent),但我的应用程序在此时崩溃。
同样的startActivity调用在常规按钮单击时工作正常,因此,我假设菜单按钮缺少有关上下文的信息?或许我在这里完全不合适。
那么......将菜单项带到特定活动的正确方法是什么?
我根据最初的建议修改了我的代码。仍然在同一个地方崩溃。调试器不会输入异常子句,应用程序就会死掉。
[编辑代码链接]
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
try{
switch (item.getItemId()) {
case R.id.menuItemLang:
startActivity(new Intent("com.my.project.SETTINGS"));
return true;
default:
return super.onOptionsItemSelected(item);
}
}catch(Exception e){
log(e);
}
}
答案 0 :(得分:44)
第一个选项
您必须覆盖Activity中的onOptionsItemSelected
方法,该方法在用户点击“选项”菜单中的项目时调用。在该方法中,您可以检查已单击的项目。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_item1:
Intent intent = new Intent(this, ActivityForItemOne.class);
this.startActivity(intent);
break;
case R.id.menu_item2:
// another startActivity, this is for item with id "menu_item2"
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
还有onContextItemSelected
方法的工作方式类似,但对于上下文菜单(我不确定,你的意思是什么菜单)。
http://developer.android.com/guide/topics/ui/menus.html
的更多信息修改强>
第二个选项
我认为第一个选项更容易,但是从我看到的代码中,您希望将活动作为操作启动(因为String
构造函数中的Intent
参数)。为此,您需要在AndroidManifest.xml中指定一个操作。所以,如果我要开始活动ActivityForItemOne
(来自前面的例子),AndroidManifest.xml中的<application>
元素将如下所示:
<application ...>
...
<activity android:label="Activity For First Item" android:name=".ActivityForItemOne">
<intent-filter>
<action android:name="my.app.ITEMONE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
而Intent
将是:
Intent intent = new Intent("my.app.ITEMONE");
my.app.
是您的应用程序的包。没有必要使用您的应用程序包,但建议采取独特的操作。
更多信息:
Class Intent - Action and Category constants
希望这可以解决您的问题。
答案 1 :(得分:1)
更多优化:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
return true;
case R.id.item2:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
答案 2 :(得分:0)
如果有2个班级 1 MainActivity 2欢迎 那你需要离开 WELCOM&GT; MainActivity
@覆盖 public boolean onCreateOptionsMenu(菜单菜单){
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.logout:
Intent intent = new Intent(this, MainActivity.class);
this.startActivity(intent);
break;
case R.id.settings:
// another startActivity, this is for item with id "menu_item2"
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}