Tiêu đề trung tâm thanh công cụ Android và phông chữ tùy chỉnh


366

Tôi đang cố gắng tìm ra cách đúng để sử dụng phông chữ tùy chỉnh cho tiêu đề thanh công cụ và căn giữa nó trong thanh công cụ (yêu cầu của máy khách).

Hiện tại, tôi đang sử dụng ActionBar cũ và tôi đang đặt tiêu đề thành giá trị trống và sử dụng setCustomViewđể đặt TextView phông chữ tùy chỉnh của mình và căn giữa nó bằng ActionBar.LayoutParams.

Có cách nào tốt hơn để làm điều đó? Sử dụng Thanh công cụ mới làm ActionBar của tôi.

Câu trả lời:


718

Để sử dụng một tiêu đề tùy chỉnh trong Toolbartất cả những gì bạn cần làm là hãy nhớ rằng đó Toolbarchỉ là một Viewgroup ưa thích để bạn có thể thêm một tiêu đề tùy chỉnh như vậy:

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

Điều này có nghĩa là bạn có thể tạo kiểu theo cách TextViewbạn muốn bởi vì nó chỉ là thông thường TextView. Vì vậy, trong hoạt động của bạn, bạn có thể truy cập tiêu đề như vậy:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);

5
đề nghị sử dụng android: layout_creen = "quấn_content" android: layout_height = "quấn_content" android: layout_gravity = "centre" để thay thế.
SteelBytes

194
Nếu bất kỳ ai khác không thể xóa tiêu đề tên ứng dụng mặc định, hãy làm điều này: 1. Gọi setSupportActionBar (yourToolbar) 2. Gọi getSupportActionBar (). SetDisplayShowTitleEnabled (false);
Rick Sanchez

75
Để tiếp tục sử dụng các kiểu mặc định cho TextView tùy chỉnh, hãy thử một cái gì đó như style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"( xem câu trả lời này ).
Jonik

5
thêm android: paddingRight = "? attr / actionBarSize" có thể giúp căn giữa văn bản ở giữa màn hình của bạn trong trường hợp bạn có một nút (nhà, ngăn kéo điều hướng, v.v.)
Gordak

5
Điều gì sẽ xảy ra khi có biểu tượng Hamburger trên Thanh công cụ? Nó sẽ không ở giữa chiều rộng thanh công cụ hoàn chỉnh, nó sẽ nằm ở trung tâm của Thanh công cụWidth - HamburgerIconWidth .
Akshay

75

Tiêu đề ToolBar có thể tạo kiểu. Bất kỳ tùy chỉnh bạn thực hiện phải được thực hiện trong chủ đề. Tôi sẽ cho bạn một ví dụ.

Bố cục thanh công cụ:

<?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" />

Kiểu dáng:

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

59
Đây là cách chính xác. Thêm một cái khác TextViewlà một chút hack, nhưng câu trả lời phản ánh chỉ là xấu xa.
DariusL 24/07/2015

9
Sạch, nhưng bạn không thể đặt phông chữ tùy chỉnh từ kiểu. Thật đáng buồn.
niqueco

20
Bạn cũng không thể thay đổi sự liên kết của tiêu đề.
Terry

7
@ user1560102 không có gì khó khăn khi thêm TextView vào Thanh công cụ. Đó là những gì nó được thiết kế cho.
Tim Malseed

107
Điều này không tập trung vào văn bản.
Sebastian Roth

69

Đây chỉ là để giúp tham gia tất cả các phần bằng cách sử dụng câu trả lời @ MrEngineer13 với các bình luận @Jonik và @Rick Sanchez với thứ tự phù hợp để giúp đạt được tiêu đề một cách dễ dàng !!

Bố cục với 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>

Cách để đạt được với thứ tự đúng:

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

Xin đừng quên upvote @ MrEngineer13 trả lời !!!

Dưới đây là một dự án mẫu Thanh công cụCenterTitleSample

nhập mô tả hình ảnh ở đây

Hy vọng sẽ giúp được người khác;)


5
nếu tôi đặt setDisplayHomeAsUpEnables (true) và setDisplayShowHomeEnabled (true); để enalbe trở lại mũi tên. Sau đó, tiêu đề không phải là trung tâm. Tôi đã thử như cài đặt actionBar.setTitle (""); và setDisplayShowTitleEnables (sai). Nhưng vẫn không thể giải quyết vấn đề
Prashanth Debbadwar

Bạn đã thử nó cho một Scrolling Activity?
AN

