Android टूलबार केंद्र शीर्षक और कस्टम फ़ॉन्ट


366

मैं टूलबार शीर्षक के लिए एक कस्टम फ़ॉन्ट का उपयोग करने का सही तरीका जानने की कोशिश कर रहा हूं, और इसे उपकरण पट्टी (ग्राहक की आवश्यकता) में केंद्र कर रहा हूं।

फिलहाल, मैं अच्छे पुराने ActionBar का उपयोग कर रहा हूं, और मैं शीर्षक को खाली मान पर सेट कर रहा था, और setCustomViewअपने कस्टम फ़ॉन्ट TextView को डालने के लिए और ActionBar.LayoutParams का उपयोग करके इसे केंद्र में रख रहा हूं।

क्या ऐसा करने का एक बेहतर तरीका है? मेरे एक्शनबार के रूप में नए टूलबार का उपयोग करना।

जवाबों:


718

अपने Toolbarसभी में एक कस्टम शीर्षक का उपयोग करने के लिए आपको याद रखने की ज़रूरत है कि Toolbarयह सिर्फ एक फैंसी व्यूग्रुप है ताकि आप एक कस्टम शीर्षक जैसे जोड़ सकें:

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

इसका मतलब यह है कि आप शैली TextViewको पसंद कर सकते हैं , क्योंकि यह सिर्फ एक नियमित है TextView। तो अपनी गतिविधि में आप इस तरह शीर्षक का उपयोग कर सकते हैं:

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

5
एंड्रॉइड का उपयोग करने का सुझाव दें: लेआउट_ एक्सपोज़र = "रैप_ कॉन्टेंट" एंड्रॉइड: लेआउट_हाइट = "रैप_ कॉंटेंट" एंड्रॉइड: लेआउट_ग्रेविटी = "केंद्र" इसके बजाय।
स्टीलबाइट्स

194
यदि कोई अन्य व्यक्ति डिफ़ॉल्ट ऐप नाम का शीर्षक नहीं निकाल सकता है, तो यह करें: 1. कॉल सेट करेंसमर्थन (आपका टूलबार) 2. कॉल गेटसुपोर्टएशनबेर ()।
रिक सांचेज

75
अनुकूलित TextView के लिए डिफ़ॉल्ट शैलियों का उपयोग करने के लिए, कुछ ऐसा प्रयास करें style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"( यह उत्तर देखें )।
जोनीक

5
एंड्रॉइड जोड़ना: paddingRight = "? Attr / actionBarSize" आपकी स्क्रीन के बीच में टेक्स्ट को उस स्थिति में केन्द्रित करने में मदद कर सकता है, जब आपके पास एक बटन (घर, नेविगेशन दराज, आदि)
गोरक्षक

5
टूलबार पर हैम्बर्गर आइकन होने पर क्या होगा? यह पूर्ण टूलबार चौड़ाई के केंद्र में नहीं होगा, यह टूलबार की चौड़ाई के केंद्र में होगा - हैम्बर्गरइन्कोवर्थ
अक्षय

75

टूलबार शीर्षक शैलीगत है। आपके द्वारा किए गए किसी भी अनुकूलन को थीम में बनाया जाना है। मैं आपको एक उदाहरण दूंगा।

टूलबार लेआउट:

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

शैलियाँ:

<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
यह सही तरीका है। दूसरे TextViewको जोड़ना थोड़ा हैक्य है, लेकिन प्रतिबिंब का उत्तर सिर्फ सादा बुराई है।
डेरियसल

9
स्वच्छ, लेकिन आप शैली से एक कस्टम फ़ॉन्ट सेट नहीं कर सकते। अफसोस की बात है।
nikeco

20
न ही आप शीर्षक के संरेखण को बदल सकते हैं।
टेरी

7
@ user1560102 टूलबार में TextView को जोड़ने के बारे में कुछ भी हैक नहीं किया गया है। यही इसके लिए डिज़ाइन किया गया था।
टिम मालसीड 3

107
यह पाठ को केंद्र में नहीं रखता है।
सेबेस्टियन रोथ

69

