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.
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.
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>
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).
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?
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");
}
});
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 Toolbar
est 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
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
}
});
}
}
}