đúng là với mũi tên lùi, tiêu đề không nằm ở giữa (nó lệch sang phải bằng một nửa chiều rộng của mũi tên lùi). Tôi cho rằng nếu tôi thực sự quyết tâm tôi sẽ lập trình thêm lề đủ vào bên phải hộp văn bản khi cần thiết để căn giữa văn bản.
Ai đó ở đâu đó vào

52

chúng tôi không có quyền truy cập trực tiếp vào TextView tiêu đề ToolBar vì vậy chúng tôi sử dụng sự phản chiếu để truy cập nó.

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

3
Mặc dù đây là hacky, giải pháp này hoạt động với tôi sau khi cố gắng tìm cách truy cập vào textview thanh công cụ. Cảm ơn bạn.
falc0nit3

1
Làm việc độc đáo cho Tiêu đề. Nhưng khi cố gắng để có được mSubtitleTextView như thế này, nó đã dẫn đến một ngoại lệ. Nguyên nhân do: java.lang.NullPulumException: Cố gắng gọi phương thức ảo 'void android.widget.TextView.setTypeface (android.graphics.Typeface)' trên tham chiếu đối tượng null
Vinod

5
Lưu ý: Bạn chỉ có thể truy cập vào trường "mTitleTextView", sau khi bạn đặt tiêu đề thanh công cụ! Các lĩnh vực là lười biếng khởi tạo bởi sử dụng đầu tiên của nó.
funcoder

2
Điều gì xảy ra nếu bạn làm xáo trộn mã của mình với ProGuard và mTitleTextViewtrở thành abcde12345?
voghDev

1
@voghDev getDeclaredField sẽ ném NoSuchFieldException trong trường hợp đó, dẫn đến mã không hoạt động.
Jeremy

30

Đây là cách tiếp cận phụ thuộc văn bản tiêu đề để tìm TextViewví dụ từ Toolbar.

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

28

Xác định lớp sau:

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

... và sau đó chỉ sử dụng nó thay vì thông thường Toolbarnhư thế này:

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

Bạn vẫn cần 2 dòng mã này trong Activity(như với tiêu chuẩn 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);

Đó là nó! Bạn không cần ẩn tiêu đề căn lề trái tiêu chuẩn, không cần lặp lại cùng một mã XML, v.v., chỉ cần sử dụng CenteredToolbarnhư nếu nó là mặc định Toolbar. Bạn cũng có thể đặt phông chữ tùy chỉnh theo chương trình vì bây giờ bạn có quyền truy cập trực tiếp vào TextView. Hi vọng điêu nay co ich.


1
Cảm ơn! Giải pháp tốt nhất, chỉ không quên nhập vào thanh công cụ "v7.widget"
David

Tôi biết điều này khá cũ nhưng ... làm cách nào để thay đổi màu văn bản? Tôi đã thử dùng XML với ứng dụng: titleTextColor và mã với tập trungTitleTextView.setColor. Có ý kiến ​​gì không, @fraggjkee?
Genaro Alberto Cancino Herrera

centeredTitleTextView.setTextColor(...)nên hoạt động
Fraggjkee

Có nên không LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)?
ngưỡng kích thích dưới

16

Không ai đề cập đến điều này, nhưng có một số thuộc tính cho Toolbar:

app:titleTextColor để đặt màu văn bản tiêu đề

app:titleTextAppearance để thiết lập giao diện văn bản tiêu đề

app:titleMargin để thiết lập lề

Và có các lề cụ thể khác như marginStart, v.v.


1
Giải pháp hoàn hảo .. nếu bạn biết về FontOverride , chỉ cần tạo kiểu trong <style name="customFontTextAppearanceStyle"> <item name="android:textSize">18sp</item> <item name="android:typeface">monospace</item> tệp kiểu tệp và áp dụng nó trên thanh công cụ app:titleTextAppearance="@styles/customFontTextAppearanceStyle"
Chinmay Thoriya

2
Tôi đã sử dụng phương pháp này nhưng không có gì xảy ra với thanh công cụ của tôi! tôi đã tạo một '<style>' mới và đặt nó app:titleTextAppearanc="style name" vào android.support.v7.widget.ToolbarTAG
AN

12

Tôi sử dụng giải pháp này:

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

1
Hoạt động rất tốt, nhưng vì một số lý do, nó không tập trung chính xác với các thanh công cụ không có nút mục.
Munib

1
Một bổ sung: nếu bạn có biểu tượng điều hướng hoặc biểu tượng quay lại trên thanh công cụ, tiêu đề không nằm chính xác ở giữa. Tôi thêm một biểu tượng menu cài đặt trống cho tình huống này. Mục menu trống của tôi là: <item android: id = "@ + id / blank" android: orderInC Category = "100" android: icon = "@ android: color / minh bạch" app: showAsAction = "always" tools: ign = " MenuTitle "/>
Mete

