एंड्रॉइड में ActionBar शीर्षक को केंद्र में कैसे संरेखित करें?


99

मैं पाठ को केंद्र में रखने के लिए निम्न कोड का उपयोग करने की कोशिश कर रहा हूं ActionBar, लेकिन यह खुद को बाईं ओर संरेखित करता है।

आप इसे केंद्र में कैसे प्रदर्शित करते हैं?

ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle("Canteen Home");
actionBar.setHomeButtonEnabled(true);
actionBar.setIcon(R.drawable.back);

यह एक बहुत पुराना सवाल है। हालांकि, नीचे एकमात्र समाधान मैं देख रहा हूं कि एक कस्टम एक्शन बार बनाया जा सकता है। तो यहाँ एक कस्टम एक्शन बार बनाए बिना समाधान है। stackoverflow.com/a/42465266/3866010 आशा यह किसी में मदद करता है
ᴛʜᴇᴘᴀᴛᴇʟ

1
लगभग 8 साल बाद मैंने यह सवाल पूछा, फिर से जवाब का उपयोग करते हुए: डी
सौरभ सालदी

जवाबों:


197

ABS में एक केंद्रित शीर्षक रखने के लिए (यदि आप इसे डिफ़ॉल्ट रूप से करना चाहते हैं ActionBar, तो विधि नामों में "समर्थन" को हटा दें), आप बस ऐसा कर सकते हैं:

आपकी गतिविधि में, आपकी onCreate()विधि में:

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

abs_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
        android:layout_gravity="center"
    android:orientation="vertical">

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/tvTitle"
        style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#FFFFFF" />

</LinearLayout>

अब आपके पास Actionbarसिर्फ एक शीर्षक होना चाहिए । यदि आप एक कस्टम बैकग्राउंड सेट करना चाहते हैं, तो इसे ऊपर के लेआउट में सेट करें (लेकिन फिर सेट करना न भूलें android:layout_height="match_parent")।

या साथ:

getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.yourimage));

6
इसमें कस्टम बैक बटन छवि कैसे जोड़ें?
सौरभ सालदी

13
मेरे लिए नतीजा यह था कि एक्शनबार मेरे द्वारा दिखाए जा रहे एक्शन बटन के आधार पर दाएं या बाएं विस्थापित था। इसे ठीक करने के लिए, मैंने बस "WRAP_CONTENT" के लेआउट_सेट को सेट किया
alfongj

11
पेपिलो का समाधान मेरे लिए काम नहीं करता था, क्योंकि सामग्री बिल्कुल भी केंद्रित नहीं थी। मैं android:layout_gravity="center"इसे LinearLayout में जोड़कर हल कर सकता था ।
सिलोक्स

8
@Nezam यह एक अपेक्षित व्यवहार है। कोशिश करें ((TextView)actionBar.getCustomView().findViewById(R.id.textView1)).setText("new title");, जहां textView1 TextViewआपके CustomView में आपकी आईडी है।
सूफियान

8
यदि मेनू आइटम हैं तो यह सही ढंग से केंद्रित नहीं होंगे। हमेशा शीर्षक के लिए "WRAP_CONTENT" को LinearLayout में केंद्रित करें और TextView से LinearLayout में Android: layout_gravity = "केंद्र" को स्थानांतरित करें।
डोमिनिक

35

मुझे अन्य उत्तरों के साथ बहुत अधिक सफलता नहीं मिली है ... नीचे बिल्कुल मेरे लिए एंड्रॉइड 4.4.3 पर समर्थन लाइब्रेरी v7 में ActionBar का उपयोग करके काम किया गया है। मैंने इसे नेविगेशन दराज आइकन ("बर्गर मेनू बटन") दिखाने के लिए स्थापित किया है

एक्सएमएल

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/actionbar_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:maxLines="1"
        android:clickable="false"
        android:focusable="false"
        android:longClickable="false"
        android:textStyle="bold"
        android:textSize="18sp"
        android:textColor="#FFFFFF" />

</LinearLayout>

जावा

