web-dev-qa-db-de.com

Menüelemente werden in der Aktionsleiste nicht angezeigt

Ich verwende appcompat in meiner App. Ich möchte, dass die Menüpunkte in der Aktionsleiste angezeigt werden oder zumindest der Überlauf (3 Punkte), um sie anzuzeigen, wenn kein Platz vorhanden ist. Es gibt viel Platz auf der Aktionsleiste, aber sie werden immer noch nicht angezeigt. Der Menüfluss hebt sich von unten an und das auch nur, wenn die Menütaste gedrückt wird.

menu_activity.xml:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" >

    <item
        Android:id="@+id/menu_lang"
        Android:showAsAction="always"
        Android:title="@string/menu_lang"
        Android:icon="@Android:drawable/ic_input_lang"/>

</menu>

Aktivität:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_activity, menu);
        return true;
    }

Dies post besagt, dass es nicht funktioniert, wenn die Hardware-Menütaste vorhanden ist. Andere Apps können jedoch Elemente auf demselben Gerät anzeigen. Diese Antwort scheint also falsch zu sein. Kann mir bitte jemand dabei helfen?

enter image description here

33
rick

Sie scheinen das falsche Menü zu verwenden: Ihre Datei heißt "menu_activity.xml" und Sie füllen das Menü mit der Resource-ID: R.menu.reminder_menu

Der Ressourcenname des Menüs sollte mit dem Dateinamen identisch sein, d. H .: R.menu.manu_activity

Versuchen Sie es noch einmal damit - ich bin auch einmal darauf gestoßen und es hat mich verrückt gemacht ...

Update Nach der Klarstellung, dass der obige Teil zur Verschleierung gedacht war, stellen Sie bitte sicher, dass:

  1. Sie erweitern ActionBarActivity.
  2. Sie verwenden (oder erweitern) eines der Theme.AppCompat-Themes für die Aktivität (oder die gesamte App).
  3. Da auf älteren Geräten die mit der Aktionsleiste verbundenen Attribute nicht vorhanden sind, stellen Sie sicher, dass alle diese Attribute in der XML mit einem benutzerdefinierten Namespace verwendet werden. Dies wäre hier das Attribut showAsAction, damit die Kompatibilitätsbibliothek sie abholen kann.

Sie hatten bereits den benutzerdefinierten Namespace definiert ("app" im Menü-Tag). Sie müssen das Android:showAsAction Tag zu app:showAsAction laut Android Anleitung.

Ihre korrigierte menu_activity.xml würde dann so aussehen:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" >

    <item
        Android:id="@+id/menu_lang"
        app:showAsAction="always"
        Android:title="@string/menu_lang"
        Android:icon="@Android:drawable/ic_input_lang"/>

</menu>

Die erweiterte Android Anleitung für Actionbar behandelt diese neuen und bösen Fallen ...

70
Patrick

Okay, ich glaube, ich habe eine Lösung für dich gefunden. Es heißt Overflow Menu und Sie müssen die folgende Methode in Ihrer onCreate-Methode aufrufen.

private void getOverflowMenu() {

try {
   ViewConfiguration config = ViewConfiguration.get(this);
   Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
   if(menuKeyField != null) {
       menuKeyField.setAccessible(true);
       menuKeyField.setBoolean(config, false);
   }
} catch (Exception e) {
   e.printStackTrace();
}
}

Probieren Sie es aus und lassen Sie es mich wissen, wenn es bei Ihnen funktioniert.

EDIT:

Ich glaube, ich habe dein Problem endlich verstanden. Ich kann Ihnen eine Idee geben. Wenn Sie das Überlaufmenü nicht verwenden und nur die Menüelemente anzeigen möchten, die in dem von Ihnen geposteten Screenshot angezeigt werden, können Sie zusätzlich zu Ihrer Aktivität ein Layout erstellen.

Sie können ein lineares Layout erstellen, einen Hintergrund erstellen, der der Aktionsleiste entspricht, und die gewünschten Symbole dort platzieren und ihnen mit onClickListener Funktionen zuweisen. Hoffe, das wird dir eine Idee geben. Auf diese Weise können Sie Ihr eigenes benutzerdefiniertes Menü erstellen. Probieren Sie das folgende Layout aus und ersetzen Sie ic_launcher drawable durch Menüsymbole. Setzen Sie dann einfach onClickListener auf diese und führen Sie alle Funktionen aus, die Sie in der onClick-Methode ausführen möchten.

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:background="#66000000" >

    <ImageView
        Android:id="@+id/xMenuBtn1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:background="@drawable/ic_launcher" />
     <TextView
        Android:id="@+id/xMenuTxt"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Chats"
        Android:textSize="18sp"
        Android:layout_toRightOf="@+id/xMenuBtn1"
        Android:layout_centerVertical="true" />
    <ImageView
        Android:id="@+id/xMenuBtn2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_toLeftOf="@+id/xMenuBtn3"
        Android:background="@drawable/ic_launcher" />
    <ImageView
        Android:id="@+id/xMenuBtn3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:background="@drawable/ic_launcher" />

</RelativeLayout>
5
user1952459

Versuchen Sie in Ihrer Aktivität onCreate ():

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.app_name);

und dann :

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    
        menu.clear();
        getSupportMenuInflater().inflate(R.menu.menu_activity, menu);
        return super.onPrepareOptionsMenu(menu);
    }
0
An-droid