webentwicklung-frage-antwort-db.com.de

So ändern Sie die Position von Menüelementen in der Aktionsleiste

Ich entwickle eine Anwendung, in der ich ein benutzerdefiniertes Layout auf der Aktionsleiste hinzufügen muss. Das Hinzufügen des benutzerdefinierten Layouts ist abgeschlossen, aber wenn ich die Menüelemente auf der Aktionsleiste hinzufüge, ändert sich die Position des benutzerdefinierten Layouts von rechts von der Aktionsleiste in die Mitte der Aktionsleiste. Unten ist das Bild, was ich bisher erreicht habe.

Done till here

Ich möchte so etwas auf der Aktionsleiste.

Like this

Benutzerdefiniertes Layout (gelbe Schaltfläche) ganz rechts in der Aktionsleiste und Menüelemente in der Mitte.

Code hinzufügen, um dieses benutzerdefinierte Layout mithilfe der Android-Aktionsleiste zu erhalten:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    actionBar = getActionBar();
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayUseLogoEnabled(false);
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    cView = getLayoutInflater().inflate(R.layout.header, null);
    actionBar.setCustomView(cView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.websearch_menu, menu);
    return true;

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case Android.R.id.home:
        finish();

    default:
        return super.onOptionsItemSelected(item);
    }
}

Wie kann das erreicht werden?

Jede Art von Hilfe wird geschätzt.

14
Anupam

Ich gehe davon aus, dass Sie Ihre benutzerdefinierte Ansicht in der Aktionsleiste als benutzerdefinierte Ansicht festlegen. Wenn Sie ActionbarSherlock verwenden, können Sie die benutzerdefinierte Ansicht stattdessen als normalen Menüeintrag hinzufügen und mithilfe von .setActionView(yourCustomView or yourCustomLayoutId) eine Aktionsansicht festlegen. Sie können dann .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) so einstellen, dass die Ansicht angezeigt wird. Stellen Sie einfach sicher, dass Ihre benutzerdefinierte Ansicht auf Breite wrap_content eingestellt ist. Andernfalls werden die anderen Menüelemente vom Bildschirm verschoben. Dies funktioniert möglicherweise auch ohne ActionbarSherlock, aber ich habe es dort noch nicht probiert.

BEARBEITEN: Versuchen Sie, Ihre onCreateOptionsMenu-Methode zu ändern

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.websearch_menu, menu);

    // add this
    menu.add(Menu.NONE, 0, Menu.NONE, "custom")
        .setActionView(R.layout.header)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

    return true;
}

und entfernen Sie dies aus Ihrer onCreate-Methode

actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);

BEARBEITEN:

Wenn Sie die Ansichten aus Ihrem benutzerdefinierten Layout referenzieren müssen, können Sie dies in Ihrer onCreateOptionsMenu-Methode wie folgt tun (Hinweis: Ich habe diesen Code im Browser geschrieben. Daher kann nicht garantiert werden, dass ich keinen Tippfehler gemacht habe)

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // inflate the menu and add the item with id viewId,
    // which has your layout as actionview

    View actionView = menu.getItem(viewId).getActionView();
    View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout);

    // here you can set listeners to your view or store a reference 
    // to it somewhere, so you can use it later

    return true;
}
3
Thrakbad

Verwenden Sie einfach orderInCategory in Ihrer XML-Datei, um die Reihenfolge von weniger nach größer (von der linken Seite Ihrer Aktionsleiste) zu erhöhen. Sowie:

<item
    Android:id="@+id/Refresh"
    Android:icon="@drawable/ic_action_refresh"
    Android:showAsAction="ifRoom"
    Android:title="@string/refresh"
    Android:orderInCategory="2"/>
<item
    Android:id="@+id/Search"
    Android:icon="@drawable/ic_action_action_search"
    Android:showAsAction="ifRoom|collapseActionView"
    Android:title="@string/search"
    Android:orderInCategory="1"/>

Obwohl Refresh item in der XML-Datei an erster Stelle steht, wird es nicht an erster Stelle stehen. Das Symbol Search von links nach rechts in Ihrer Aktionsleiste wird jedoch zuerst anhand seines orderInCategory-Attributs angezeigt.

13
Rashid

Die Reihenfolge der Menüelemente wird entsprechend ihrer Reihenfolge in der XML-Datei festgelegt, in der sie aufgeblasen werden.

Dazu müssen Sie lediglich die Reihenfolge in der XML-Datei nach Ihren Wünschen ändern.

2
oznus

Um dies zu erreichen, rufen Sie die invalidateOptionMenu auf. Fügen Sie in der onCreateOptionsMenu - Methode die Elemente in der Reihenfolge ein, in der Sie sie einfügen möchten.

BTW: Wenn Sie ActionBarSherlock verwenden, ist diese Methode verfügbar. Ignorieren Sie die Lint-Warnungen darüber.

0