wake-up-neo.net

So richten Sie den Titel in der Mitte von ActionBar im Standarddesign (Theme.Holo.Light)

Ich habe viel gesucht, finde aber keinen Weg. Wie kann ich dann den Titel im Zentrum von ActionBar anstatt linksbündig setzen. Ich habe den folgenden Code verwendet, um den Titel in der Mitte zu setzen:

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);

Aber es gibt einen Fehler wie folgt:

ClassCastException : com.Android.internal.widget.ActionBarView can not 
be cast to Android.widget.TextView.

Jede andere Lösung. Jede Hilfe wird geschätzt.

41
Ponting

Sie können ein benutzerdefiniertes Layout erstellen und auf die Aktionsleiste anwenden.

Folgen Sie dazu diesen zwei einfachen Schritten:

  1. Java-Code

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

Dabei ist R.layout.actionbar das folgende Layout.

  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>
    

Es kann so komplex sein, wie Sie möchten. Versuch es!

BEARBEITEN:

Um die Variable background einzustellen, können Sie die Eigenschaft Android:background im Container-Layout (in diesem Fall LinearLayout) verwenden. Möglicherweise müssen Sie die Layouthöhe Android:layout_height auf match_parent anstelle von wrap_content einstellen. 

Darüber hinaus können Sie auch einLOGO/ICONhinzufügen. Fügen Sie dazu einfach ein ImageView in Ihr Layout hinzu und setzen Sie die Layout-Ausrichtung Android:orientation auf horizontal (oder verwenden Sie einfach ein RelativeLayout und verwalten Sie es selbst).

So ändern Sie den Titel der benutzerdefinierten Aktionsleiste dynamisch: 

TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName()));
title.setText("Your Text Here");
119

Schauen Sie sich die neue Symbolleiste in der Support-Bibliotheksklasse im Lollipop-Update an. Sie können eine Aktionsleiste entwerfen, indem Sie eine Symbolleiste in Ihr Layout einfügen

fügen Sie diese Elemente in Ihrem App-Design hinzu

 <item name="Android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>

Erstellen Sie Ihre Symbolleiste in einem Layout und fügen Sie Ihre Textansicht in die Mitte ein, um die Symbolleiste zu gestalten 

<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>

fügen Sie Ihre Aktionsleiste als Werkzeugleiste hinzu

 toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }

bitte stellen Sie sicher, dass Sie die Symbolleiste in Ihre Ressourcendatei so einfügen müssen

<?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
Jinu

Es scheint, dass dies ohne benutzerdefinierte Ansicht nicht möglich ist. Sie können die Titelansicht erhalten:

View decor = getWindow().getDecorView();
TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "Android"));

Das Ändern von gravity oder layout_gravity hat jedoch keine Auswirkungen. .__ Das Problem in der ActionBarView, das die untergeordneten Elemente von sich aus so gestaltet, dass das Ändern von Layoutparametern der untergeordneten Elemente ebenfalls keine Auswirkung hat, wirkt sich nicht aus.

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
esentsov

Ich weiß, dass meine Antwort nicht pünktlich ist, aber dies ist ein reiner Code, der keine xml benötigt .
Dies ist zur Verwendung in 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);
}


Dies ist zur Verwendung in 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);
}
4
Umar Ata

wenn Sie die Symbolleiste verwenden, klicken Sie einfach auf Hinzufügen

Android:layout_gravity="center_horizontal"

Unter der Symbolleiste Genau wie dieses Snippet

 <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
Darshan Khatri

Das funktioniert eigentlich:

 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;

Sie müssen das Layout custom_actionbar.xml definieren, das Ihren Anforderungen entspricht, z. :

<?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
Roshan Ramtel

Java-Code: Schreiben Sie diesen in onCreate ()
getSupportActionBar().setDisplayShowCustomEnabled(true);getSupportActionBar().setCustomView(R.layout.action_bar);

und für Ihre benutzerdefinierte Ansicht verwenden Sie einfach FrameLayout, east peasy!
Android.support.v7.widget.Toolbar ist eine weitere 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
Amir

Ich denke, durch das Positionieren von Ansichten auf der Aktionsleiste erreichen Sie das, was Sie möchten. Auf dem Layout der Aktionsleiste, wenn die Layout-Parameter auf das übergeordnete Element eingestellt sind, passt es nicht zur vollen Breite .__ funktioniert wie layout_weight = "value") wir können unsere Sicht dort setzen, wo wir wollen:

    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);

und hier ist die getWidth () -Methode:

 public int getWidth() { 
    DisplayMetrics dm = new DisplayMetrics();
     mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm);
    return dm.widthPixels; 
   }
1
support_ms

Sie können die Symbolleiste erzwingen, indem Sie den Titel und den rechten Rechtsabstand umschließen, für den der Titel standardmäßig hinterlegt ist. Dann füge die Hintergrundfarbe für das übergeordnete Element der Symbolleiste ein, und der Teil, der durch Umbrechen des Titels ausgeschnitten wird, hat dieselbe Farbe (in meinem Beispiel weiß):

<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
tompadre

die Lösung basiert auf diesen Dingen:

  • sie müssen Ihre eigene Klasse verwenden, die die Toolbar erweitert (support.v7.widget.toolbar). 
  • sie müssen eine Methode Toolbar # addView überschreiben

was tut es: 

wenn die Werkzeugleiste zum ersten Mal #setTitle ausführt, erstellt sie AppCompatTextView und verwendet sie zur Anzeige des Titeltextes.

wenn die AppCompatTextView erstellt wurde, fügt die Symbolleiste (als ViewGroup) sie mit der # addView-Methode ihrer eigenen Hierarchie hinzu.

während ich versuchte, eine Lösung zu finden, bemerkte ich, dass für die Textansicht die Layoutbreite auf "wrap_content" festgelegt wurde. Daher entschied ich mich, sie als "match_parent" festzulegen und die Textausrichtung "center" zuzuweisen. 

MyToolbar.kt, Überspringen von nicht zusammenhängendem Material (Konstruktoren/Importe):

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)
  }
}

mögliche "Nebenwirkungen" - dies gilt auch für "Untertitel"

0
dmz9

Ich hatte das gleiche Problem und aufgrund der automatisch in der Symbolleiste hinzugefügten Schaltfläche "Start" wurde mein Text nicht exakt eingegeben.

Ich habe es auf schmutzige Weise repariert, aber es funktioniert gut in meinem Fall. Ich habe einfach einen Rand rechts von meinem TextView hinzugefügt, um den Home-Button links zu kompensieren. Hier ist mein Layout der Symbolleiste:

<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
Olivier Berni