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.

39
demandé sur Ponting 2013-08-24 16:35:44

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:

  1. Code Java

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.actionbar);
    

R.layout.actionbar est la disposition suivante.

  1. 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");
114
répondu Stefano Munarini 2017-01-26 12:53:07

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);
7
répondu esentsov 2013-08-28 14:26:24

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>
7
répondu Jinu 2015-01-12 10:22:47

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);
}
3
répondu Umar Ata 2016-10-06 13:32:40

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>
3
répondu Darshan Khatri 2018-04-23 09:09:26

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>
2
répondu Roshan Ramtel 2015-10-05 06:25:27

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; 
   }
1
répondu support_ms 2014-05-24 06:03:45

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>
1
répondu Amir 2015-05-24 09:19:39

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>
0
répondu Olivier Berni 2015-12-10 16:02:11

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>
0
répondu tompadre 2017-02-03 19:59:41

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 "

0
répondu dmz9 2018-06-06 16:07:31