অ্যান্ড্রয়েডে অ্যাকশনবার শিরোনাম কীভাবে কেন্দ্র করবেন?


102

আমি টেক্সটটি কেন্দ্রের জন্য নীচের কোডটি ব্যবহার করার চেষ্টা করছি ActionBar, তবে এটি নিজেকে বামে সারিবদ্ধ করে।

আপনি এটি কেন্দ্রে প্রদর্শিত করতে পারেন?

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

এটি একটি খুব পুরানো প্রশ্ন। যাইহোক, আমি নীচে দেখতে পাচ্ছি একমাত্র সমাধান হ'ল একটি কাস্টম অ্যাকশন বার তৈরি করা। সুতরাং এখানে কাস্টম অ্যাকশন বার তৈরি না করেই সমাধান। stackoverflow.com/a/42465266/3866010 আশা করি এটি কাউকে সাহায্য করবে
ᴛʜᴇᴘᴀᴛᴇʟ

4
প্রায় 8 বছর পরে আমি এই প্রশ্নটি জিজ্ঞাসা করেছি, আবার উত্তরটি ব্যবহার করে: ডি
সৌরভ সালদী

উত্তর:


201

এবিএসে কেন্দ্রিক শিরোনাম পেতে (যদি আপনি এটি ডিফল্টরূপে 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"
এ্যালফংজ

11
পেপিলোর সমাধানটি আমার পক্ষে কার্যকর হয়নি, কারণ সামগ্রীটি মোটেও কেন্দ্রিক ছিল না। আমি android:layout_gravity="center"লিনিয়ারলআউট যুক্ত করে এটি সমাধান করতে পারতাম ।
সিলক্স

8
@ নেজাম এটি একটি প্রত্যাশিত আচরণ। চেষ্টা করুন ((TextView)actionBar.getCustomView().findViewById(R.id.textView1)).setText("new title");, যেখানে পাঠ্য ভিউ TextView1 আপনার কাস্টমভিউতে আপনার আইডি।
সুফিয়ান

8
যদি মেনু আইটেম থাকে তবে এটি সঠিকভাবে কেন্দ্র করা হবে না। সত্যই সর্বদা শিরোনামটি কেনার জন্য লিনিয়ারলআউটে "Wrap_CONTENT" যুক্ত করুন এবং অ্যান্ড্রয়েড: লেআউট_গ্রাভিটি = "কেন্দ্র" টেক্সটভিউ থেকে লিনিয়ারলয়েটে সরানো।
ডমিনিকএম

35

অন্যান্য উত্তরগুলির সাথে আমার খুব বেশি সাফল্য হয়নি ... নীচে ঠিক একইভাবে অ্যান্ড্রয়েড ৪.৪.৩ এ আমার জন্য সমর্থন লাইব্রেরি ভি in এর অ্যাকশনবার ব্যবহার করে কাজ করেছে। নেভিগেশন ড্রয়ার আইকন ("বার্গার মেনু বোতাম") দেখানোর জন্য আমার এটি সেট আপ আছে

এক্সএমএল

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

শিরোনাম পাঠ্যের সাহায্যে আপনার নিজস্ব কাস্টম ভিউটি সংজ্ঞায়িত করুন, তারপরে সের্গেই যেমন বলেছেন তেমন লেআউটপ্যারামগুলি সেট কাস্টমভিউ () তে পাস করুন।

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 বা আপনার নেভিগেশন ড্রয়ার, অ্যাপ্লিকেশন আইকন ইত্যাদি ব্যবহার করা উচিত না SH এটি ঘটবে বিশেষত যখন কোনও অ্যাকশন বোতাম প্রদর্শিত না হয়।

সম্পাদিত : এক্সএমএল লেআউটে সমান:

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

এর জন্য লেআউটপ্যারাম নির্দিষ্ট করার দরকার নেই।

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

8

আহমদের উত্তরের মাত্র একটি দ্রুত সংযোজন। টেক্সটভিউয়ের সাথে কাস্টম ভিউ ব্যবহার করার সময় আপনি getSupportActionBar ()। SetTitle ব্যবহার করতে পারবেন না। সুতরাং আপনার কাস্টম ভিউ বরাদ্দের পরে আপনার অনক্রিট () পদ্ধতিতে এই কাস্টম অ্যাকশনবারের সাথে একাধিক ক্রিয়াকলাপ (এই এক এক্সএমএল ব্যবহার করে) শিরোনাম সেট করতে :

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

4

ঠিক আছে. উপরের স্বীকৃত উত্তরের সাথে মিলিত অনেক গবেষণার পরে, আমি এমন একটি সমাধান নিয়ে এসেছি যা আপনার অ্যাকশন বারে অন্যান্য জিনিস (পিছনে / হোম বোতাম, মেনু বোতাম) রাখলে এটিও কাজ করে। সুতরাং মূলত আমি ওভাররাইড পদ্ধতিগুলিকে একটি বেসিক ক্রিয়াকলাপে রেখেছি (যা অন্যান্য সমস্ত ক্রিয়াকলাপ প্রসারিত হয়) এবং কোডটি সেখানে রেখেছি। এই কোডটি প্রতিটি ক্রিয়াকলাপের শিরোনাম সেট করে যেমন এটি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল সরবরাহ করা হয় এবং অন্যান্য কাস্টম স্টাফও করে (যেমন অ্যাকশন বারের বোতামগুলিতে একটি কাস্টম টিন্ট সেট করা, এবং শিরোনামে কাস্টম ফন্ট)। আপনার কেবল ক্রিয়াকলাপটি অ্যাকশন_বার.এক্সএমএল ছেড়ে দিতে হবে এবং পরিবর্তে প্যাডিং ব্যবহার করতে হবে। 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>

সম্পাদনা : ক্রিয়াকলাপটি লোড হওয়ার পরে যদি আপনাকে শিরোনামটি অন্য কোনওটিতে পরিবর্তন করতে হয় (অনক্রিপটপশনস মেনু ইতিমধ্যে বলা হয়েছে), আপনার ক্রিয়া_বার.এক্সএমএলে অন্য একটি টেক্সটভিউ রাখুন এবং এই নতুন টেক্সটভিউতে "প্যাড" করতে নিম্নলিখিত কোডটি ব্যবহার করুন, পাঠ্য সেট করুন এবং প্রদর্শন করুন এটি:

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

সম্পাদনা (25.08.2016) : আপনার ক্রিয়াকলাপটিতে "ব্যাক বোতাম" থাকলে এটি অ্যাপকম্প্যাট 24.2.0 রিভিশন (আগস্ট 2016) এর সাথে কাজ করে না। আমি একটি বাগ রিপোর্ট ( ইস্যু 220899 ) দায়ের করেছি , তবে এটির কোনও ব্যবহার রয়েছে কিনা তা আমি জানি না (সন্দেহ এটি শীঘ্রই যে কোনও সময় স্থির করা হবে)। এদিকে সমাধানটি হ'ল বাচ্চাদের ক্লাসটি অ্যাপকম্প্যাটআইজেজবটনক্লাসের সমান কিনা এবং এটি একই কাজ করে, কেবল প্রস্থটি 30% (মূল অ্যাপ্লিকেশনবিজেট বাটন.জেটভিডথ () * 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;

আপনার পছন্দ অনুসারে কাস্টম_অ্যাকশনবার.এক্সএমএল লেআউট সংজ্ঞায়িত করতে হবে যেমন:

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

সহজ, এবং এটি কাজ করে! উদ্ধৃতি
লেখক

@ অ্যান্ড্রুব্র্যামওল getActionBar () .SsetDisplayOptions (অ্যাকশনবার। 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);

কাস্টম_অ্যাকশনবারের নীচে লেআউট:

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

3

কোড এখানে আমার জন্য কাজ করে।

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

আপনার সেট করা দরকার 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 );

