Wie werden sowohl das Symbol als auch der Titel der Aktion in ActionBar angezeigt?


77

Ich muss beides iconund die titleAktion im Inneren anzeigen ActionBar.

Ich habe die withTextOption " " ausprobiert , aber sie hat keine Auswirkung.

Geben Sie hier die Bildbeschreibung ein


4
Wurde dieses Problem endlich gelöst? Wenn ja, was ist zu tun?
Ajay

1
Die Antwort scheint hier zu sein: stackoverflow.com/questions/9282122/… Kurz gesagt, dies ist beabsichtigt und Sie müssen ein benutzerdefiniertes Layout bereitstellen, um es zu umgehen .
N8allan

Antworten:


117

' always | withText ' funktioniert, wenn genügend Platz vorhanden ist, andernfalls wird nur das Symbol platziert. Sie können es auf Ihrem Telefon mit Rotation testen.

<item android:id="@id/menu_item"
android:title="text"
android:icon="@drawable/drawable_resource_name"
android:showAsAction="always|withText" />

5
Hallo Eng.Faouad, es funktioniert nicht für mich. Gibt es irgendwelche Änderungen, die wir programmgesteuert vornehmen müssen?
KK_07k11A0585

21
Funktioniert nicht, auch wenn es viele Räume gibt. Das Symbol und der Text können nur im Querformat angezeigt werden.
Bagusflyer

2
@ YiboLong diese Antwort ist veraltet, da Programme normalerweise AppCompact-Bibliothek verwenden
murt

@murt Diese Antwort und die Kommentare sind in der Appcompat-Bibliothek weiterhin gültig.
Mhsmith

22

Sie können Aktionen mit Text auf zwei Arten erstellen:

1- Aus XML:

<item android:id="@id/resource_name"
      android:title="text"
      android:icon="@drawable/drawable_resource_name"
      android:showAsAction="withText" />

Wenn Sie das Menü aufblasen, sollten Sie anrufen, getSupportMenuInflater()da Sie verwenden ActionBarSherlock.

2- Programmatisch:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem item = menu.add(Menu.NONE, ID, POSITION, TEXT);
    item.setIcon(R.drawable.drawable_resource_name);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT);

    return true;
}

Stellen Sie sicher, dass Sie com.actionbarsherlock.view.Menuund importieren com.actionbarsherlock.view.MenuItem.


MenuItem item = menu.add(Menu.NONE, ID, POSITION, TEXT);Hier ist ID die Layout-ID (z. B. R.layout.myMenuItem), POSITION ist die Position der in der Aktionsleiste angezeigten Elemente (z. B. 1,2,3 rtl), TEXT ist der Titel, den Sie für das Aktionsleistenelement festlegen möchten.
Reaz Murshed

17

Was für mich funktionierte, war die Verwendung von ' always | withText '. Wenn Sie viele Menüs haben, sollten Sie "ifRoom" anstelle von "immer" verwenden.

<item android:id="@id/resource_name"
android:title="text"
android:icon="@drawable/drawable_resource_name"
android:showAsAction="always|withText" />

13

Die Lösung, die ich finde, besteht darin, ein benutzerdefiniertes Aktionslayout zu verwenden: Hier ist XML für das Menü.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:Eventapp="http://schemas.android.com/apk/res-auto">
<!-- This is a comment. -->
    <item
        android:id="@+id/action_create"
        android:actionLayout="@layout/action_view_details_layout"
        android:orderInCategory="50"
        android:showAsAction = "always"/>
</menu>

Das Layout ist

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="5dp"
    android:gravity="center"
    android:text="@string/create"/>

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:gravity="center"
    android:src="@drawable/ic_action_v"/>

</LinearLayout>

Dadurch werden das Symbol und der Text zusammen angezeigt.

So erhalten Sie das Klickelement für das Fragment oder die Aktivität:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    //super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_details_fragment, menu);
    View view = menu.findItem(R.id.action_create).getActionView();
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(), "Clicked", Toast.LENGTH_SHORT).show();
        }
    });
}

Falls jemand diesen Fehler erhält "Fehler: (4) Keine Ressourcenkennung für das Attribut 'actionlayout' im Paket 'android' gefunden", wird dies durch Ersetzen von "android: actionLayout" durch "app: actionLayout"
behoben

Nun, der Welleneffekt ist verschwunden
Charles Galvez,

Irgendwie zeigt sich das für mich nicht - es ignoriert nur das Layout und zeigt nichts oder den Titel an, wenn ich es zur Verfügung stelle (übrigens gibt der Titel eine Warnung aus, aber er wird kompiliert)
Srneczek

