Search code examples
javaandroidandroid-studioandroid-activityandroid-menu

Android Studio, options menu only opens in Main Activity


I'm having an issue trying to open a drop down menu in any activity other than my main activity right now. The three dots in the top right corner that I can click to open the menu in MainActivity still show up in PieChartActivity, but clicking them does nothing.

**EDIT : It might be important to note that I'm using the drop down menu in the first activity to navigate to the second activity. Then in that second activity, clicking the three dots in the corner doesn't open that activity's menu.

Here's my code:

In 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;
}

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

In 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;
}

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

Solution

  • Solved! For anyone having this same problem, here's the issue I had:

    It was a problem with the layout of the secondary activities. Each had a header which contained the menu buttons, but that header was underneath a transparent part of another element in the layout, making the menu buttons inaccessible. I changed the layouts from constraint layout to linear layout with a vertical orientation, so that the layout element containing the main component of each secondary activity would be fixed to the bottom of the header instead of overlapping it.

    Thank you to everyone who replied!