Pour les besoins spécifiques des clients, je dois autoriser l'utilisateur de mon application (ne sera pas publié sur Market) à cliquer sur le titre ActionBar pour exécuter certaines actions.
J'ai cherché dans la source Android, mais je ne parviens pas à trouver un ID pour le titre actionBar TextView.
Existe-t-il un moyen approprié de gérer ces clics?
Le titre n'est pas cliquable AFAIK. L'icône/le logo est cliquable - vous l'obtiendrez via Android.R.id.home
Dans onOptionsItemSelected()
. En théorie, le titre se déroule également de cette façon, bien qu'ils ne le mentionnent pas et que je ne m'y fie pas.
Il semble que vous souhaitiez un Spinner
pour que l'utilisateur choisisse les actions à exécuter. Si c'est le cas, utilisez setListNavigationCallbacks()
. Si vous souhaitez supprimer le titre comme étant désormais superflu, utilisez setDisplayOptions(0, DISPLAY_SHOW_TITLE)
.
Si vous voulez autre chose qu'un Spinner
sur le côté gauche de la barre d'actions, utilisez setDisplayOptions(DISPLAY_SHOW_CUSTOM, DISPLAY_SHOW_CUSTOM)
et setCustomView()
. Notez que cette approche n'est pas recommandée ( "Évitez d'utiliser des modes de navigation personnalisés dans la barre d'action" ), car elle peut ne pas fonctionner correctement avec les téléphones, en particulier en mode portrait.
Une autre possibilité serait de supprimer le titre et d'utiliser un logo à la place de l'icône, et dans le logo, votre "titre" fera partie de l'image. Le logo entier doit être cliquable, récupéré via onOptionsItemSelected()
.
// onCreate
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
// View actionBarView = getLayoutInflater().inflate(R.layout.action_bar_custom_view, null);
actionBar.setCustomView(actionBarView);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
//your logic for click listner
setListenerForActionBarCustomView(actionBarView);
private void setListenerForActionBarCustomView(View actionBarView) {
ActionBarCustomViewOnClickListener actionBarCustomViewOnClickListener = new ActionBarCustomViewOnClickListener();
actionBarView.findViewById(R.id.text_view_title).setOnClickListener(actionBarCustomViewOnClickListener);
}
private class ActionBarCustomViewOnClickListener implements OnClickListener {
public void onClick(View v) {
switch(v.getId()) {
case R.id.text_view_title:
//finish();
break;
}
}
Vous pouvez configurer une barre d'outils personnalisée à partir de la bibliothèque de support en déclarant <Android.support.v7.widget.Toolbar>
dans votre mise en page (voir réponse de Chris Banes pour un exemple complet de mise en page de la barre d'outils).
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<!-- We use a Toolbar so that our drawer can be displayed
in front of the action bar -->
<Android.support.v7.widget.Toolbar
Android:id="@+id/my_awesome_toolbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/main_toolbar"
Android:minHeight="?attr/actionBarSize" />
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
</LinearLayout>
Une fois que vous pouvez ajouter un écouteur de clic dans votre activité, comme pour la plupart des autres vues.
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
toolbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyActivity.this, "Test", Toast.LENGTH_LONG).show();
}
});
Si vous souhaitez capturer des événements tactiles sur le titre:
toolbar.setOnTouchListener(new View.OnTouchListener() {
Rect hitrect = new Rect();
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_DOWN == event.getAction()) {
boolean hit = false;
for (int i = toolbar.getChildCount() - 1; i != -1; i--) {
View view = toolbar.getChildAt(i);
if (view instanceof TextView) {
view.getHitRect(hitrect);
if (hitrect.contains((int)event.getX(), (int)event.getY())) {
hit = true;
break;
}
}
}
if (hit) {
//Hit action
}
}
return false;
}
});