【问题标题】:Android Studio, options menu only opens in Main ActivityAndroid Studio,选项菜单仅在主活动中打开
【发布时间】:2020-10-17 11:14:16
【问题描述】:

我现在在尝试在除我的主要活动之外的任何活动中打开下拉菜单时遇到问题。我可以在 MainActivity 中单击以打开菜单的右上角的三个点仍然显示在 PieChartActivity 中,但单击它们没有任何作用。

**EDIT :请注意,我使用第一个活动中的下拉菜单导航到第二个活动可能很重要。然后在第二个活动中,单击角落中的三个点不会打开该活动的菜单。

这是我的代码:

在 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>

【问题讨论】:

  • 这将有助于stackoverflow.com/questions/3270206/… 让我知道现在它已经过去了。
  • 恐怕这对我不起作用。当我尝试它时,我的基本菜单的附加选项出现在第二个菜单中,但它们也没有响应。我已经在每个活动中都有一个菜单,据我所知,每个活动都以相同的样式编码。但是从第一个活动的菜单中打开第二个活动后,我无法通过单击角落中的点来打开第二个活动中的菜单。

标签: java android android-studio android-activity android-menu


【解决方案1】:

只需在onCreateOptionsMenu() 中为这两个活动添加相同的菜单

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(***same menu id here***, menu);
    return true;
}

【讨论】:

  • 感谢您的回复,但恐怕这对我不起作用。在先前评论中提供的链接中,有人建议我让辅助活动扩展基本活动,以便它们共享一个菜单。该建议和您的建议都具有相同的效果。它在两个活动中放置了相同的菜单,但我仍然只能让菜单在主活动中下拉。
  • 为什么点击没有发生的问题是bcoz item.getItemId()返回了一个与R.id.XYZ不同的int,我把它注销了,发现没有执行switch中的case bcoz,或者你可以为每个项目使用xml属性android:onClick="itemClick",并在使用菜单的活动中定义一个公共方法itemClick(MenuItem item),这个xml属性实际上是有效的
  • 同一个 switch 语句是否有理由获得正确的 id 并在主要活动中完美工作,但在我导航到的任何活动中都没有?另外,我不想从 switch 语句中选择任何项目。我只是想点击第二个活动右上角的三个点,然后在菜单 xml 中展开所有项目的菜单,其中包含代码“app:showAsAction="never"”。
【解决方案2】:

在您的MainActivity 中,您正在膨胀log_header_menu 菜单并使用未在菜单xml 文件中定义的项目ID(R.id.log_save_logR.id.log_add_new_metricR.id.log_about_app,...),这就是为什么item.getItemId() 返回与 R.id.xyz 不同的 int,因此当您单击任何项​​目时没有任何反应,重构您的开关以使用在 log_header_menu 菜单 xml 文件中定义的 id (bar_about_app,bar_user_settings,bar_log_menu ,...)

【讨论】:

  • 哎呀。感谢您发现这一点,但不幸的是,这只是我发布问题时犯的一个错误。我还有一个 BarChartActivity,比如 PieChartActivity,这些 id 来自条形图菜单 xml。再次感谢您发现这一点,我会在我的帖子中进行更改,但不幸的是,这不是我的代码中的问题。
【解决方案3】:

解决了!对于遇到同样问题的任何人,这是我遇到的问题:

次要活动的布局有问题。每个都有一个包含菜单按钮的标题,但该标题位于布局中另一个元素的透明部分下方,使得菜单按钮无法访问。我将布局从约束布局更改为垂直方向的线性布局,以便包含每个辅助活动的主要组件的布局元素将固定在标题的底部而不是重叠。

感谢所有回复的人!

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 2011-05-26
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多