Ich versuche, den richtigen Weg zu finden, um eine benutzerdefinierte Schriftart für den Titel der Symbolleiste zu verwenden und sie in der Symbolleiste zu zentrieren (Clientanforderung).
Im Moment verwende ich die gute alte ActionBar. Ich habe den Titel auf einen leeren Wert gesetzt und setCustomView
verwendet, um meine benutzerdefinierte Schriftart TextView zu platzieren und sie mit ActionBar.LayoutParams zu zentrieren.
Gibt es einen besseren Weg, das zu tun? Verwenden der neuen Symbolleiste als meine Aktionsleiste.
Um einen benutzerdefinierten Titel in Ihrer Toolbar
zu verwenden, müssen Sie sich lediglich daran erinnern, dass Toolbar
nur eine fantastische ViewGroup ist.
<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="Toolbar Title"
Android:layout_gravity="center"
Android:id="@+id/toolbar_title" />
</Android.support.v7.widget.Toolbar>
Dies bedeutet, dass Sie die TextView
beliebig gestalten können, da es sich um eine reguläre TextView
handelt. So können Sie in Ihrer Aktivität auf den Titel wie folgt zugreifen:
Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
Der Toolbar-Titel ist anpassbar. Jede von Ihnen vorgenommene Anpassung muss im Design vorgenommen werden. Ich gebe dir ein Beispiel.
Werkzeugleistenlayout:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar
style="@style/ToolBarStyle.Event"
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="?attr/colorPrimary"
Android:minHeight="@dimen/abc_action_bar_default_height_material" />
Styles:
<style name="ToolBarStyle" parent="ToolBarStyle.Base"/>
<style name="ToolBarStyle.Base" parent="">
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>
<style name="ToolBarStyle.Event" parent="ToolBarStyle">
<item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item>
</style>
<style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
<!--Any text styling can be done here-->
<item name="Android:textStyle">normal</item>
<item name="Android:textSize">@dimen/event_title_text_size</item>
</style>
Dies ist nur zur Hilfe, um alle Teile mit @ MrEngineer13 answer zu verbinden - mit @Jonik und @Rick Sanchez-Kommentaren mit der richtigen Reihenfolge, um zu helfen, den Titel leicht zu erreichen !!
Das Layout mit TextAppearance.AppCompat.Widget.ActionBar.Title
:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
Android:id="@+id/toolbar_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
Android:layout_gravity="center" />
</Android.support.v7.widget.Toolbar>
Der Weg mit der richtigen Reihenfolge zu erreichen:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar);
mTitle.setText(toolbar.getTitle());
getSupportActionBar().setDisplayShowTitleEnabled(false);
Vergessen Sie nicht, @ MrEngineer13 eine Antwort zu erhalten !!!
Hier ist ein Beispielprojekt ToolbarCenterTitleSample
Hoffe, jemand anderem zu helfen;)
wir haben keinen direkten Zugriff auf den ToolBar-Titel TextView. Daher verwenden wir Reflection, um darauf zuzugreifen.
private TextView getActionBarTextView() {
TextView titleTextView = null;
try {
Field f = mToolBar.getClass().getDeclaredField("mTitleTextView");
f.setAccessible(true);
titleTextView = (TextView) f.get(mToolBar);
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}
return titleTextView;
}
Hier ist der Titeltext-abhängige Ansatz, um TextView
Instanz aus Toolbar
zu finden.
public static TextView getToolbarTitleView(ActionBarActivity activity, Toolbar toolbar){
ActionBar actionBar = activity.getSupportActionBar();
CharSequence actionbarTitle = null;
if(actionBar != null)
actionbarTitle = actionBar.getTitle();
actionbarTitle = TextUtils.isEmpty(actionbarTitle) ? toolbar.getTitle() : actionbarTitle;
if(TextUtils.isEmpty(actionbarTitle)) return null;
// can't find if title not set
for(int i= 0; i < toolbar.getChildCount(); i++){
View v = toolbar.getChildAt(i);
if(v != null && v instanceof TextView){
TextView t = (TextView) v;
CharSequence title = t.getText();
if(!TextUtils.isEmpty(title) && actionbarTitle.equals(title) && t.getId() == View.NO_ID){
//Toolbar does not assign id to views with layout params SYSTEM, hence getId() == View.NO_ID
//in same manner subtitle TextView can be obtained.
return t;
}
}
}
return null;
}
Definieren Sie die folgende Klasse:
public class CenteredToolbar extends Toolbar {
private TextView centeredTitleTextView;
public CenteredToolbar(Context context) {
super(context);
}
public CenteredToolbar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public CenteredToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setTitle(@StringRes int resId) {
String s = getResources().getString(resId);
setTitle(s);
}
@Override
public void setTitle(CharSequence title) {
getCenteredTitleTextView().setText(title);
}
@Override
public CharSequence getTitle() {
return getCenteredTitleTextView().getText().toString();
}
public void setTypeface(Typeface font) {
getCenteredTitleTextView().setTypeface(font);
}
private TextView getCenteredTitleTextView() {
if (centeredTitleTextView == null) {
centeredTitleTextView = new TextView(getContext());
centeredTitleTextView.setTypeface(...);
centeredTitleTextView.setSingleLine();
centeredTitleTextView.setEllipsize(TextUtils.TruncateAt.END);
centeredTitleTextView.setGravity(Gravity.CENTER);
centeredTitleTextView.setTextAppearance(getContext(), R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);
Toolbar.LayoutParams lp = new Toolbar.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER;
centeredTitleTextView.setLayoutParams(lp);
addView(centeredTitleTextView);
}
return centeredTitleTextView;
}
}
... und verwenden Sie es statt wie üblich Toolbar
wie folgt:
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/colorAccent">
<your.packagename.here.CenteredToolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimary"
Android:minHeight="?attr/actionBarSize"
Android:theme="?attr/actionBarTheme"
app:title="@string/reset_password_page_title"/>
<!-- Other views -->
</RelativeLayout>
Sie benötigen diese 2 Codezeilen immer noch in Ihrer Activity
(wie beim Standard Toolbar
):
Toolbar toolbar = (Toolbar) findViewByid(R.id.toolbar); // note that your activity doesn't need to know that it is actually a custom Toolbar
setSupportActionBar(binding.toolbar);
Das ist es! Sie müssen den linksbündigen Standardtitel nicht ausblenden, Sie müssen denselben XML-Code nicht immer wieder duplizieren usw., verwenden Sie einfach CenteredToolbar
, als wäre es der Standardwert Toolbar
. Sie können Ihren benutzerdefinierten Zeichensatz auch programmgesteuert festlegen, da Sie jetzt direkten Zugriff auf TextView
haben. Hoffe das hilft.
Niemand hat das erwähnt, aber es gibt einige Attribute für Toolbar
:
app:titleTextColor
zum Einstellen der Titeltextfarbe
app:titleTextAppearance
zum Einstellen des Titeltexts
app:titleMargin
zur Einstellung des Randes
Und es gibt andere Margen auf der spezifischen Seite wie marginStart
usw.
Ich verwende diese Lösung:
static void centerToolbarTitle(@NonNull final Toolbar toolbar) {
final CharSequence title = toolbar.getTitle();
final ArrayList<View> outViews = new ArrayList<>(1);
toolbar.findViewsWithText(outViews, title, View.FIND_VIEWS_WITH_TEXT);
if (!outViews.isEmpty()) {
final TextView titleView = (TextView) outViews.get(0);
titleView.setGravity(Gravity.CENTER);
final Toolbar.LayoutParams layoutParams = (Toolbar.LayoutParams) titleView.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
toolbar.requestLayout();
//also you can use titleView for changing font: titleView.setTypeface(Typeface);
}
}
public class TestActivity extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_test);
toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
setSupportActionBar(toolbar);
customizeToolbar(toolbar);
}
public void customizeToolbar(Toolbar toolbar){
// Save current title and subtitle
final CharSequence originalTitle = toolbar.getTitle();
final CharSequence originalSubtitle = toolbar.getSubtitle();
// Temporarily modify title and subtitle to help detecting each
toolbar.setTitle("title");
toolbar.setSubtitle("subtitle");
for(int i = 0; i < toolbar.getChildCount(); i++){
View view = toolbar.getChildAt(i);
if(view instanceof TextView){
TextView textView = (TextView) view;
if(textView.getText().equals("title")){
// Customize title's TextView
Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.CENTER_HORIZONTAL;
textView.setLayoutParams(params);
// Apply custom font using the Calligraphy library
Typeface typeface = TypefaceUtils.load(getAssets(), "fonts/myfont-1.otf");
textView.setTypeface(typeface);
} else if(textView.getText().equals("subtitle")){
// Customize subtitle's TextView
Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.CENTER_HORIZONTAL;
textView.setLayoutParams(params);
// Apply custom font using the Calligraphy library
Typeface typeface = TypefaceUtils.load(getAssets(), "fonts/myfont-2.otf");
textView.setTypeface(typeface);
}
}
}
// Restore title and subtitle
toolbar.setTitle(originalTitle);
toolbar.setSubtitle(originalSubtitle);
}
}
Ohne die Symbolleiste TextView können wir die Schrift mithilfe des folgenden Codes anpassen
getSupportActionBar().setDisplayShowTitleEnabled(false);
or
getActionBar().setDisplayShowTitleEnabled(false);
public void updateActionbar(String title){
SpannableString spannableString = new SpannableString(title);
spannableString.setSpan(new TypefaceSpanString(this, "futurastdmedium.ttf"),
0, spannableString.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mToolbar.setTitle(spannableString);
}
Layout:
<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="match_parent"
Android:layout_height="wrap_content"
Android:text="Toolbar Title"
Android:layout_gravity="center"
Android:gravity="center"
Android:id="@+id/toolbar_title" />
</Android.support.v7.widget.Toolbar>
Code:
Toolbar mToolbar = parent.findViewById(R.id.toolbar_top);
TextView mToolbarCustomTitle = parent.findViewById(R.id.toolbar_title);
//setup width of custom title to match in parent toolbar
mToolbar.postDelayed(new Runnable()
{
@Override
public void run ()
{
int maxWidth = mToolbar.getWidth();
int titleWidth = mToolbarCustomTitle.getWidth();
int iconWidth = maxWidth - titleWidth;
if (iconWidth > 0)
{
//icons (drawer, menu) are on left and right side
int width = maxWidth - iconWidth * 2;
mToolbarCustomTitle.setMinimumWidth(width);
mToolbarCustomTitle.getLayoutParams().width = width;
}
}
}, 0);
Sie können wie folgt verwenden
<Android.support.v7.widget.Toolbar
Android:id="@+id/top_actionbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppThemeToolbar">
<TextView
Android:id="@+id/pageTitle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
/>
</Android.support.v7.widget.Toolbar>
Lösung, die ich für dieses Problem verwendet habe:
public static void applyFontForToolbarTitle(Activity a){
Toolbar toolbar = (Toolbar) a.findViewById(R.id.app_bar);
for(int i = 0; i < toolbar.getChildCount(); i++){
View view = toolbar.getChildAt(i);
if(view instanceof TextView){
TextView tv = (TextView) view;
if(tv.getText().equals(a.getTitle())){
tv.setTypeface(getRuneTypefaceBold(a));
break;
}
}
}
}
Ich denke, für die Schwerpunktsschwerpunktposition müsste es notwendig sein, die Layoutparameter zu ändern, um match_parent horizontal anzupassen und dann:
tv.setGravity(Gravity.CENTER);
Ich weiß nicht, ob sich in der Appcompat-Bibliothek etwas geändert hat, aber es ist ziemlich trivial, kein Nachdenken.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// loop through all toolbar children right after setting support
// action bar because the text view has no id assigned
// also make sure that the activity has some title here
// because calling setText() with an empty string actually
// removes the text view from the toolbar
TextView toolbarTitle = null;
for (int i = 0; i < toolbar.getChildCount(); ++i) {
View child = toolbar.getChildAt(i);
// assuming that the title is the first instance of TextView
// you can also check if the title string matches
if (child instanceof TextView) {
toolbarTitle = (TextView)child;
break;
}
}
Ich habe diese Lösung gelöst, und dies ist folgende Codes:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" >
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Order History"
Android:layout_gravity="center"
Android:id="@+id/toolbar_title"
Android:textSize="17sp"
Android:textStyle="bold"
Android:textColor="@color/colorWhite"
/>
</Android.support.v7.widget.Toolbar>
Und Sie können Titel/Beschriftung ändern, unter Aktivität einen der folgenden Codes schreiben:
Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById (R.id.toolbar_title);
Eine sehr quick - und easy - Methode zum Festlegen einer benutzerdefinierten Schriftart besteht in der Verwendung einer benutzerdefinierten titleTextAppearance
mit einer fontFamily
:
Hinzufügen zu styles.xml:
<style name="ToolbarTitle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="Android:textSize">16sp</item>
<item name="Android:textColor">#FF202230</item>
<item name="Android:fontFamily">@font/varela_round_regular</item>
</style>
Erstellen Sie in Ihrem Ordner res einen Ordner font (Beispiel: varela_round_regular.ttf
Lesen Sie den offiziellen Leitfaden, um mehr zu erfahren https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html
Versuchen Sie, Toolbar und Tittle in einer separaten Ansicht anzuzeigen. Sehen Sie sich das rechte Ende an und geben Sie ihnen das Gewicht der Symbolleiste. Auf diese Weise kommt Ihr Tittle in die Mitte.
<Android.support.design.widget.AppBarLayout
Android:id="@+id/app_bar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay"
Android:background="@color/white_color">
<LinearLayout
Android:id="@+id/toolbar_layout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/white_color">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="0dp"
Android:layout_height="?attr/actionBarSize"
Android:background="@color/white_color"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
Android:layout_weight="0.2"
app:contentInsetStartWithNavigation="0dp"
app:navigationIcon="@color/greyTextColor">
</Android.support.v7.widget.Toolbar>
<com.an.customfontview.CustomTextView
Android:id="@+id/headingText"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="0.6"
Android:gravity="center"
Android:text="Heading"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true"
Android:textColor="@color/colorPrimary"
Android:textSize="@dimen/keyboard_number"
Android:layout_gravity="center_horizontal|center_vertical"
app:textFontPath="fonts/regular.ttf" />
<ImageView
Android:id="@+id/search_icon"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_alignParentEnd="true"
Android:layout_centerVertical="true"
Android:visibility="visible"
Android:layout_weight="0.2"
Android:layout_gravity="center_horizontal|center_vertical"
Android:src="@drawable/portfolio_icon"/>
</LinearLayout>
</Android.support.design.widget.AppBarLayout>
Update von @ MrEngineer13's Antwort: Um die Titelmitte in jedem Fall einschließlich Hamburger Symbol und Optionsmenüs auszurichten, können Sie eine FrameLayout
in der Symbolleiste wie folgt hinzufügen:
<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" >
<FrameLayout Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Toolbar Title"
Android:layout_gravity="center"
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
Android:id="@+id/toolbar_title" />
</FrameLayout>
</Android.support.v7.widget.Toolbar>
Da Android.support.v7.appcompat 24.2
Toolbar
die Methode setTitleTextAppearance
hat und Sie deren Schriftart ohne externe textview
einstellen können.
erstellen Sie einen neuen Stil in styles.xml
<style name="RobotoBoldTextAppearance">
<item name="Android:fontFamily">@font/roboto_condensed_bold</item>
</style>
und benutze es
mToolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);
Ich hatte das gleiche Problem, das durch die Ausführung in MainActivity behoben wurde
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
Und im Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (view == null) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_example, container, false);
init();
}
getActivity().setTitle("Choose Fragment");
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.example_menu, menu);
}
Das Hinzufügen einer Textansicht zur Symbolleiste kann zwar das Problem der Einschränkung des Titelstylings lösen, es gibt jedoch ein Problem. Da wir es nicht zu einem Layout hinzufügen, haben wir nicht zu viel Kontrolle über seine Breite. Wir können entweder wrap_content oder match_parent verwenden.
Betrachten wir nun ein Szenario, in dem sich eine searchView als Schaltfläche am rechten Rand der Symbolleiste befindet. Wenn der Titel mehr enthält, wird er über der Schaltfläche angezeigt, die ihn verdeckt. Es gibt keine Möglichkeit, dies zu kontrollieren, indem Sie dem Etikett eine Breite zuweisen, und Sie möchten dies nicht tun, wenn Sie ein responsives Design wünschen.
Hier ist eine Lösung, die für mich funktioniert hat, die sich etwas vom Hinzufügen einer Textansicht zur Symbolleiste unterscheidet. Fügen Sie stattdessen die Symbolleiste und die Textansicht einem relativen Layout hinzu und stellen Sie sicher, dass sich die Textansicht über der Symbolleiste befindet. Dann können wir geeignete Ränder verwenden und sicherstellen, dass die Textansicht dort angezeigt wird, wo sie angezeigt werden soll.
Stellen Sie sicher, dass Sie die Symbolleiste so einstellen, dass der Titel nicht angezeigt wird.
Hier ist das XML für diese Lösung:
<RelativeLayout
Android:orientation="horizontal"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimary">
<Android.support.v7.widget.Toolbar
Android:theme="@style/ThemeOverlay.AppCompat.Dark"
Android:id="@+id/activity_toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
Android:titleTextAppearance="@style/AppTheme.TitleTextView"
Android:layout_marginRight="40dp"
Android:layoutMode="clipBounds">
<Android.support.v7.widget.SearchView
Android:id="@+id/search_view"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="right"
Android:layout_centerVertical="true"
Android:layout_alignParentRight="true"
Android:foregroundTint="@color/white" />
</Android.support.v7.widget.Toolbar>
<TextView
Android:id="@+id/toolbar_title"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginRight="90dp"
Android:text="@string/app_name"
Android:textSize="@dimen/title_text_size"
Android:textColor="@color/white"
Android:lines="1"
Android:layout_marginLeft="72dp"
Android:layout_centerVertical="true" />
</RelativeLayout>
Behebt das oben erwähnte Problem @ ankur-chaudhary.
***To use a custom title in your Toolbar you can add a custom title like** :*
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
Android:elevation="5dp"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark">
<LinearLayout
Android:id="@+id/lnrTitle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:gravity="center_horizontal"
Android:orientation="vertical">
<TextView
Android:id="@+id/txvHeader"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal|center"
Android:gravity="center"
Android:ellipsize="end"
Android:maxLines="1"
Android:text="Header"
Android:textColor="@color/white"
Android:textSize="18sp" />
</LinearLayout>
</Android.support.v7.widget.Toolbar>
**Define Toolbar id in Activity Like:**
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() == null)
return;
getSupportActionBar().setTitle("Title");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Versuchen
@Override
public void onBackPressed() {
if(getTitle().equals(getResources().getString(R.string.app_name))) {
super.onBackPressed();}
else {
//set visiblity
}
}
Ich habe mehrere Tage lang nach einer universellen Lösung gesucht. Meine Symbolleiste für das Android-Menü und das Nav-Symbol.
Zuerst müssen Sie eine benutzerdefinierte Symbolleistenklasse erstellen. Diese Klasse muss über Titel zentrierte Positionen (Auffüllungen) verfügen:
class CenteredToolbar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: Toolbar(context, attrs, defStyleAttr) {
init {
addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {
val titleTextView = findViewById<TextView>(R.id.centerTitle)
val x = titleTextView.x.toInt()
val x2 = x + titleTextView.width
val fullWidth = width
val fullCenter = fullWidth / 2
val offsetLeft = Math.abs(fullCenter - x)
val offsetRight = Math.abs(x2 - fullCenter)
val differOffset = Math.abs(offsetLeft - offsetRight)
if (offsetLeft > offsetRight) {
titleTextView.setPadding(differOffset, 0, 0, 0)
} else if (offsetRight > offsetLeft) {
titleTextView.setPadding(0, 0, differOffset, 0)
}
removeOnLayoutChangeListener(this)
}
})
}
override fun setTitle(resId: Int) = getTitleView().setText(resId)
override fun setTitle(title: CharSequence?) = getTitleView().setText(title)
fun getTitleView(): TextView = findViewById(R.id.centerTitle)
}
Zweitens benötigen Sie eine Layout-Symbolleiste:
<CenteredToolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/toolbar">
<TextView
Android:id="@+id/centerTitle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
</CenteredToolbar>
Das ist alles
Sie können eine benutzerdefinierte TextView
in der Symbolleiste folgendermaßen anzeigen:
<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="Title"
Android:layout_gravity="center"
Android:id="@+id/toolbar_title" />
</Android.support.v7.widget.Toolbar>
Dadurch wird der Text zentriert. Wenn Sie einer normalen Toolbar
eine benutzerdefinierte Schriftart hinzufügen möchten, erstellen Sie einen <style>
:
<style Android:name="ToolbarFont">
<item Android:fontFamily = "@font/fontName" />
</style>
Und füge es der Symbolleiste hinzu:
toolbar.setTitleTextAppearance(this, R.style.ToolbarFont);
Für die Textansicht in der Symbolleiste können Sie sie mit dem Attribut fontFamily
definieren:
<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="Title"
Android:layout_gravity="center"
Android:id="@+id/toolbar_title"
Android:fontFamily="@font/fontFamily" />
</Android.support.v7.widget.Toolbar>
Sie müssen nur die folgende Zeile in Ihr Symbolleistenlayout einfügen:
app:contentInsetStart="0dp"
Wie ich es sehe, haben Sie zwei Möglichkeiten:
1) Bearbeiten Sie die Symbolleiste XML. Wenn Ihre Toolbar in XML eingefügt wird, sieht das normalerweise so aus:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:elevation="4dp"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
wenn Sie es anpassen möchten, entfernen Sie einfach das '/' am Ende und machen es so:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:elevation="4dp"
app:popupTheme="@style/AppTheme.PopupOverlay">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ImageView
Android:id="@+id/toolbar_iv"
Android:layout_width="30dp"
Android:layout_height="30dp"
Android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
Android:id="@+id/toolbar_tv"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_marginLeft="20dp"
Android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/toolbar_iv"
app:layout_constraintTop_toTopOf="parent" />
</Android.support.constraint.ConstraintLayout>
</Android.support.v7.widget.Toolbar>
auf diese Weise können Sie eine Symbolleiste haben und die Textansicht und das Logo anpassen.
2) Ändern Sie programmgesteuert die native Textansicht und das Symbol:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setIcon(R.drawable.ic_question_mark);
getSupportActionBar().setTitle("Title");
Stellen Sie sicher, dass Ihre Symbolleiste nicht NULL ist, bevor Sie irgendetwas darin festlegen.
Einstellung Android:gravity="center"
hat für mich gearbeitet
Kein Styling nichts. Die Symbolleiste ist im Grunde eine ViewGroup
. Alles was Sie tun müssen, ist die Schwerkraft der Elemente darin festzulegen.
<Android.support.v7.widget.Toolbar
Android:id="@+id/htab_toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:layout_gravity="top"
Android:background="@color/partial_transparent"
Android:gravity="center"
app:layout_collapseMode="pin"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
für benutzerdefinierte Schriftarten in der Symbolleiste können Sie textView-Schriftarten im Stil überschreiben. Anschließend wird jede Textansicht in Ihrer App sowie die Symbolleisten-Titelschriftart automatisch geändert Ich habe sie in Android studio 3.1.3 getestet.
im stil tun sie es:
<style name="defaultTextViewStyle" parent="Android:Widget.TextView">
<item name="Android:fontFamily">@font/your_custom_font</item>
</style>
und dann in Ihrem Thema verwenden Sie dies:
<item name="Android:textViewStyle">@style/defaultTextViewStyle</item>
Ich habe einen anderen Weg gefunden, um benutzerdefinierte Symbolleisten ohne zusätzlichen Java/Kotlin-Code hinzuzufügen.
Erstens: Erstellen Sie ein XML mit Ihrem benutzerdefinierten Symbolleistenlayout mit AppBarLayout als übergeordnetem Element:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.AppBarLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
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="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<ImageView
Android:layout_width="80dp"
Android:layout_height="wrap_content"
Android:layout_gravity="right"
Android:layout_marginEnd="@dimen/magin_default"
Android:src="@drawable/logo" />
</Android.support.v7.widget.Toolbar>
Zweitens: Fügen Sie die Symbolleiste in Ihr Layout ein:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/blue"
tools:context=".app.MainAcitivity"
tools:layout_editor_absoluteY="81dp">
<include
layout="@layout/toolbar_inicio"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- Put your layout here -->
</Android.support.constraint.ConstraintLayout>
private void makeTitleCenter(String title, Toolbar toolbar) {
if (title != null && !TextUtils.isEmpty(title.trim())) {
final String tag = " ";
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(tag);
}
TextView titleTv = null;
View leftBtn = null;
for (int i = 0; i < toolbar.getChildCount(); i++) {
View view = toolbar.getChildAt(i);
CharSequence text = null;
if (view instanceof TextView && (text = ((TextView) view).getText()) != null && text.equals(tag)) {
titleTv = (TextView) view;
} else if (view instanceof ImageButton) {
leftBtn = view;
}
}
if (titleTv != null) {
final TextView fTitleTv = titleTv;
final View fLeftBtn = leftBtn;
fTitleTv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
fTitleTv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int leftWidgetWidth = fLeftBtn != null ? fLeftBtn.getWidth() : 0;
fTitleTv.setPadding(DimenUtil.getResources().getDisplayMetrics().widthPixels / 2 - leftWidgetWidth - fTitleTv.getWidth() / 2, 0, 0, 0);
fTitleTv.requestLayout();
}
});
}
}
}
In XML versuchen Sie folgendes:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
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="Toolbar Title"
Android:layout_gravity="center"
Android:id="@+id/toolbar_title" />
</Android.support.v7.widget.Toolbar>
In Code:
Toolbar myToolbar= (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) mytoolbar.findViewById(R.id.toolbar_title);