यह केवल सभी टुकड़ों में शामिल होने में मदद करने के लिए @Jonik के साथ @ MrEngineer13 उत्तर का उपयोग कर रहा है और सही क्रम के साथ @Rick Sanchez टिप्पणियों को आसानी से केंद्रित शीर्षक प्राप्त करने में मदद करने के लिए !!

के साथ लेआउट 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>

सही क्रम के साथ प्राप्त करने का तरीका:

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

कृपया मत भूलना @ MrEngineer13 उत्तर अप करने के लिए !!!

यहाँ एक नमूना परियोजना टूलबारकेंटरलिट नमूना है

यहां छवि विवरण दर्ज करें

किसी और की मदद करने की उम्मीद;)


5
अगर मैं setDisplayHomeAsUpEnabled (true) और setDisplayShowHomeEnabled (सच) सेट करता हूं; पीछे तीर चलाना। तब शीर्षक केंद्र में नहीं आ रहा है। मैंने एक्शन सेट करने की कोशिश की है ।Bar.setTitle (""); और setDisplayShowTitleEnabled (झूठा)। लेकिन अभी भी इस मुद्दे को हल करने में सक्षम नहीं है
प्रशांत देवबदवार

क्या आपने इसका परीक्षण किया है Scrolling Activity?
AN

यह सही है कि बैक एरो के साथ, शीर्षक केंद्रित नहीं है (यह बैक एरो की चौड़ाई से दाईं ओर बंद है)। मुझे लगता है कि अगर मैं वास्तव में निर्धारित किया गया था, तो मैं क्रमिक रूप से पाठ को केंद्र में रखने के लिए आवश्यक रूप से पाठ बॉक्स के दाईं ओर पर्याप्त मार्जिन जोड़ूंगा।
किसी ने

52

हमारे पास टूलबार शीर्षक टेक्स्टव्यू तक सीधी पहुंच नहीं है इसलिए हम इसे एक्सेस करने के लिए प्रतिबिंब का उपयोग करते हैं।

  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
हालांकि यह हैकरी है, टूलबार टेक्स्टव्यू तक पहुंचने के लिए रास्ता खोजने की कोशिश करने के बाद यह समाधान मेरे लिए काम करता है। धन्यवाद।
Falc0nit3

1
शीर्षक के लिए अच्छी तरह से काम किया। लेकिन जब इस तरह mSubtitleTextView प्राप्त करने की कोशिश की गई, तो इसका एक अपवाद हुआ। इसके कारण: java.lang.NullPointerException: आभासी पद्धति 'void android.widget.TextView.setTypeface (android.graphics.Typeface)' को एक अशक्त वस्तु संदर्भ पर प्राप्त करने का प्रयास
विनोद

5
नोट: टूलबार शीर्षक सेट करने के बाद, आप केवल "mTitleTextView" फ़ील्ड का उपयोग कर सकते हैं! यह क्षेत्र अपने पहले उपयोग से ही आलसी हो गया है।
फनकोडर

2
यदि आप अपने कोड को ProGuard के साथ बाधित करते हैं और क्या mTitleTextViewहो जाता है abcde12345?
voghDev

1
@voghDev getDeclaredField उस मामले में NoSuchFieldException को फेंक देगा, जिसके परिणामस्वरूप कोड काम नहीं करेगा।
जेरेमी

30

इसका TextViewउदाहरण खोजने के लिए शीर्षक पाठ निर्भर दृष्टिकोण है 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

निम्नलिखित वर्ग को परिभाषित करें:

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

... और फिर इसे नियमित रूप से Toolbarइस तरह उपयोग करें:

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

आपको अभी भी कोड की इन 2 लाइनों की आवश्यकता है Activity(मानक के साथ 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);

बस! आपको मानक बाएं-संरेखित शीर्षक को छिपाने की आवश्यकता नहीं है, एक ही XML कोड को बार-बार डुप्लिकेट करने की आवश्यकता नहीं है, आदि, CenteredToolbarजैसे कि यह डिफ़ॉल्ट था Toolbar। आप अपने कस्टम फ़ॉन्ट को भी प्रोग्रामेटिक रूप से सेट कर सकते हैं क्योंकि आपके पास अब सीधे पहुंच है TextView। उम्मीद है की यह मदद करेगा।


