web-dev-qa-db-fra.com

Comment changer la position des éléments de menu sur la barre d'actions

Je développe une application dans laquelle je dois ajouter une mise en page personnalisée dans la barre d'actions. L'ajout de la disposition personnalisée est terminé, mais lorsque j'ajoute les éléments de menu de la barre d'actions, celle-ci change de position à droite de la barre d'actions et se centre au centre de la barre d'actions. Vous trouverez ci-dessous l'image de ce que j'ai réalisé jusqu'à présent.

Done till here

Je veux quelque chose comme ça sur la barre d'action.

Like this

Disposition personnalisée (bouton jaune) à l'extrême droite de la barre d'actions et des éléments de menu au milieu.

Ajouter mon code pour réaliser cette mise en page personnalisée à l'aide de la barre d'action Android native:

@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);
    }
}

Comment cela peut il etre accompli?

Toute aide sera appréciée.

14
Anupam

Je suppose que vous définissez votre vue personnalisée en tant que vue personnalisée dans la barre d'actions. Si vous utilisez ActionbarSherlock, vous pouvez plutôt ajouter la vue personnalisée en tant qu'élément de menu normal et définir une vue d'action à l'aide de .setActionView(yourCustomView or yourCustomLayoutId). Vous pouvez ensuite définir .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) pour afficher la vue. Assurez-vous simplement que votre vue personnalisée est définie sur width wrap_content ou sinon, elle repoussera les autres éléments de menu hors de l'écran. Cela pourrait aussi fonctionner sans ActionbarSherlock, mais je ne l’ai pas encore essayé.

EDIT: Essayez de modifier votre méthode onCreateOptionsMenu

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

et supprimez cela de votre méthode onCreate

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

MODIFIER:

Si vous avez besoin de référencer les vues depuis votre mise en page personnalisée, vous pouvez le faire dans votre méthode onCreateOptionsMenu comme suit (note: j'ai écrit ce code dans le navigateur, donc rien ne garantit que je n'ai pas fait de faute de frappe ou quelque chose)

@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

Utilisez simplement orderInCategory dans votre fichier xml et il passera de nombre inférieur à supérieur (du côté gauche de votre barre d’action). Tel que:

<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"/>

Même si, Refresh item arrive en premier dans un fichier xml, ce ne sera pas le premier. Mais Rechercher L’icône de gauche à droite dans votre barre d’action sera la première en fonction de son attribut orderInCategory.

13
Rashid

L'ordre des éléments de menu sera défini en fonction de leur ordre dans le fichier XML où ils sont gonflés.

Par conséquent, il vous suffit de modifier l'ordre du fichier XML à votre guise.

2
oznus

Une façon d'y parvenir consiste à appeler invalidateOptionMenu et dans la méthode onCreateOptionsMenu , placez les éléments en fonction de l'ordre dans lequel vous souhaitez les placer.

En passant, si vous utilisez ActionBarSherlock, cette méthode est disponible, alors ignorez les avertissements Lint à ce sujet.

0
android developer