@CharlesGalvez können Sie legen android:background="?selectableItemBackground"für LinearLayoutzusammen mit android:clickable="true"undandroid:focusable="true"
Variag

Wahrscheinlich funktioniert das, ich bin mir nicht sicher, weil in meinem Fall nichts im Menü angezeigt wurde, sondern ein Knopf gedrückt. Ich denke, es hat weißen Text auf die weiße Symbolleiste gezeichnet. Informationen zum Überschreiben von Textfarben finden Sie unter stackoverflow.com/questions/43276345/… .
CoolMind

1

Wenn sich any1 im Jahr 2017 fragt, wie dies programmgesteuert zu tun ist, gibt es einen Weg, den ich in den Antworten nicht sehe

.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

1

Sie können eine Schaltfläche in der Symbolleiste hinzufügen

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:title="title">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginRight="16dp"
            android:background="@color/transparent"
            android:drawableRight="@drawable/ic_your_icon"
            android:drawableTint="@drawable/btn_selector"
            android:text="@string/sort_by_credit"
            android:textColor="@drawable/btn_selector"
            />

    </android.support.v7.widget.Toolbar>

Erstellen Sie die Datei btn_selector.xml in drawable

<?xml version="1.0" encoding="utf-8" ?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:state_selected="true"
    android:color="@color/white"
    />
<item
    android:color="@color/white_30_opacity"
    />

Java:

private boolean isSelect = false;

OnClickListener für Schaltfläche:

private void myClick() {
    if (!isSelect) {
       //**your code**//
        isSelect = true;
    } else {//**your code**//
        isSelect = false;
    }
    sort.setSelected(isSelect);
}

Das Hinzufügen der Schaltfläche zur Symbolleiste funktioniert in der Tat, obwohl in Android Studio "Elementschaltfläche hier nicht zulässig ..." angegeben ist. (Ich habe gerade diesen Teil ausprobiert. Ich habe nicht die vollständige Lösung implementiert. Ich weiß also nicht, ob alles funktioniert.)
user2808624

0

Einige von euch haben großartige Antworten, aber ich habe eine zusätzliche Sache gefunden. Wenn Sie ein Menüelement mit einigen Untermenüs programmgesteuert erstellen möchten:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        SubMenu subMenu = menu.addSubMenu(0, Menu.NONE, 0, "Menu title");
        subMenu.getItem().setIcon(R.drawable.ic_action_child);
        subMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        subMenu.add(0, Menu.NONE, 0, "Subitem 1");
        subMenu.add(0, Menu.NONE, 1, "Subitem 2");
        subMenu.add(0, Menu.NONE, 2, "Subitem 3");

        return true;
    }

0

Fügen Sie zuerst eine Textansicht zur Menüleiste hinzu und setCompoundDrawables()platzieren Sie das Bild mit auf der gewünschten Seite. Verbinden Sie die Klickaktivität am Ende mit der Textansicht.

MenuItem item = menu.add(Menu.NONE, R.id.menu_item_save, 10, R.string.save);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS|MenuItem.SHOW_AS_ACTION_WITH_TEXT);
TextView textBtn = getTextButton(btn_title, btn_image);
item.setActionView(textBtn);
textBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
           // your selector here   }
    });

Hier können Sie buchstäblich alles anpassen:

public TextView getTextButton (String btn_title, Drawable btn_image) {
    TextView textBtn = new TextView(this);
    textBtn.setText(btn_title);
    textBtn.setTextColor(Color.WHITE);
    textBtn.setTextSize(18);
    textBtn.setTypeface(Typeface.create("sans-serif-light", Typeface.BOLD));
    textBtn.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
    Drawable img = btn_image;
    img.setBounds(0, 0, 30, 30);
    textBtn.setCompoundDrawables(null, null, img, null); 
    // left,top,right,bottom. In this case icon is right to the text

    return textBtn;
}

-1

App verwenden: showAsAction = "always | withText". Ich benutze Android 4.1.1, aber es sollte trotzdem zutreffen. Meins sieht aus wie unten

<item
        android:id="@+id/action_sent_current_data"
        android:icon="@drawable/ic_upload_cloud"
        android:orderInCategory="100"
        android:title="@string/action_sent_current_data"
        app:showAsAction="always|withText"/>

-3

Folge diesen Schritten:

  1. Fügen Sie die Aktionsleisteninstanz im Java-Code hinzu final ActionBar actionBar = getActionBar();
  2. Aktivieren Sie die Home Display Option actionBar.setDisplayShowHomeEnabled(false);
  3. Fügen Sie den folgenden Code in die Manifestdatei der jeweiligen Aktivität ein android:logo=@drawable/logo and android:label="@string/actionbar_text"

Ich denke, das wird dir helfen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.