10

Không có thanh công cụ TextView, chúng ta có thể tùy chỉnh phông chữ bằng cách sử dụng mã bên dưới

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

1
Nếu bạn chỉ cần thay đổi phông chữ, đây có vẻ là giải pháp sạch nhất. LƯU Ý:
typefaceSpanString

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

1
Giải pháp hoạt động tuyệt vời khi bạn đưa ra hai dòng mã cuối cùng, nó không nên nằm trong vòng lặp for: // Khôi phục tiêu đề và phụ đề thanh công cụ.setTitle (gốcTitle); thanh công cụ.setSubtitle (gốcSubtitle);
Ivan Stojkovic

5

Bố trí:

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

Mã số:

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

1
Tôi nghĩ "int width = maxWidth - titleWidth * 2;" nên là "int width = maxWidth - iconWidth * 2;", hãy nghĩ!
oldfeel

4

Tôi đã giải quyết giải pháp này và đây là một mã sau:

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

Và bạn có thể thay đổi tiêu đề / nhãn, trong Hoạt động, viết mã dưới đây:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);

TextView mTitle = (TextView) thanh công cụTop.findViewById (R.id.toolbar_title); mTitle.setText ("@ chuỗi / ....");


4

Bạn có thể sử dụng như sau

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

nếu tôi đặt setDisplayHomeAsUpEnables (true) và setDisplayShowHomeEnabled (true); để enalbe trở lại mũi tên. Sau đó, tiêu đề không phải là trung tâm. Tôi đã thử như cài đặt actionBar.setTitle (""); và setDisplayShowTitleEnables (sai). Nhưng vẫn không thể giải quyết vấn đề
Prashanth Debbadwar

4

Một cách rất nhanh chóngdễ dàng để đặt phông chữ tùy chỉnh là sử dụng một tùy chỉnh titleTextAppearancevới fontFamily:

Thêm vào tệp kiểu tệp :

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

Trong thư mục res của bạn, hãy tạo một thư mục phông chữ (Ví dụ: varela_round_THER.ttf )

Đọc hướng dẫn chính thức để tìm hiểu thêm https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html


3

Tôi không biết có gì thay đổi trong thư viện appcompat không nhưng nó khá tầm thường, không cần phản ánh.

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

3

Giải pháp mà tôi đã sử dụng cho vấn đề này:

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

Đối với trọng tâm trung tâm, tôi nghĩ cần phải thay đổi các thông số bố cục thành match_parent theo chiều ngang và sau đó:

tv.setGravity(Gravity.CENTER);

3

Cập nhật từ câu trả lời của @ MrEngineer13: để căn chỉnh trung tâm tiêu đề trong mọi trường hợp, bao gồm biểu tượng Hamburger, menu tùy chọn, bạn có thể thêm một FrameLayoutthanh công cụ như thế này:

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

3

Trong XML hãy thử điều này:

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

Trong mã:

Toolbar myToolbar= (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) mytoolbar.findViewById(R.id.toolbar_title);

2

Mặc dù việc thêm chế độ xem văn bản vào thanh công cụ có thể giải quyết vấn đề hạn chế kiểu dáng tiêu đề, vẫn có vấn đề với nó. Vì chúng tôi không thêm nó vào bố cục, chúng tôi không có quá nhiều quyền kiểm soát chiều rộng của nó. Chúng ta có thể sử dụng quấn_content hoặc match_parent.

Bây giờ hãy xem xét một kịch bản trong đó chúng ta có một searchView như một nút ở cạnh phải của thanh công cụ. Nếu nội dung tiêu đề nhiều hơn, nó sẽ ở trên cùng của nút che khuất nó. Không có cách nào kiểm soát việc thiết lập độ rộng cho nhãn này và đó là điều bạn không muốn làm nếu muốn có một thiết kế đáp ứng.

Vì vậy, đây là một giải pháp hiệu quả với tôi, hơi khác so với việc thêm một textview vào thanh công cụ. Thay vào đó, hãy thêm thanh công cụ và chế độ xem văn bản vào bố cục tương đối và đảm bảo rằng chế độ xem văn bản nằm trên thanh công cụ. Sau đó, chúng tôi có thể sử dụng lề thích hợp và đảm bảo chế độ xem văn bản hiển thị ở nơi chúng tôi muốn nó hiển thị.

Hãy chắc chắn rằng bạn đặt thanh công cụ để không hiển thị tiêu đề.

Đây là XML cho giải pháp này:

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

