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.
Sie können ein benutzerdefiniertes Layout erstellen und auf die Aktionsleiste anwenden.
Folgen Sie dazu diesen zwei einfachen Schritten:
Java-Code
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.actionbar);
Dabei ist R.layout.actionbar
das folgende Layout.
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");
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>
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);
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);
}
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>
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>
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>
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;
}
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>
die Lösung basiert auf diesen Dingen:
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"
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>