Comment aligner le titre au centre de la barre D'action dans le thème par défaut (thème.Holo.Lumière)
J'ai beaucoup cherché mais je ne peux pas trouver un moyen, Comment puis-je définir alors le titre au centre de la barre D'action au lieu de gauche aligné. J'ai utilisé le code ci-dessous pour définir le titre au centre :
ViewGroup decorView= (ViewGroup) this.getWindow().getDecorView();
LinearLayout root= (LinearLayout) decorView.getChildAt(0);
FrameLayout titleContainer= (FrameLayout) root.getChildAt(0);
TextView title= (TextView) titleContainer.getChildAt(0);
title.setGravity(Gravity.CENTER);
Mais il donne l'erreur comme ci-dessous:
ClassCastException : com.android.internal.widget.ActionBarView can not
be cast to android.widget.TextView.
Toute autre solution ..Toute aide sera appréciée.
11 réponses
Vous pouvez créer une mise en page personnalisée et l'appliquer à la barre d'action.
Pour ce faire, suivez ces 2 étapes simples:
-
Code Java
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setCustomView(R.layout.actionbar);
Où R.layout.actionbar
est la disposition suivante.
-
XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/action_bar_title" android:text="YOUR ACTIVITY TITLE" android:textColor="#ffffff" android:textSize="24sp" /> </LinearLayout>
Cela peut être aussi complexe que vous le souhaitez. L'essayer!
Modifier:
Pour définir le background
, Vous pouvez utiliser la propriété android:background
dans la disposition du conteneur (LinearLayout cas). Vous devrez peut-être définir la hauteur de mise en page android:layout_height
sur match_parent
au lieu de wrap_content
.
De plus, vous pouvez également ajouter un LOGO / icône à elle. Pour ce faire, ajoutez simplement un ImageView à l'intérieur de votre mise en page, et définissez la propriété Orientation de la mise en page android:orientation
sur horizontal (ou utilisez simplement un RelativeLayout et gérez-le vous-même).
Pour modifier dynamiquement le titre de la barre d'action personnalisée ci-dessus, procédez comme suit:
TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName()));
title.setText("Your Text Here");
Il semble qu'il n'y ait aucun moyen de le faire sans vue personnalisée. Vous pouvez obtenir la vue titre:
View decor = getWindow().getDecorView();
TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "android"));
Mais la modification de gravity
ou layout_gravity
n'a pas d'effet.
Le problème dans le ActionBarView
, qui met en page ses enfants par lui - même, donc le changement des paramètres de mise en page de ses enfants n'a pas non plus d'effet.
Pour voir ce code suivant excecute:
ViewGroup actionBar = (ViewGroup) decor.findViewById(getResources().getIdentifier("action_bar", "id", "android"));
View v = actionBar.getChildAt(0);
ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
p.gravity= Gravity.CENTER;
v.setLayoutParams(p);
v.setBackgroundColor(Color.BLACK);
Découvrez une nouvelle barre d'outils sur la classe de bibliothèque de support dans Lollipop update vous pouvez concevoir actionbar en ajoutant une barre d'outils dans votre mise en page
Ajoutez ces éléments dans votre thème d'application
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
Créez votre barre d'outils dans une mise en page et incluez votre textview au centre concevez votre barre d'outils
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/acbarcolor">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/app_name"
android:textColor="#ffffff"
android:textStyle="bold" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
Ajoutez votre barre d'action en tant que barre d'outils
toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Veuillez vous assurer que vous devez inclure la barre d'outils sur votre fichier de ressources comme ceci
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/toolbar" />
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/homepageinc" />
</FrameLayout>
<fragment
android:id="@+id/fragment1"
android:layout_gravity="start"
android:name="com.shouldeye.homepages.HomeFragment"
android:layout_width="250dp"
android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
Je sais que ma réponse n'est pas à temps mais c'est purement du code non xml
requis.
Ceci est destiné à être utilisé dans Activity
public void setTitle(String title){
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
TextView textView = new TextView(this);
textView.setText(title);
textView.setTextSize(20);
textView.setTypeface(null, Typeface.BOLD);
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView.setGravity(Gravity.CENTER);
textView.setTextColor(getResources().getColor(R.color.white));
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(textView);
}
Ceci est à utiliser dans Fragment
public void setTitle(String title){
((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
TextView textView = new TextView(getActivity());
textView.setText(title);
textView.setTextSize(20);
textView.setTypeface(null, Typeface.BOLD);
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView.setGravity(Gravity.CENTER);
textView.setTextColor(getResources().getColor(R.color.white));
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(textView);
}
Si vous utilisez la barre d'outils, ajoutez simplement
android:layout_gravity="center_horizontal"
Sous la barre D'outils comme cet extrait
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" //Important
android:textColor="@color/whitecolor"
android:textSize="20sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
Cela fonctionne réellement:
getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getActionBar().setCustomView(R.layout.custom_actionbar);
ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
p.gravity = Gravity.CENTER;
Vous devez définir custom_actionbar.mise en page xml qui est selon votre exigence, par exemple:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#2e2e2e"
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/top_banner"
android:layout_gravity="center"
/>
</LinearLayout>
Je pense qu'en positionnant les vues sur la barre d'action, vous atteindrez ce que vous voulez.Sur la mise en page de la barre d'action lorsque les paramètres de mise en page correspondent au parent il ne correspond pas à la pleine largeur c'est pourquoi je l'ai fait par programme où je succeed.By définir la largeur (cela fonctionne comme layout_weight="value") nous pouvons définir notre vue où nous voulons:
actionBar = getSupportActionBar();
actionBar.setDisplayShowCustomEnabled(true);
LayoutInflater ll = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout linearLayout = (LinearLayout) ll.inflate(R.layout.custom_actionbar, null);
//inner layout within above linear layout
LinearLayout inner = (LinearLayout) linearLayout.findViewById(R.id.inner_linear_ractionbar);
inner.setMinimumWidth(getWidth() * 2 / 10);
// we will set our textview to center and display there some text
TextView t = (TextView) linearLayout.findViewById(R.id.center_text);
t.setWidth(getWidth() * 6 / 10);
Button b = (Button) linearLayout.findViewById(R.id.edit_button);
b.setWidth(getWidth() *3/ 20);
ImageButton imageButton = (ImageButton) linearLayout.findViewById(R.id.action_bar_delete_item);
imageButton.setMinimumWidth(deviceUtils.getWidth() / 20);
Et voici la méthode getWidth ():
public int getWidth() {
DisplayMetrics dm = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
Code Java:
écrivez ceci dans onCreate()getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(R.layout.action_bar);
Et pour votre vue personnalisée, utilisez simplement FrameLayout, East peasy!
Android.soutien.v7.widget.Barre d'outils est une autre option
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center_vertical"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/app_name"
android:textColor="@color/black"
android:id="@+id/textView" />
</FrameLayout>
J'ai eu le même problème, et à cause du bouton "Accueil" ajouté automatiquement dans la barre d'outils, mon texte n'a pas été entré exactement.
Je l'ai corrigé de la manière sale mais cela fonctionne bien dans mon cas. J'ai simplement ajouté une marge à droite de mon TextView pour compenser le bouton d'accueil sur la gauche. Voici ma mise en page de la barre d'outils:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:elevation="1dp"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
android:gravity="center"
android:background="@color/mainBackgroundColor"
android:fitsSystemWindows="true" >
<com.lunabee.common.utils.LunabeeShadowTextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="?attr/actionBarSize"
android:gravity="center"
style="@style/navigation.toolbar.title" />
</android.support.v7.widget.Toolbar>
Vous pouvez forcer la barre d'outils en enveloppant le titre et le niveau de remplissage droit qui a le remplissage gauche par défaut pour le titre. Que de mettre la couleur d'arrière-plan au parent de la barre d'outils et de cette façon la partie qui est découpée en enveloppant le titre est de la même couleur(blanc dans mon exemple):
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="wrap_content"
android:layout_height="56dp"
android:layout_gravity="center_horizontal"
android:paddingEnd="15dp"
android:paddingRight="15dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:titleTextColor="@color/black"/>
</android.support.design.widget.AppBarLayout>
La Solution est basée sur ces choses:
- vous devez utiliser votre propre classe qui étend Toolbar (support.v7.widget.barre d'outils)
- vous devez remplacer une méthode Toolbar # addView
Que fait-il:
Lorsque la première barre d'outils exécute # setTitle, elle crée AppCompatTextView et l'utilise pour afficher le texte du titre.
Lorsque AppCompatTextView est créé, toolbar (en tant que ViewGroup), l'ajoute dans sa propre hiérarchie avec #addView méthode.
En outre, en essayant de trouver une solution, j'ai remarqué que textview avait une largeur de mise en page définie sur "wrap_content", alors j'ai décidé de le rendre "match_parent" et d'assigner textalignment à "center".
MyToolbar.kt, sauter des choses sans rapport (constructeurs / importations):
class MyToolbar : Toolbar {
override fun addView(child: View, params: ViewGroup.LayoutParams) {
if (child is TextView) {
params.width = ViewGroup.LayoutParams.MATCH_PARENT
child.textAlignment= View.TEXT_ALIGNMENT_CENTER
}
super.addView(child, params)
}
}
"Effets secondaires" possibles-cela s'appliquera aussi au" sous-titre "