web-dev-qa-db-fra.com

Comment puis-je détecter un clic sur le titre ActionBar?

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?

29
Waza_Be

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().

28
CommonsWare

// 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;
    }
}
9
Padma Kumar

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;
            }
        });
6
Boris Treukhov