"আমি অ্যাকশনবার.লায়আউটপ্যারামস সেট করছি ..." - এর কোনও মানে নেই। এছাড়াও, দয়া করে আপনার কোডটি ফর্ম্যাট করুন।
সাশোম

হ্যাঁ, প্লিজ 曲 连 not কে পরাজিত করবেন না, তার সেটডিসপ্লেঅ্যাপশন উদাহরণ আমাকে কেন্দ্রিক শিরোনাম যুক্ত করতে এবং হোম বোতাম প্রদর্শন করতে সহায়তা করে
ডিজেড্যান্স

"আর.লেআউট.অ্যাকশন_বার_টাইটেল" কী? আমি এটি খুঁজে পাচ্ছি না।
হোসে ম্যানুয়েল অ্যাবারকা রদ্রিগেজ

"আর.লেআউট.অ্যাকশন_বার_টাইটেল" কী? এটা বর্ণনা কর. আমাকে কি সেই কাস্টম এক্সএমএল manifests.xML- তে নিবন্ধিত করতে হবে
অজয় কুলকার্নি

2

সর্বোত্তম এবং সহজ উপায়, বিশেষত যারা কোনও এক্সএমএল বিন্যাস ছাড়াই মহাকর্ষ কেন্দ্রের সাথে পাঠ্য দর্শন চান।

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

