web-dev-qa-db-fra.com

Comment rendre le titre de la barre d'outils cliquable exactement comme sur ActionBar, sans le définir comme ActionBar?

Contexte

Je souhaite montrer un ActionBar sur PreferenceActivity, car il n'est pas disponible pour les appareils antérieurs à Honeycomb (même dans la bibliothèque de support).

Une telle classe n'étant pas disponible dans la bibliothèque de support, je ne peux pas simplement appeler "setSupportActionBar". Je ne souhaite pas non plus utiliser de bibliothèque (comme celle-ci ), car toutes les bibliothèques que j'ai trouvées utilisent encore le style Holo, elles n'ont donc pas été mises à jour jusqu'à présent, avec ceci à l'esprit.

Pour ce faire, j'essaie d'imiter l'apparence du titre de l'ActionBar dans le nouveau Toolbar class présenté sur la bibliothèque de support v7.

Le problème

J'ai réussi à mettre un titre et un bouton "haut", mais je ne trouve pas comment les rendre cliquables comme une barre d'action normale, y compris l'effet de toucher.

Le code

Voici le code:

SettingsActivity.Java

public class SettingsActivity extends PreferenceActivity
  {
  @Override
  protected void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    addPreferencesFromResource(R.xml.pref_general);
    final Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
    toolbar.setBackgroundColor(getResources().getColor(R.color.windowBackgroundColor));
    toolbar.setTitle("Settings");
    toolbar.setClickable(true);
    toolbar.setLogo(getResIdFromAttribute(this,R.attr.homeAsUpIndicator));
    }

  public static int getResIdFromAttribute(final Activity activity,final int attr)
    {
    if(attr==0)
      return 0;
    final TypedValue typedvalueattr=new TypedValue();
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true);
    return typedvalueattr.resourceId;
    }
  }

activity_settings.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    tools:context="com.antonioleiva.materialeverywhere.SettingsActivity" >

    <include
        Android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >

        <View
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:background="@drawable/abs__ab_solid_shadow_holo" />

        <ListView
            Android:id="@Android:id/list"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" />
    </FrameLayout>

</LinearLayout>

Ce que j'ai essayé

J'ai essayé tous les types d'écoute de clic de la classe Toolbar, mais aucun ne m'a aidé.

La seule chose qui a presque fonctionné est d'utiliser "setNavigationIcon" au lieu de "setLogo", mais cela rend en fait le titre et l'icône cliquables, seule l'icône montre son effet de clic (même si je clique sur le titre).

La question

Comment puis-je ajouter l'aspect et la convivialité de la barre d'outils, pour que son titre et son logo ressemblent à ceux de la barre d'action?

7
android developer

Rappelez-vous simplement que la barre d’outils est essentiellement un ViewGroup, vous pouvez donc lui ajouter un TextView et écouter de tels événements onClick.

Ajoutez TextView à la barre d’outils en XML:

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar_top"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:minHeight="?attr/actionBarSize"
    Android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >


    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Settings"
        Android:id="@+id/toolbar_title" />

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

Écoutez les clics dans votre activité:

toolbarTop.findViewById(R.id.toolbar_title).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG,"Clicked");
        }
    });
19
MrEngineer13

J'ai eu le même problème et j'ai trouvé un moyen très pratique pour cela (pour le titre cliquable), en procédant de la sorte avec la variable Toolbar. Peu importe, si Toolbarest utilisé comme ActionBar ou non, cela fonctionne dans les deux cas.

Il suffit de définir l’écouteur de clics sur la Toolbar elle-même. Cela entraînera la Toolbar complète qui déclenche l’écouteur de clics, si ce n’est un élément de menu ou l’icône de la maison qui est cliqué. Pour moi, c'est exactement ce à quoi je m'attends ...

Par exemple:

 setSupportActionBar(toolbar);
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 toolbar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getThis(), "Toolbar title clicked", Toast.LENGTH_SHORT).show();
        }
    });

onOptionsItemSelected, home click et similaire WON'T déclenche l'événement onClick. Semble une bonne solution

23
prom85

En fait, vous pouvez le faire assez facilement sans avoir à faire de solution de contournement. Il vous suffit de parcourir toutes les vues enfants de la Toolbar et de trouver une TextView dotée du texte du titre correct. 

String title = toolbar.getTitle();
for(int i = 0; i < toolbar.getChildCount(); i++){
    View tmpView = toolbar.getChildAt(i);
    if("Android.support.v7.widget.AppCompatTextView".equals(tmpView.getClass().getName())){
        if(((AppCompatTextView) tmpView).getText().equals(title)){
            tmpView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //do whatever you want here
                }
            });
        }
    }
}
0
user496854