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