//Customize the ActionBar
final ActionBar abar = getSupportActionBar();
abar.setBackgroundDrawable(getResources().getDrawable(R.drawable.actionbar_background));//line under the action bar
View viewActionBar = getLayoutInflater().inflate(R.layout.actionbar_titletext_layout, null);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(//Center the textview in the ActionBar !
        ActionBar.LayoutParams.WRAP_CONTENT, 
        ActionBar.LayoutParams.MATCH_PARENT, 
        Gravity.CENTER);
TextView textviewTitle = (TextView) viewActionBar.findViewById(R.id.actionbar_textview);
textviewTitle.setText("Test");
abar.setCustomView(viewActionBar, params);
abar.setDisplayShowCustomEnabled(true);
abar.setDisplayShowTitleEnabled(false);
abar.setDisplayHomeAsUpEnabled(true);
abar.setIcon(R.color.transparent);
abar.setHomeButtonEnabled(true);

हमें एक paramsवस्तु बनाने की आवश्यकता क्यों है ?? क्या हम बाहरी लेआउट फ़ाइल में गुरुत्वाकर्षण को निर्दिष्ट नहीं कर सकते हैं जो हम एक्शनबार को असाइन कर रहे हैं।
दीप लठिया

10

शीर्षक पाठ के साथ अपने स्वयं के कस्टम दृश्य को परिभाषित करें, फिर SerPii के अनुसार, लेआउट को सेट करें।

ActionBar actionBar = getSupportActionBar()
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
actionBar.setCustomView(getLayoutInflater().inflate(R.layout.action_bar_home, null),
        new ActionBar.LayoutParams(
                ActionBar.LayoutParams.WRAP_CONTENT,
                ActionBar.LayoutParams.MATCH_PARENT,
                Gravity.CENTER
        )
);

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

आदर्श : xml लेआउट में समतुल्य:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:orientation="vertical">

इसके लिए LayoutParams को निर्दिष्ट करने की आवश्यकता नहीं है।

actionBar.setCustomView(getLayoutInflater().inflate(R.layout.action_bar_home, null);

8

अहमद के जवाब का सिर्फ एक त्वरित जोड़। जब आप किसी टेक्स्ट दृश्य के साथ कस्टम दृश्य का उपयोग कर रहे हों, तो आप getSupportActionBar () का उपयोग नहीं कर सकते। इस शीर्षक को सेट करने के लिए जब आपके पास इस कस्टम ActionBar (इस एक xml का उपयोग करके) के साथ कई गतिविधियाँ हों, तो आपके द्वारा कस्टम दृश्य असाइन करने के बाद अपने onCreate () विधि में :

TextView textViewTitle = (TextView) findViewById(R.id.mytext);
textViewTitle.setText(R.string.title_for_this_activity);

4

ठीक है। बहुत सारे अनुसंधान के बाद, ऊपर दिए गए स्वीकृत उत्तर के साथ संयुक्त, मैं एक समाधान के साथ आया हूं जो आपके एक्शन बार (बैक / होम बटन, मेनू बटन) में अन्य सामान होने पर भी काम करता है। इसलिए मूल रूप से मैंने ओवरराइड विधियों को एक बुनियादी गतिविधि में डाल दिया है (जो अन्य सभी गतिविधियों का विस्तार करता है), और कोड को वहां रखा। यह कोड प्रत्येक गतिविधि का शीर्षक सेट करता है क्योंकि यह AndroidManifest.xml में प्रदान किया गया है, और यह अन्य कस्टम सामान भी करता है (जैसे कि एक्शन बार बटन पर एक कस्टम टिंट सेट करना, और शीर्षक पर कस्टम फ़ॉन्ट)। आपको केवल action_bar.xml में गुरुत्वाकर्षण को छोड़ना होगा, और इसके बजाय पैडिंग का उपयोग करना होगा।actionBar != nullचेक का उपयोग किया जाता है, क्योंकि मेरी सभी गतिविधियों में एक नहीं है।

4.4.2 और 5.0.1 को परीक्षण किया गया

public class BaseActivity extends AppCompatActivity {
private ActionBar actionBar;
private TextView actionBarTitle;
private Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    super.onCreate(savedInstanceState);     
    ...
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setElevation(0);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setCustomView(R.layout.action_bar);

        LinearLayout layout = (LinearLayout) actionBar.getCustomView();
        actionBarTitle = (TextView) layout.getChildAt(0);
        actionBarTitle.setText(this.getTitle());
        actionBarTitle.setTypeface(Utility.getSecondaryFont(this));
        toolbar = (Toolbar) layout.getParent();
        toolbar.setContentInsetsAbsolute(0, 0);

        if (this.getClass() == BackButtonActivity.class || this.getClass() == AnotherBackButtonActivity.class) {
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setDisplayShowHomeEnabled(true);
            Drawable wrapDrawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_back));
            DrawableCompat.setTint(wrapDrawable, getResources().getColor(android.R.color.white));
            actionBar.setHomeAsUpIndicator(wrapDrawable);
            actionBar.setIcon(null);
        }
        else {
            actionBar.setHomeButtonEnabled(false);
            actionBar.setDisplayHomeAsUpEnabled(false);
            actionBar.setDisplayShowHomeEnabled(false);
            actionBar.setHomeAsUpIndicator(null);
            actionBar.setIcon(null);
        }
    }

    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if(menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception ex) {
        // Ignore
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (actionBar != null) {
        int padding = (getDisplayWidth() - actionBarTitle.getWidth())/2;

        MenuInflater inflater = getMenuInflater();
        if (this.getClass() == MenuActivity.class) {
            inflater.inflate(R.menu.activity_close_menu, menu);
        }
        else {
            inflater.inflate(R.menu.activity_open_menu, menu);
        }

        MenuItem item = menu.findItem(R.id.main_menu);
        Drawable icon = item.getIcon();
        icon.mutate().mutate().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
        item.setIcon(icon);

        ImageButton imageButton;
        for (int i =0; i < toolbar.getChildCount(); i++) {
            if (toolbar.getChildAt(i).getClass() == ImageButton.class) {
                imageButton = (ImageButton) toolbar.getChildAt(i);
                padding -= imageButton.getWidth();
                break;
            }
        }

        actionBarTitle.setPadding(padding, 0, 0, 0);
    }

    return super.onCreateOptionsMenu(menu);
} ...

