Menu items won't show up in the actiobar

2019-08-26 21:53发布

问题:

UPDATE: It works on the tab, but on the phone it's overlayed for some reason

I have a question regarding the menu items android uses for the ActionBar, I have a custom background for my actiobar (a picture) and set it in the code here. That piece of code works fine. But when I try to add a menu item, it fails.

What I want is fairly simple, I want a button that says "save product as favorite" at the bottom of the screen, like the bottom-actionbar. But when I try to add the button as menu item it won't show up, nothing changes.

The log tells me the onCreateOptionsMenu() method is in fact executed. Any ideas?

This is the activity I want the menu for:

package com.x;


import java.util.ArrayList;
import java.util.HashMap;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;

import com.x.R;
import com.x.products.fragments.*;
import com.x.tasks.ZoekQueryTask;
import com.x.util.Helper;
import com.x.util.UnscaledBitmapLoader;


public class ProductActivity extends Activity {

    private Bundle save;

    /** Called when the activity is first created. */
    @SuppressWarnings("rawtypes")
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.product);

        @SuppressWarnings("deprecation")
        LocalActivityManager manager = new LocalActivityManager(this, false);

        Helper helper = new Helper();
        save = null;
        String id = (String) getIntent().getExtras().get("id");
        String score = (String) getIntent().getExtras().get("score");
        String profileId = (String) getIntent().getExtras().get("profileId");

   //     String id = "138946";
    //    String profileId = "28";
    //    String score = "100%";
        String query  = "SELECT * FROM products WHERE id = "+id;
        ArrayList<HashMap> result = null;

        try {
            ZoekQueryTask zoekQueryTask = new ZoekQueryTask(query);
            result = zoekQueryTask.getResults();
        }

        catch(Exception e) {
            Log.e("Afgevangen error", e.getMessage());
        }



        TabHost tb = (TabHost) findViewById(R.id.tabs);
        manager.dispatchCreate(savedInstanceState);
        tb.setup(manager);



        Intent info = new Intent();
        info.setClass(this, InfoFragment.class);
        info.putExtra("result", result);
        info.putExtra("profileId", profileId);

        TabSpec tsInfo = tb.newTabSpec("info");
        tsInfo.setContent(info);
        tsInfo.setIndicator("info");



        Intent specs = new Intent();
        specs.setClass(this, SpecsFragment.class);
        specs.putExtra("result", result);

        TabSpec tsSpecs = tb.newTabSpec("specs");
        tsSpecs.setContent(specs);
        tsSpecs.setIndicator("specs");



        Intent prijs = new Intent();
        prijs.setClass(this, PrijsFragment.class);
        prijs.putExtra("result", result);

        TabSpec tsPrijs = tb.newTabSpec("Prijs");
        tsPrijs.setContent(prijs);
        tsPrijs.setIndicator("Prijs");

        TabSpec tsFotos = tb.newTabSpec("Fotos");
        tsFotos.setContent(info);
        tsFotos.setIndicator("Fotos");


        tb.addTab(tsInfo); 
        tb.addTab(tsSpecs);
        tb.addTab(tsPrijs);
        tb.addTab(tsFotos);



            final ActionBar actionBar = getActionBar(); 
            actionBar.setDisplayShowHomeEnabled(false);
            actionBar.setDisplayShowTitleEnabled(false);


            Bitmap bm = UnscaledBitmapLoader.loadFromResource(getResources(), R.drawable.logo, null);
            BitmapDrawable background = new BitmapDrawable(this.getResources(), bm);
            background.setTileModeX(android.graphics.Shader.TileMode.CLAMP); 
            actionBar.setBackgroundDrawable(background);



            TextView nameText = (TextView) findViewById(R.id.name);
            TextView scoreText = (TextView) findViewById(R.id.score);

            nameText.setText(result.get(0).get("name").toString());
            scoreText.setText(score);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        Log.i("hallo", "hoi");
        inflater.inflate(R.layout.product_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.save:
                Log.i("menu", "werkt");
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

}

This is the menu XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@+id/save"
          android:title="Opslaan in favorieten" >

    </item>
</menu>

回答1:

I think you need to fix this:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    Log.i("hallo", "hoi");
    inflater.inflate(R.layout.product_menu, menu);  //  <- this is wrong
    return true;
}

Instead of R.layout.product_menu, it should refer to R.menu.your_desired_menu



回答2:

If you want to show your menu item in the action bar, set the android:showAsAction property of your item in product_menu.xml;

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:id="@+id/item1" 
        android:title="Save"
        android:showAsAction="always" />
</menu>

You can set this property to:

  • ifRoom
  • never
  • withText
  • always
  • collapseActionView

I hope this helps you!

Steffen