Android Studio,选项菜单仅在 Main 中打开 Activity
Android Studio, options menu only opens in Main Activity
我现在在尝试打开除主 activity 之外的任何 activity 中的下拉菜单时遇到问题。我可以在 MainActivity 中单击以打开菜单的右上角的三个点仍然显示在 PieChartActivity 中,但是单击它们没有任何作用。
**编辑:请务必注意,我使用第一个 activity 中的下拉菜单导航到第二个 activity。然后在那一秒 activity,点击角落里的三个点不会打开那个 activity 的菜单。
这是我的代码:
在 MainActivity 中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.log_header_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.log_save_log:
Toast.makeText(getApplicationContext(), "SAVE LOG", Toast.LENGTH_SHORT).show();
break;
case R.id.log_add_new_metric:
Toast.makeText(getApplicationContext(), "ADD METRIC", Toast.LENGTH_SHORT).show();
break;
case R.id.log_about_app:
Toast.makeText(getApplicationContext(), "ABOUT APP", Toast.LENGTH_SHORT).show();
break;
case R.id.log_user_settings:
Toast.makeText(getApplicationContext(), "USER SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_log_mode:
startActivity(new Intent(getApplicationContext(), MainActivity.class));
Toast.makeText(getApplicationContext(), "LOG MODE", Toast.LENGTH_SHORT).show();
break;
case R.id.log_log_settings:
Toast.makeText(getApplicationContext(), "LOG SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_pie_mode:
startActivity(new Intent(getApplicationContext(), PieChartActivity.class));
Toast.makeText(getApplicationContext(), "PIE CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.log_pie_settings:
Toast.makeText(getApplicationContext(), "PIE CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_radar_mode:
startActivity(new Intent(getApplicationContext(), RadarChartActivity.class));
Toast.makeText(getApplicationContext(), "RADAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.log_radar_settings:
Toast.makeText(getApplicationContext(), "RADAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_bar_mode:
startActivity(new Intent(getApplicationContext(), BarChartActivity.class));
Toast.makeText(getApplicationContext(), "BAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.log_bar_settings:
Toast.makeText(getApplicationContext(), "BAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
在log_header_menu中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="About This App"
android:id="@+id/log_about_app"
app:showAsAction="never"/>
<item
android:title="User Settings"
android:id="@+id/log_user_settings"
app:showAsAction="never"/>
<item
android:title="Log"
android:id="@+id/log_log_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Log"
android:id="@+id/log_log_mode"/>
<item
android:title="Log Settings"
android:id="@+id/log_log_settings"/>
</menu>
</item>
<item
android:title="Pie Chart"
android:id="@+id/log_pie_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Pie Chart"
android:id="@+id/log_pie_mode"/>
<item
android:title="Pie Chart Settings"
android:id="@+id/log_pie_settings"/>
</menu>
</item>
<item
android:title="Radar Chart"
android:id="@+id/log_radar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Radar Chart"
android:id="@+id/log_radar_mode"/>
<item
android:title="Radar Chart Settings"
android:id="@+id/log_radar_settings"/>
</menu>
</item>
<item
android:title="Bar Chart"
android:id="@+id/log_bar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Bar Chart"
android:id="@+id/log_bar_mode"/>
<item
android:title="Bar Chart Settings"
android:id="@+id/log_bar_settings"/>
</menu>
</item>
<item
android:title="Save Log"
android:id="@+id/log_save_log"
android:icon="@drawable/ic_over_write"
app:showAsAction="always"/>
<item
android:title="Add Metric"
android:id="@+id/log_add_new_metric"
android:icon="@drawable/ic_add_new"
app:showAsAction="always"/>
</menu>
在 PieChartActivity 中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.pie_header_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.pie_about_app:
Toast.makeText(getApplicationContext(), "ABOUT APP", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_user_settings:
Toast.makeText(getApplicationContext(), "USER SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_log_mode:
startActivity(new Intent(getApplicationContext(), MainActivity.class));
Toast.makeText(getApplicationContext(), "LOG MODE", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_log_settings:
Toast.makeText(getApplicationContext(), "LOG SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_pie_mode:
startActivity(new Intent(getApplicationContext(), PieChartActivity.class));
Toast.makeText(getApplicationContext(), "PIE CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_pie_settings:
Toast.makeText(getApplicationContext(), "PIE CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_radar_mode:
startActivity(new Intent(getApplicationContext(), RadarChartActivity.class));
Toast.makeText(getApplicationContext(), "RADAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_radar_settings:
Toast.makeText(getApplicationContext(), "RADAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_bar_mode:
startActivity(new Intent(getApplicationContext(), BarChartActivity.class));
Toast.makeText(getApplicationContext(), "BAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_bar_settings:
Toast.makeText(getApplicationContext(), "BAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
在pie_header_menu中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="About This App"
android:id="@+id/pie_about_app"
app:showAsAction="never"/>
<item
android:title="User Settings"
android:id="@+id/pie_user_settings"
app:showAsAction="never"/>
<item
android:title="Log"
android:id="@+id/pie_log_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Log"
android:id="@+id/pie_log_mode"/>
<item
android:title="Log Settings"
android:id="@+id/pie_log_settings"/>
</menu>
</item>
<item
android:title="Pie Chart"
android:id="@+id/pie_pie_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Pie Chart"
android:id="@+id/pie_pie_mode"/>
<item
android:title="Pie Chart Settings"
android:id="@+id/pie_pie_settings"/>
</menu>
</item>
<item
android:title="Radar Chart"
android:id="@+id/pie_radar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Radar Chart"
android:id="@+id/pie_radar_mode"/>
<item
android:title="Radar Chart Settings"
android:id="@+id/pie_radar_settings"/>
</menu>
</item>
<item
android:title="Bar Chart"
android:id="@+id/pie_bar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Bar Chart"
android:id="@+id/pie_bar_mode"/>
<item
android:title="Bar Chart Settings"
android:id="@+id/pie_bar_settings"/>
</menu>
</item>
</menu>
只需在 onCreateOptionsMenu()
中为两个活动扩充相同的菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(***same menu id here***, menu);
return true;
}
在您的 MainActivity
中,您正在扩充 log_header_menu
菜单并使用开关打开未在菜单 xml 文件中定义的项目 ID(R.id.log_save_log
,R.id.log_add_new_metric
、R.id.log_about_app
、...),这就是为什么 item.getItemId()
returns 与 R.id.xyz 不同的 int,因此当您单击任何项目时没有任何反应,重构您的开关以使用log_header_menu
菜单 xml 文件中定义的 ID(bar_about_app
、bar_user_settings
、bar_log_menu
、...)
已解决!对于遇到同样问题的任何人,这是我遇到的问题:
次要活动的布局有问题。每个都有一个包含菜单按钮的 header,但是 header 位于布局中另一个元素的透明部分下方,使菜单按钮无法访问。我将布局从约束布局更改为垂直方向的线性布局,这样包含每个次要 activity 主要组件的布局元素将固定在 header 的底部而不是与其重叠。
谢谢大家的回复!
我现在在尝试打开除主 activity 之外的任何 activity 中的下拉菜单时遇到问题。我可以在 MainActivity 中单击以打开菜单的右上角的三个点仍然显示在 PieChartActivity 中,但是单击它们没有任何作用。
**编辑:请务必注意,我使用第一个 activity 中的下拉菜单导航到第二个 activity。然后在那一秒 activity,点击角落里的三个点不会打开那个 activity 的菜单。
这是我的代码:
在 MainActivity 中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.log_header_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.log_save_log:
Toast.makeText(getApplicationContext(), "SAVE LOG", Toast.LENGTH_SHORT).show();
break;
case R.id.log_add_new_metric:
Toast.makeText(getApplicationContext(), "ADD METRIC", Toast.LENGTH_SHORT).show();
break;
case R.id.log_about_app:
Toast.makeText(getApplicationContext(), "ABOUT APP", Toast.LENGTH_SHORT).show();
break;
case R.id.log_user_settings:
Toast.makeText(getApplicationContext(), "USER SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_log_mode:
startActivity(new Intent(getApplicationContext(), MainActivity.class));
Toast.makeText(getApplicationContext(), "LOG MODE", Toast.LENGTH_SHORT).show();
break;
case R.id.log_log_settings:
Toast.makeText(getApplicationContext(), "LOG SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_pie_mode:
startActivity(new Intent(getApplicationContext(), PieChartActivity.class));
Toast.makeText(getApplicationContext(), "PIE CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.log_pie_settings:
Toast.makeText(getApplicationContext(), "PIE CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_radar_mode:
startActivity(new Intent(getApplicationContext(), RadarChartActivity.class));
Toast.makeText(getApplicationContext(), "RADAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.log_radar_settings:
Toast.makeText(getApplicationContext(), "RADAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.log_bar_mode:
startActivity(new Intent(getApplicationContext(), BarChartActivity.class));
Toast.makeText(getApplicationContext(), "BAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.log_bar_settings:
Toast.makeText(getApplicationContext(), "BAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
在log_header_menu中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="About This App"
android:id="@+id/log_about_app"
app:showAsAction="never"/>
<item
android:title="User Settings"
android:id="@+id/log_user_settings"
app:showAsAction="never"/>
<item
android:title="Log"
android:id="@+id/log_log_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Log"
android:id="@+id/log_log_mode"/>
<item
android:title="Log Settings"
android:id="@+id/log_log_settings"/>
</menu>
</item>
<item
android:title="Pie Chart"
android:id="@+id/log_pie_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Pie Chart"
android:id="@+id/log_pie_mode"/>
<item
android:title="Pie Chart Settings"
android:id="@+id/log_pie_settings"/>
</menu>
</item>
<item
android:title="Radar Chart"
android:id="@+id/log_radar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Radar Chart"
android:id="@+id/log_radar_mode"/>
<item
android:title="Radar Chart Settings"
android:id="@+id/log_radar_settings"/>
</menu>
</item>
<item
android:title="Bar Chart"
android:id="@+id/log_bar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Bar Chart"
android:id="@+id/log_bar_mode"/>
<item
android:title="Bar Chart Settings"
android:id="@+id/log_bar_settings"/>
</menu>
</item>
<item
android:title="Save Log"
android:id="@+id/log_save_log"
android:icon="@drawable/ic_over_write"
app:showAsAction="always"/>
<item
android:title="Add Metric"
android:id="@+id/log_add_new_metric"
android:icon="@drawable/ic_add_new"
app:showAsAction="always"/>
</menu>
在 PieChartActivity 中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.pie_header_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.pie_about_app:
Toast.makeText(getApplicationContext(), "ABOUT APP", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_user_settings:
Toast.makeText(getApplicationContext(), "USER SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_log_mode:
startActivity(new Intent(getApplicationContext(), MainActivity.class));
Toast.makeText(getApplicationContext(), "LOG MODE", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_log_settings:
Toast.makeText(getApplicationContext(), "LOG SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_pie_mode:
startActivity(new Intent(getApplicationContext(), PieChartActivity.class));
Toast.makeText(getApplicationContext(), "PIE CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_pie_settings:
Toast.makeText(getApplicationContext(), "PIE CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_radar_mode:
startActivity(new Intent(getApplicationContext(), RadarChartActivity.class));
Toast.makeText(getApplicationContext(), "RADAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_radar_settings:
Toast.makeText(getApplicationContext(), "RADAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_bar_mode:
startActivity(new Intent(getApplicationContext(), BarChartActivity.class));
Toast.makeText(getApplicationContext(), "BAR CHART", Toast.LENGTH_SHORT).show();
break;
case R.id.pie_bar_settings:
Toast.makeText(getApplicationContext(), "BAR CHART SETTINGS", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
在pie_header_menu中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="About This App"
android:id="@+id/pie_about_app"
app:showAsAction="never"/>
<item
android:title="User Settings"
android:id="@+id/pie_user_settings"
app:showAsAction="never"/>
<item
android:title="Log"
android:id="@+id/pie_log_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Log"
android:id="@+id/pie_log_mode"/>
<item
android:title="Log Settings"
android:id="@+id/pie_log_settings"/>
</menu>
</item>
<item
android:title="Pie Chart"
android:id="@+id/pie_pie_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Pie Chart"
android:id="@+id/pie_pie_mode"/>
<item
android:title="Pie Chart Settings"
android:id="@+id/pie_pie_settings"/>
</menu>
</item>
<item
android:title="Radar Chart"
android:id="@+id/pie_radar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Radar Chart"
android:id="@+id/pie_radar_mode"/>
<item
android:title="Radar Chart Settings"
android:id="@+id/pie_radar_settings"/>
</menu>
</item>
<item
android:title="Bar Chart"
android:id="@+id/pie_bar_menu"
app:showAsAction="never">
<menu>
<item
android:title="View Bar Chart"
android:id="@+id/pie_bar_mode"/>
<item
android:title="Bar Chart Settings"
android:id="@+id/pie_bar_settings"/>
</menu>
</item>
</menu>
只需在 onCreateOptionsMenu()
中为两个活动扩充相同的菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(***same menu id here***, menu);
return true;
}
在您的 MainActivity
中,您正在扩充 log_header_menu
菜单并使用开关打开未在菜单 xml 文件中定义的项目 ID(R.id.log_save_log
,R.id.log_add_new_metric
、R.id.log_about_app
、...),这就是为什么 item.getItemId()
returns 与 R.id.xyz 不同的 int,因此当您单击任何项目时没有任何反应,重构您的开关以使用log_header_menu
菜单 xml 文件中定义的 ID(bar_about_app
、bar_user_settings
、bar_log_menu
、...)
已解决!对于遇到同样问题的任何人,这是我遇到的问题:
次要活动的布局有问题。每个都有一个包含菜单按钮的 header,但是 header 位于布局中另一个元素的透明部分下方,使菜单按钮无法访问。我将布局从约束布局更改为垂直方向的线性布局,这样包含每个次要 activity 主要组件的布局元素将固定在 header 的底部而不是与其重叠。
谢谢大家的回复!