और मेरा एक्शन_बार.एक्सएमएल इस तरह है (अगर किसी को दिलचस्पी है):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/actionbar_text_color"
        android:textAllCaps="true"
        android:textSize="9pt"
        />

</LinearLayout>

संपादित करें : यदि आपको शीर्षक को किसी और चीज़ में बदलने की ज़रूरत है, तो गतिविधि लोड होने पर (onCreateOptionsMenu को पहले ही बुलाया जा चुका है), अपने Action_bar.xml में एक और टेक्स्टव्यू डालें और निम्न कोड का उपयोग करके "New TextView" सेट करें, पाठ और शो सेट करें यह:

protected void setSubTitle(CharSequence title) {

    if (!initActionBarTitle()) return;

    if (actionBarSubTitle != null) {
        if (title != null || title.length() > 0) {
            actionBarSubTitle.setText(title);
            setActionBarSubTitlePadding();
        }
    }
}

private void setActionBarSubTitlePadding() {
    if (actionBarSubTitlePaddingSet) return;
    ViewTreeObserver vto = layout.getViewTreeObserver();
    if(vto.isAlive()){
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int padding = (getDisplayWidth() - actionBarSubTitle.getWidth())/2;

                ImageButton imageButton;
                for (int i = 0; i < toolbar.getChildCount(); i++) {
                    if (toolbar.getChildAt(i).getClass() == ImageButton.class) {
                        imageButton = (ImageButton) toolbar.getChildAt(i);
                        padding -= imageButton.getWidth();
                        break;
                    }
                }

                actionBarSubTitle.setPadding(padding, 0, 0, 0);
                actionBarSubTitlePaddingSet = true;
                ViewTreeObserver obs = layout.getViewTreeObserver();
                obs.removeOnGlobalLayoutListener(this);
            }
        });
    }
}

protected void hideActionBarTitle() {

    if (!initActionBarTitle()) return;

    actionBarTitle.setVisibility(View.GONE);
    if (actionBarSubTitle != null) {
        actionBarSubTitle.setVisibility(View.VISIBLE);
    }
}