Giải quyết vấn đề @ ankur-chaudhary đã đề cập ở trên.


2

android.support.v7.appcompat 24.2 Toolbarcó phương thức setTitleTextAppearancevà bạn có thể đặt phông chữ của nó mà không cần bên ngoàitextview .

tạo kiểu mới trong tệp kiểu tệp

<style name="RobotoBoldTextAppearance">
        <item name="android:fontFamily">@font/roboto_condensed_bold</item>
</style>

và sử dụng nó

mToolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);

2

Tôi đã dành vài ngày để tìm kiếm một giải pháp phổ quát. Thanh công cụ của tôi làm việc với menu android và biểu tượng điều hướng.

Lúc đầu, bạn cần tạo lớp thanh công cụ tùy chỉnh. Lớp này phải tính toán các vị trí trung tâm tiêu đề (paddings):

    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)

}

Thứ hai, bạn cần tạo thanh công cụ bố cục:

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

Đó là tất cả


2

Hãy thử dùng Thanh công cụ và tittle trong một chế độ xem riêng. Nhìn vào đầu bên phải và cho chúng trọng lượng bằng trọng lượng thanh công cụ. Bằng cách này, tittle của bạn sẽ đến trung tâm.

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

2

Bạn có thể chèn mã này vào tệp xml của bạn

 <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryDark"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:textColor="#000000"
        android:textSize="20dp"
        android:id="@+id/toolbar_title" />

</androidx.appcompat.widget.Toolbar>

Xin chào Uzair. Tập tin xml nào? Tôi đang sử dụng Dự án Android Studio 3.6.3 được tạo từ mẫu Hoạt động trống. Cảm ơn.
Tình yêu và hòa bình - Joe Codwell

1
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();
                }
            });
        }
    }
}

1

Cài đặt android:gravity="center"làm việc cho tôi

Không có kiểu dáng gì cả. Thanh công cụ về cơ bản là ViewGrouptất cả những gì bạn cần làm là đặt trọng lực của các yếu tố trong đó.

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

8
Không hoạt động vớiandroidx.appcompat.widget.Toolbar
tmm1

1

đối với phông chữ tùy chỉnh trên thanh công cụ, bạn có thể ghi đè phông chữ textView theo kiểu và sau đó mọi textView trong ứng dụng của bạn cũng có phông chữ tiêu đề thanh công cụ tự động thay đổi, tôi đã thử nghiệm nó trong android studio 3.1.3

trong phong cách làm điều đó:

<style name="defaultTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">@font/your_custom_font</item>
</style>

và sau đó trong chủ đề của bạn sử dụng điều này:

<item name="android:textViewStyle">@style/defaultTextViewStyle</item>

1

Tôi đã tìm thấy một cách khác để thêm thanh công cụ tùy chỉnh mà không cần bất kỳ mã Java / Kotlin ngoại tình nào.

  • Đầu tiên: tạo một XML với bố cục thanh công cụ tùy chỉnh của bạn với AppBarLayout là cha mẹ:

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

  • Thứ hai: Bao gồm thanh công cụ trong bố cục của bạn:

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

1

Theo tôi thấy, bạn có hai lựa chọn:

1) Chỉnh sửa thanh công cụ XML. Khi Thanh công cụ của bạn được thêm vào XML, nó thường trông như thế:

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

nếu bạn muốn tùy chỉnh nó, chỉ cần xóa '/' cuối cùng và làm cho nó như thế:

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

bằng cách đó bạn có thể có một thanh công cụ và tùy chỉnh textview và logo.

2) Thay đổi chương trình và biểu tượng văn bản gốc:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setIcon(R.drawable.ic_question_mark);
getSupportActionBar().setTitle("Title");

đảm bảo thanh công cụ của bạn không rỗng trước khi bạn đặt bất cứ thứ gì vào đó.


1

Bạn có thể có một tùy chỉnh TextViewtrên thanh công cụ như thế này:

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

Vì vậy, điều này sẽ tập trung vào văn bản. Nếu bạn muốn thêm phông chữ tùy chỉnh vào bình thường Toolbar, hãy tạo <style>:

<style android:name="ToolbarFont">
    <item android:fontFamily = "@font/fontName" />
</style>

Và thêm nó vào thanh công cụ:

toolbar.setTitleTextAppearance(this, R.style.ToolbarFont);

Đối với chế độ xem văn bản trên thanh công cụ, bạn có thể xác định nó với fontFamilythuộc tính:

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

1

Tôi đã đối mặt với cùng một vấn đề, đã được khắc phục bằng cách thực hiện điều này trong MainActivity

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

Và trong mảnh vỡ

@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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.