1
धन्यवाद! सबसे अच्छा समाधान, केवल "v7.widget" टूलबार पर आयात करने के लिए मत भूलना
डेविड

मुझे पता है कि यह काफी पुराना है लेकिन ... मैं टेक्स्ट का रंग कैसे बदल सकता हूं? मैंने ऐप्प के साथ XML में कोशिश की है: titleTextColor और codeedTitleTextView.setColor के साथ कोड में। कोई विचार, @fraggjkee?
गेनेरो अल्बर्टो कैनकिनो हेरेरा

centeredTitleTextView.setTextColor(...)काम करना चाहिए
18:05

यह नहीं होना चाहिए LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)?
सीमांत

16

किसी ने इसका उल्लेख नहीं किया है, लेकिन इसके लिए कुछ विशेषताएं हैं Toolbar:

app:titleTextColor शीर्षक पाठ रंग सेट करने के लिए

app:titleTextAppearance शीर्षक पाठ उपस्थिति सेट करने के लिए

app:titleMargin मार्जिन सेट करने के लिए

और अन्य विशिष्ट-साइड मार्जिन जैसे marginStart, आदि।


1
सही समाधान .. अगर आप FontOverride के बारे में जानते हैं , तो बस style.xml में स्टाइल बनाएं <style name="customFontTextAppearanceStyle"> <item name="android:textSize">18sp</item> <item name="android:typeface">monospace</item> और टूलबार में इसे लागू करें app:titleTextAppearance="@styles/customFontTextAppearanceStyle"
चिन्मय थोरिया

2
मैंने इस विधि का उपयोग किया, लेकिन मेरे टूलबार से कुछ नहीं हुआ! मैंने एक नया '<style>' बनाया और इसे TAGapp:titleTextAppearanc="style name"android.support.v7.widget.Toolbar
AN

12

मैं इस समाधान का उपयोग करता हूं:

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
बहुत अच्छी तरह से काम करता है, लेकिन किसी कारण से यह टूलबार के साथ ठीक से केंद्र नहीं करता है जिसमें आइटम बटन नहीं है।
मुनिब

1
एक अतिरिक्त: यदि आपके पास टूलबार पर एक नाविक या बैक आइकन है, तो शीर्षक बिल्कुल केंद्र में नहीं रहता है। मैं इस स्थिति के लिए एक खाली सेटिंग मेनू आइकन जोड़ता हूं। मेरा खाली मेनू आइटम है: <आइटम android: id = "@ id / खाली" android: orderInCategory = "100" android: icon = "@ android: color / पारदर्शी" ऐप: showAsAction = "हमेशा" टूल्स: इग्नोर करें = " MenuTitle "/>
Mete

10

टूलबार टेक्स्ट व्यू के बिना हम नीचे दिए गए कोड का उपयोग करके फ़ॉन्ट को अनुकूलित कर सकते हैं

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
यदि आपको केवल फ़ॉन्ट बदलने की आवश्यकता है, तो यह सबसे साफ समाधान की तरह लगता है। नोट: TypefaceSpanString बस यह है: stackoverflow.com/a/17961854
मोहिब इरशाद

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
जब आप कोड की अंतिम दो पंक्तियाँ डालते हैं तो समाधान बहुत अच्छा होता है, यह लूप के अंदर नहीं होना चाहिए: // टाइटल और सबटाइटल टूलबार को सेट करें ।setTitle (originalTitle); toolbar.setSubtitle (originalSubtitle);
इवान स्टोजकोविक 13

5

लेआउट:

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

कोड:

    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
मुझे लगता है कि "int चौड़ाई = maxWidth - titleWidth * 2;" होना चाहिए "int चौड़ाई = maxWidth - iconWidth * 2;", सोचता है
ओल्डफेल

4

मैंने इस समाधान को हल किया, और यह निम्नलिखित कोड है:

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

और आप शीर्षक / लेबल को बदल सकते हैं, गतिविधि में, नीचे दिए गए कोड लिखें:

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