protected void showActionBarTitle() {

    if (!initActionBarTitle()) return;

    actionBarTitle.setVisibility(View.VISIBLE);
    if (actionBarSubTitle != null) {
        actionBarSubTitle.setVisibility(View.GONE);
    }
}

EDIT (25.08.2016) : यह एपकॉम 24.2.0 संशोधन (अगस्त 2016) के साथ काम नहीं करता है, यदि आपकी गतिविधि में "बैक बटन" है। मैंने एक बग रिपोर्ट दर्ज की ( अंक 220899 ), लेकिन मुझे नहीं पता कि यह किसी काम का है (संदेह है कि इसे जल्द ही ठीक कर लिया जाएगा)। इस बीच समाधान यह जाँचने के लिए है कि क्या बच्चे की कक्षा AppCompatImageButton.class के बराबर है और वही करें, केवल चौड़ाई 30% बढ़ाएँ (जैसे appCompatImageButton.getWidth () 1.3 मूल गद्दी से इस मान को घटाने से पहले):

padding -= appCompatImageButton.getWidth()*1.3;

इस दौरान मैंने वहाँ कुछ पैडिंग / मार्जिन जाँच में फेंक दिया:

    Class<?> c;
    ImageButton imageButton;
    AppCompatImageButton appCompatImageButton;
    for (int i = 0; i < toolbar.getChildCount(); i++) {
        c = toolbar.getChildAt(i).getClass();
        if (c == AppCompatImageButton.class) {
            appCompatImageButton = (AppCompatImageButton) toolbar.getChildAt(i);
            padding -= appCompatImageButton.getWidth()*1.3;
            padding -= appCompatImageButton.getPaddingLeft();
            padding -= appCompatImageButton.getPaddingRight();
            if (appCompatImageButton.getLayoutParams().getClass() == LinearLayout.LayoutParams.class) {
                padding -= ((LinearLayout.LayoutParams) appCompatImageButton.getLayoutParams()).getMarginEnd();
                padding -= ((LinearLayout.LayoutParams) appCompatImageButton.getLayoutParams()).getMarginStart();
            }
            break;
        }
        else if (c == ImageButton.class) {
            imageButton = (ImageButton) toolbar.getChildAt(i);
            padding -= imageButton.getWidth();
            padding -= imageButton.getPaddingLeft();
            padding -= imageButton.getPaddingRight();
            if (imageButton.getLayoutParams().getClass() == LinearLayout.LayoutParams.class) {
                padding -= ((LinearLayout.LayoutParams) imageButton.getLayoutParams()).getMarginEnd();
                padding -= ((LinearLayout.LayoutParams) imageButton.getLayoutParams()).getMarginStart();
            }
            break;
        }
    }

4

कस्टमव्यू के बिना इसके एक्शनबार शीर्षक को सक्षम करने के लिए। इसके पूरी तरह से नेविगेशन दराज के लिए भी काम कर रहा है

    int titleId = getResources().getIdentifier("action_bar_title", "id", "android");
    TextView abTitle = (TextView) findViewById(titleId);
    abTitle.setTextColor(getResources().getColor(R.color.white));

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    abTitle.setGravity(Gravity.CENTER);
    abTitle.setWidth(metrics.widthPixels);
    getActionBar().setTitle("I am center now");

खुश कोडिंग। धन्यवाद।


3

बहुत शोध के बाद: यह वास्तव में काम करता है:

 getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
 getActionBar().setCustomView(R.layout.custom_actionbar);
  ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        p.gravity = Gravity.CENTER;

आपको custom_actionbar.xml लेआउट को परिभाषित करना होगा जो आपकी आवश्यकता के अनुसार है:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#2e2e2e"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_gravity="center">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/top_banner"
        android:layout_gravity="center"
        />
</LinearLayout>

सरल, और यह काम करता है! quothd.com/imagequotes/authors39/tmb/…
एंड्रयूब्रैमवेल

@AndrewBramwell getActionBar ()। SetDisplayOptions (ActionBar.DISPLAY_SHOW_CUSTOM); एक अशक्त पॉइंटर अपवाद को फेंक रहा है
रुचिर बैरोनिया