কেবলমাত্র কোটলিন সমাধান যা এক্সএমএল লেআউটগুলিতে পরিবর্তন করতে হবে না:

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

@ স্ট্যানিস্লাস হিলির উত্তর অনুসারে এখানে একটি সম্পূর্ণ কোটলিন + অ্যান্ড্রয়েডেক্স সমাধান রয়েছে। আমি আশা করি এটি অন্যের পক্ষে কার্যকর হতে পারে। এটি তখনকার ক্ষেত্রে যখন আপনার একটি ক্রিয়াকলাপ থাকে যা একাধিক টুকরো হোস্ট করে, একই সময়ে কেবলমাত্র একটি টুকরা সক্রিয় থাকে।

আপনার ক্রিয়াকলাপে:

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

1

ক্রিয়াটি সারিবদ্ধ করার জন্য এখানে একটি দ্রুত টিপস:

android:label=" YourTitle"

আপনার অ্যাকশনবারের সক্ষম আছে তা ধরে নিয়ে, আপনার শিরোনামটিকে কেন্দ্রে রেখে কিছু স্থান (সামঞ্জস্য করা যায়) দিয়ে এটি আপনার কার্যকলাপে যুক্ত করতে পারেন in

যাইহোক, এটি কেবল ছদ্মবেশী এবং অবিশ্বাস্য পদ্ধতি। আপনার সম্ভবত এটি করা উচিত নয়। সুতরাং, সর্বোত্তম কাজটি হ'ল একটি কাস্টম অ্যাকশনবার তৈরি করা। সুতরাং, আপনি যা করতে চান তা হ'ল ডিফল্ট অ্যাকশনবারটি সরান এবং এটিকে একটি অ্যাকশনবার হিসাবে প্রতিস্থাপন করতে ব্যবহার করুন।

<androidx.constraintlayout.widget.ConstraintLayout
        android:elevation="30dp"
        android:id="@+id/customAction"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/colorOnMain"
        android:orientation="horizontal">
        

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:textAllCaps="true"
            android:textColor="#FFF"
            android:textSize="18sp"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

আমি টেক্সটভিউকে কেন্দ্র করে কনস্ট্রেন্ট লেআউট ব্যবহার করেছি এবং 56 ডিপি উচ্চতা সহ 10 ডিপি উচ্চতা ব্যবহার করেছি যাতে এটি ডিফল্ট অ্যাকশনবারের মতো দেখা যায়।


এই জাতীয় কিছু খুঁজছিল, বিঙ্গো!
অ্যান্ডারসন স্পেন্সার

0

অন্যান্য টিউটোরিয়ালগুলি আমি মেনু আইটেমগুলি গোপন করে পুরো অ্যাকশন বারের লেআউটটিকে ওভাররাইড করে দেখেছি। আমি এটি নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করে কাজ করেছি:

নিম্নলিখিত হিসাবে একটি এক্সএমএল ফাইল তৈরি করুন:

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

কোটলিন ব্যবহারকারীদের জন্য:

আপনার ক্রিয়াকলাপে নিম্নলিখিত কোডটি ব্যবহার করুন:

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

0

আমার সমাধানটি হ'ল সরঞ্জাম দণ্ডের পাঠ্য অংশটি পৃথক রাখা, শৈলীর সংজ্ঞা দেওয়া এবং বলা, কেন্দ্র বা যেকোন প্রান্তিককরণ। এটি এক্সএমএল নিজেই করা যেতে পারে। কিছু প্যাডিংস গণনা করার পরে নির্দিষ্ট করা যেতে পারে যখন আপনার এমন ক্রিয়া থাকে যা সর্বদা দৃশ্যমান থাকে। আমি সরঞ্জামদণ্ড থেকে তার শিশু পাঠ্য ভিউতে দুটি বৈশিষ্ট্য সরিয়েছি। এই টেক্সটভিউ টুকরা থেকে অ্যাক্সেস করতে আইডি সরবরাহ করা যেতে পারে।

    <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:fitsSystemWindows="true">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.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" >
            <!--android:theme="@style/defaultTitleTheme"
            app:titleTextColor="@color/white"-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:paddingStart="@dimen/icon_size"
                android:text="@string/title_home"
                style="@style/defaultTitleTheme"
                tools:ignore="RtlSymmetry" />
        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

-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;)
খান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.