TextView mTitle = (TextView) टूलबारTop.findViewById (R.id.toolbar_title); mTitle.setText ( "@ स्ट्रिंग / ....");


4

आप निम्न की तरह उपयोग कर सकते हैं

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

अगर मैं setDisplayHomeAsUpEnabled (true) और setDisplayShowHomeEnabled (सच) सेट करता हूं; पीछे तीर चलाना। तब शीर्षक केंद्र में नहीं आ रहा है। मैंने एक्शन सेट करने की कोशिश की है ।Bar.setTitle (""); और setDisplayShowTitleEnabled (झूठा)। लेकिन अभी भी इस मुद्दे को हल करने में सक्षम नहीं है
प्रशांत देवबदवार

4

एक कस्टम फ़ॉन्ट सेट करने के लिए एक बहुत ही त्वरित और आसान तरीका titleTextAppearanceहै fontFamily:

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

अपने रेस फोल्डर में एक फॉन्ट फोल्डर बनाएं (Ex: varela_round_ अनियमित.ttf )

अधिक जानने के लिए आधिकारिक गाइड पढ़ें https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html


3

मुझे नहीं पता कि एप्कोम्पैट लाइब्रेरी में कुछ भी बदला है लेकिन यह काफी तुच्छ है, प्रतिबिंब की कोई आवश्यकता नहीं है।

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

समाधान है कि मैं इस समस्या के लिए इस्तेमाल किया:

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

सेंटर ग्रेविटी के लिए मुझे लगता है कि लेआउट पैरामेज़ को मैच_परेंट रूप से क्षैतिज रूप से बदलना आवश्यक होगा और फिर:

tv.setGravity(Gravity.CENTER);

3

@ MrEngineer13 के उत्तर से अपडेट करें: किसी भी स्थिति में शीर्षक केंद्र संरेखित करने के लिए, हैम्बर्गर आइकन, विकल्प मेनू सहित, आप FrameLayoutइस तरह से टूलबार में जोड़ सकते हैं :

   <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

XML में यह प्रयास करें:

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

कोड में:

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

2

हालांकि टूलबार में टेक्स्ट दृश्य जोड़ने से शीर्षक स्टाइल के प्रतिबंध की समस्या का समाधान हो सकता है, इसके साथ एक समस्या है। चूंकि हम इसे किसी लेआउट में नहीं जोड़ रहे हैं, इसलिए इसकी चौड़ाई पर हमारा बहुत अधिक नियंत्रण नहीं है। हम या तो wra_content या match_parent का उपयोग कर सकते हैं।

अब एक परिदृश्य पर विचार करें जहां हमारे पास टूलबार के दाईं ओर एक बटन के रूप में एक खोज दृश्य है। यदि शीर्षक सामग्री अधिक है, तो यह अस्पष्ट रूप से बटन के शीर्ष पर जाएगा। लेबल की चौड़ाई सेट करने की इस कमी को नियंत्रित करने का कोई तरीका नहीं है और यदि आप एक उत्तरदायी डिज़ाइन करना चाहते हैं, तो ऐसा कुछ नहीं है।

तो, यहाँ एक समाधान है जो मेरे लिए काम किया है जो टूलबार में एक टेक्स्टव्यू जोड़ने से थोड़ा अलग है। इसके बजाय, टूलबार और टेक्स्ट व्यू को एक संबंधित लेआउट में जोड़ें और सुनिश्चित करें कि टूलबार के ऊपर टेक्स्ट व्यू है। फिर हम उचित मार्जिन का उपयोग कर सकते हैं और सुनिश्चित कर सकते हैं कि पाठ दृश्य दिखाता है कि हम इसे कहां दिखाना चाहते हैं।

सुनिश्चित करें कि आपने शीर्षक दिखाने के लिए टूलबार सेट किया है।

इस समाधान के लिए XML यहाँ है:

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

समस्या को हल करता है @ ऊपर अंकित-चौधरी।


2

चूंकि android.support.v7.appcompat 24.2 Toolbarविधि है setTitleTextAppearanceऔर आप बाहरी के बिना इसके फ़ॉन्ट को सेट कर सकते हैं textview