क्या तुम लोग जानते हो कि मैं इसे कैसे ठीक कर सकता हूँ?
रुचिर बरोनिया

3

यह अच्छी तरह से काम करता है।

activity = (AppCompatActivity) getActivity();

activity.getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.custom_actionbar, null);

ActionBar.LayoutParams p = new ActionBar.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT,
        Gravity.CENTER);

((TextView) v.findViewById(R.id.title)).setText(FRAGMENT_TITLE);

activity.getSupportActionBar().setCustomView(v, p);
activity.getSupportActionBar().setDisplayShowTitleEnabled(true);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Custom_actionbar के लेआउट के नीचे:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:text="Example"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:ellipsize="end"
        android:maxLines="1"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/colorBlack" />

</RelativeLayout>

2

आपको सेट करने की आवश्यकता है ActionBar.LayoutParams.WRAP_CONTENTऔरActionBar.DISPLAY_HOME_AS_UP

View customView = LayoutInflater.from(this).inflate(R.layout.actionbar_title, null);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT,
                ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER);

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP );

"मैं ActionBar.LayoutParams सेट कर रहा हूं ..." - इसका कोई मतलब नहीं है। इसके अलावा, कृपया अपना कोड प्रारूपित करें।
सैशोअल्म

हाह, plz 曲 曲 曲 को नहीं पीटता है, उसका सेटडिप्लेप्शन उदाहरण मुझे केंद्रित शीर्षक जोड़ने और होम बटन दिखाने में मदद करता है
djdance

"R.layout.action_bar_title" क्या है? मैं इसे नहीं ढूँढ सकता।
जोस मैनुअल अबर्का रॉड्रिग्ज

"R.layout.action_bar_title" क्या है? इसे समझाओ। क्या मुझे उस कस्टम xml को मेनिफेस्ट्स.xml
अजय कुलकर्णी

2

सबसे अच्छा और आसान तरीका, विशेष रूप से उन लोगों के लिए जो बिना किसी xml लेआउट के केवल गुरुत्वाकर्षण केंद्र के साथ पाठ दृश्य चाहते हैं।

AppCompatTextView mTitleTextView = new AppCompatTextView(getApplicationContext());
        mTitleTextView.setSingleLine();
        ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
        layoutParams.gravity = Gravity.CENTER;
        actionBar.setCustomView(mTitleTextView, layoutParams);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_HOME_AS_UP);
        mTitleTextView.setText(text);
        mTitleTextView.setTextAppearance(getApplicationContext(), android.R.style.TextAppearance_Medium);

आप एप्लिकेशन विषय की जाँच करें !!
टर्बोन्ड्रायड

2

यहाँ कोड मेरे लिए काम कर रहा है।

    // Activity 
 public void setTitle(String title){
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    TextView textView = new TextView(this);
    textView.setText(title);
    textView.setTextSize(20);
    textView.setTypeface(null, Typeface.BOLD);
    textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    textView.setGravity(Gravity.CENTER);
    textView.setTextColor(getResources().getColor(R.color.white));
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(textView);
} 