style.xml में नई शैली बनाएँ

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

और इसका उपयोग करें

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

2

मैंने एक सार्वभौमिक समाधान की खोज में कई दिन बिताए। मेरा टूलबार Android मेनू और नौसेना आइकन के साथ काम कर रहा है।

सबसे पहले, आपको कस्टम टूलबार क्लास बनाने की आवश्यकता है। इस वर्ग को शीर्षक केंद्रित पदों (पैडिंग) की गणना करनी चाहिए:

    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)

}

दूसरे, आपको लेआउट टूलबार बनाने की आवश्यकता है:

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

बस इतना ही


2

टूलबार और विखंडित को एक अलग दृश्य में लेने का प्रयास करें। दाहिने छोर पर एक नज़र डालें और उन्हें टूलबार के वजन के बराबर वजन दिया। इस तरह आपकी तंतु केंद्र में आ जाएगी।

<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

आप इस कोड को अपनी xml फ़ाइल में सम्मिलित कर सकते हैं

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

हाय उज़ैर। कौन सी xml फ़ाइल? मैं एक खाली गतिविधि टेम्पलेट से निर्मित एक एंड्रॉइड स्टूडियो 3.6.3 प्रोजेक्ट का उपयोग कर रहा हूं। धन्यवाद।
प्यार और शांति - जो कोड्सवेल

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

सेटिंग करना android:gravity="center"मेरे लिए काम कर गया

कोई स्टाइलिंग कुछ नहीं। टूलबार मूल रूप से ViewGroupआपको केवल इतना करना है कि इसमें तत्वों की गंभीरता निर्धारित की गई है।

        <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
साथ काम नहीं करता हैandroidx.appcompat.widget.Toolbar
tm1

1

टूलबार में कस्टम फ़ॉन्ट के लिए आप स्टाइल में टेक्स्ट व्यू फ़ॉन्ट को ओवरराइड कर सकते हैं और फिर आपके ऐप में प्रत्येक टेक्स्ट व्यू भी टूलबार टाइटल फ़ॉन्ट स्वचालित रूप से बदल जाता है जो मैंने इसे एंड्रॉइड स्टूडियो 3.1.3 में परीक्षण किया है

शैली में यह करो:

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

और फिर अपने विषय में इस का उपयोग करें:

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

1

मुझे बिना किसी एडिसनल जावा / कोटलिन कोड के कस्टम टूलबार जोड़ने का एक और तरीका मिला।

  • पहला: माता-पिता के रूप में AppBarLayout के साथ अपने कस्टम टूलबार लेआउट के साथ एक XML बनाएँ:

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

  • दूसरा: अपने लेआउट में टूलबार शामिल करें:

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

जैसा कि मैंने देखा कि आपके पास दो विकल्प हैं:

1) टूलबार XML को संपादित करें। जब आपका टूलबार XML में जोड़ा जाता है तो यह आमतौर पर ऐसा दिखता है:

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

इस तरह आप एक टूलबार रख सकते हैं और टेक्स्टव्यू और लोगो को कस्टमाइज़ कर सकते हैं।

2) प्रोग्रामर को मूल टेक्स्टव्यू और आइकन बदलें:

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

सुनिश्चित करें कि आपके टूलबार में कुछ भी सेट करने से पहले यह शून्य नहीं है।


1

आप TextViewइस तरह से टूलबार में एक रिवाज रख सकते हैं :

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

तो, यह पाठ को केंद्र में रखेगा। यदि आप सामान्य से कस्टम फ़ॉन्ट जोड़ना चाहते हैं Toolbar, तो एक बनाएं <style>:

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

और इसे टूलबार में जोड़ें:

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

टूलबार में टेक्स्टव्यू के लिए, आप इसे fontFamilyविशेषता के साथ परिभाषित कर सकते हैं :

<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

मैं एक ही मुद्दे का सामना कर रहा था, जो कि MainActivity में ऐसा करके तय किया गया था

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

एंड इन फ्रैगमेंट

@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);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.