// Fragment
public void setTitle(String title){
    ((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    TextView textView = new TextView(getActivity());
    textView.setText(title);
    textView.setTextSize(20);
    textView.setTypeface(null, Typeface.BOLD);
    textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    textView.setGravity(Gravity.CENTER);
    textView.setTextColor(getResources().getColor(R.color.white));
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(textView);
}

2

एक कोटलिन-एकमात्र समाधान जिसे XML लेआउट में परिवर्तन करने की आवश्यकता नहीं है:

//Function to call in onResume() of your activity
private fun centerToolbarText() {
    val mTitleTextView = AppCompatTextView(this)
    mTitleTextView.text = title
    mTitleTextView.setSingleLine()//Remove it if you want to allow multiple lines in the toolbar
    mTitleTextView.textSize = 25f
    val layoutParams = android.support.v7.app.ActionBar.LayoutParams(
        ActionBar.LayoutParams.WRAP_CONTENT,
        ActionBar.LayoutParams.WRAP_CONTENT
    )
    layoutParams.gravity = Gravity.CENTER
    supportActionBar?.setCustomView(mTitleTextView,layoutParams)
    supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
}

2

यहाँ एक पूर्ण Kotlin + androidx समाधान है, जो @Stanislas Heili के उत्तर पर है। मुझे उम्मीद है कि यह दूसरों के लिए उपयोगी हो सकता है। यह उस समय के लिए होता है जब आपके पास एक गतिविधि होती है जो एक ही समय में केवल एक ही टुकड़ा सक्रिय होने के साथ कई अंशों को होस्ट करती है।

आपकी गतिविधि में:

private lateinit var customTitle: AppCompatTextView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // stuff here
    customTitle = createCustomTitleTextView()
    // other stuff here
}

private fun createCustomTitleTextView(): AppCompatTextView {
    val mTitleTextView = AppCompatTextView(this)
    TextViewCompat.setTextAppearance(mTitleTextView, R.style.your_style_or_null);

    val layoutParams = ActionBar.LayoutParams(
        ActionBar.LayoutParams.WRAP_CONTENT,
        ActionBar.LayoutParams.WRAP_CONTENT
    )
    layoutParams.gravity = Gravity.CENTER
    supportActionBar?.setCustomView(mTitleTextView, layoutParams)
    supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM

    return mTitleTextView
}

override fun setTitle(title: CharSequence?) {
    customTitle.text = title
}

override fun setTitle(titleId: Int) {
    customTitle.text = getString(titleId)
}

आपके टुकड़ों में:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    activity?.title = "some title for fragment"
}

0

अन्य ट्यूटोरियल मैंने देखा है कि MenuItems को छिपाते हुए पूरे एक्शन बार लेआउट को ओवरराइड किया गया है। मुझे लगता है कि यह सिर्फ निम्नलिखित कदम कर काम किया है:

निम्नलिखित के रूप में एक xml फ़ाइल बनाएँ:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="@string/app_name"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@android:color/white" />

</RelativeLayout>

और क्लैस में करते हैं:

LayoutInflater inflator = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflator.inflate(R.layout.action_bar_title, null);

ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER);

TextView titleTV = (TextView) v.findViewById(R.id.title);
titleTV.setText("Test");

यह काम नहीं करता है - शायद क्योंकि मेरे पास नेविगेशन मेनू बटन है?
किसी ने

0

Kotlin उपयोगकर्ताओं के लिए:

अपनी गतिविधि में निम्नलिखित कोड का उपयोग करें:

// Set custom action bar
supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
supportActionBar?.setCustomView(R.layout.action_bar)

// Set title for action bar
val title = findViewById<TextView>(R.id.titleTextView)
title.setText(resources.getText(R.string.app_name))

और XML / संसाधन लेआउट:

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

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title"
        android:textColor="@color/black"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

-1

यह कोड बैक बटन नहीं छिपाएगा, सेम टाइम सेंटर में शीर्षक संरेखित करेगा।

oncreate में इस विधि को बुलाओ

centerActionBarTitle();



getSupportActionBar().setDisplayHomeAsUpEnabled(true);
myActionBar.setIcon(new ColorDrawable(Color.TRANSPARENT));

private void centerActionBarTitle() {
    int titleId = 0;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        titleId = getResources().getIdentifier("action_bar_title", "id", "android");
    } else {
        // This is the id is from your app's generated R class when 
        // ActionBarActivity is used for SupportActionBar
        titleId = R.id.action_bar_title;
    }

    // Final check for non-zero invalid id
    if (titleId > 0) {
        TextView titleTextView = (TextView) findViewById(titleId);
        DisplayMetrics metrics = getResources().getDisplayMetrics();

        // Fetch layout parameters of titleTextView 
        // (LinearLayout.LayoutParams : Info from HierarchyViewer)
        LinearLayout.LayoutParams txvPars = (LayoutParams) titleTextView.getLayoutParams();
        txvPars.gravity = Gravity.CENTER_HORIZONTAL;
        txvPars.width = metrics.widthPixels;
        titleTextView.setLayoutParams(txvPars);
        titleTextView.setGravity(Gravity.CENTER);
    }
}

java.lang.NullPointerException;)
खान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.