Android'de ActionBar başlığı nasıl ortaya hizalanır?


102

Metni içinde ortalamak için aşağıdaki kodu kullanmaya çalışıyorum ActionBar, ancak kendini sola hizalıyor.

Merkezde görünmesini nasıl sağlarsınız?

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

Bu ÇOK eski bir sorudur. Ancak aşağıda gördüğüm tek çözüm özel bir eylem çubuğu oluşturmaktır. İşte özel bir eylem çubuğu oluşturmadan çözüm. stackoverflow.com/a/42465266/3866010 umarım birine yardımcı olur
ᴛʜᴇᴘᴀᴛᴇʟ

1
Bu soruyu sorduktan yaklaşık 8 yıl sonra, yanıtı tekrar kullanarak: D
Sourabh Saldi

Yanıtlar:


201

ABS'de ortalanmış bir başlığa sahip olmak için (bunu varsayılan olarak almak istiyorsanız ActionBar, yöntem adlarındaki "desteği" kaldırmanız yeterlidir), şunu yapabilirsiniz:

Faaliyetinizde, onCreate()yönteminizde:

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>

Şimdi Actionbarsadece bir başlığa sahip olmalısınız . Özel bir arka plan ayarlamak istiyorsanız, bunu yukarıdaki Düzende ayarlayın (ancak daha sonra ayarlamayı unutmayın android:layout_height="match_parent").

veya ile:

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

6
buna özel geri düğmesi resmi nasıl eklenir?
Sourabh Saldi

13
Benim için sonuç, gösterdiğim eylem düğmelerine bağlı olarak eylem çubuğunun biraz sağa veya sola kaydırılmasıydı. Düzeltmek için, layout_width değerini "WRAP_CONTENT" olarak
ayarladım

11
Pepillo'nun çözümü, içerik artık ortalanmış olmadığından benim için işe yaramadı. Bunu android:layout_gravity="center"LinearLayout'a ekleyerek çözebilirim.
Silox

8
@Nezam beklenen bir davranış. ((TextView)actionBar.getCustomView().findViewById(R.id.textView1)).setText("new title");TextView1'in CustomView'ınızdaki kimliğiniz olduğu yerde deneyin TextView.
Süfyan

8
Menü öğeleri varsa, doğru ortalanmayacaktır. Başlığın gerçekten her zaman ortalanmış olmasını sağlamak için LinearLayout'a "WRAP_CONTENT" ekleyin ve android: layout_gravity = "center" öğesini TextView'dan LinearLayout'a taşıyın.
DominicM

35

Diğer yanıtlarla pek başarılı olamadım ... aşağıdaki, v7.0 destek kitaplığındaki ActionBar'ı kullanarak Android 4.4.3'te benim için tam olarak işe yarayan şeydi. Gezinme çekmecesi simgesini ("burger menü düğmesi") gösterecek şekilde ayarladım

XML

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

Java

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

Neden bir paramsnesne oluşturmamız gerekiyor ? ActionBar'a atadığımız harici yerleşim dosyasında yerçekimini belirtemez miyiz?
Deep Lathia

10

Kendi özel görünümünüzü başlık metniyle tanımlayın, ardından Sergii'nin dediği gibi LayoutParams'ı setCustomView () öğesine iletin.

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

DÜZENLENDİ : En azından genişlik için WRAP_CONTENT veya gezinme çekmecenizi, uygulama simgenizi vb. Kullanmalısınız. GÖSTERİLMEYECEKTİR (işlem çubuğundaki diğer görünümlerin üstünde gösterilen özel görünüm). Bu, özellikle hiçbir işlem düğmesi gösterilmediğinde ortaya çıkar.

DÜZENLENMİŞ : xml düzeninde eşdeğer:

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

Bu, LayoutParams'in belirtilmesini gerektirmez.

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

8

Ahmed'in cevabına sadece hızlı bir ek. Artık bir TextView ile özel bir görünüm kullanırken getSupportActionBar (). SetTitle'ı kullanamazsınız. Bu nedenle, özel bir görünüm atadıktan sonra onCreate () yönteminizde bu özel ActionBar ile birden çok Etkinliğiniz olduğunda (bunu kullanarak) başlığı ayarlamak için :

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

4

TAMAM. Çok sayıda araştırmadan sonra, yukarıdaki kabul edilen cevapla birlikte, işlem çubuğunuzda başka şeyler varsa (geri / ana sayfa düğmesi, menü düğmesi) da işe yarayan bir çözüm buldum. Bu nedenle, temelde geçersiz kılma yöntemlerini (diğer tüm etkinliklerin kapsamını genişlettiği) temel bir etkinliğe koydum ve kodu oraya yerleştirdim. Bu kod, her bir etkinliğin başlığını AndroidManifest.xml'de sağlandığı şekilde belirler ve ayrıca başka özel şeyler de yapar (işlem çubuğu düğmelerinde özel bir renk tonu ve başlıkta özel yazı tipi ayarlamak gibi). Sadece action_bar.xml'de yerçekimini bırakmanız ve bunun yerine dolgu kullanmanız gerekir. actionBar != nullTüm etkinliklerimde olmadığı için çek kullanılıyor.

4.4.2 ve 5.0.1'de test edildi

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

Ve benim action_bar.xml'im şöyle (ilgilenen varsa):

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

DÜZENLEME : Etkinlik yüklendikten SONRA başlığı başka bir şeye değiştirmeniz gerekirse (onCreateOptionsMenu zaten çağrılmıştır), action_bar.xml dosyanıza başka bir TextView koyun ve bu yeni TextView "pad" için aşağıdaki kodu kullanın, metni ayarlayın ve o:

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

DÜZENLEME (25.08.2016) : Etkinliğinizde bir "geri düğmesi" varsa bu, appcompat 24.2.0 revizyonunda (Ağustos 2016) çalışmaz. Bir hata raporu gönderdim ( Sayı 220899 ), ancak bunun herhangi bir faydası olup olmadığını bilmiyorum (yakında herhangi bir zamanda düzeltileceğinden şüphe duyuyorum). Bu arada çözüm, çocuğun sınıfının AppCompatImageButton.class'a eşit olup olmadığını kontrol etmek ve aynı şeyi yapmaktır, genişliği yalnızca% 30 artırın (ör. AppCompatImageButton.getWidth () * 1.3, bu değeri orijinal dolgudan çıkarmadan önce):

padding -= appCompatImageButton.getWidth()*1.3;

Bu arada, orada bazı dolgu / marj kontrolleri yaptım:

    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

customview olmadan eylem çubuğu başlığını ortalayabilir. gezinme çekmecesi için de mükemmel çalışıyor

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

Mutlu kodlamalar. teşekkür ederim.


3

Bir çok araştırmadan sonra: Bu aslında işe yarıyor:

 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;

Gereksiniminize göre olan custom_actionbar.xml düzenini tanımlamanız gerekir, örneğin:

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


@AndrewBramwell getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_CUSTOM); boş işaretçi istisnası atıyor
Ruchir Baronia

Bunu nasıl düzeltebileceğimi biliyor musunuz?
Ruchir Baronia

3

Güzel çalışıyor.

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 düzeninin altında:

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

Kod burada benim için çalışan.

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

Ayarlamanız gerekiyor ActionBar.LayoutParams.WRAP_CONTENTveActionBar.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'ı ayarladım ..." - bu mantıklı değil. Ayrıca, lütfen kodunuzu biçimlendirin.
sashoalm

Hah, plz yenme 曲 连 强, onun setDisplayOptions örneği ortalanmış başlık eklememe VE ana sayfa düğmesini göstermeme yardımcı oluyor
djdance

"R.layout.action_bar_title" nedir? Bulamıyorum
Jose Manuel Abarca Rodríguez

"R.layout.action_bar_title" nedir? Açıkla. Bu özel xml'yi manifests.xml'e kaydettirmem gerekiyor mu
Ajay Kulkarni

2

En iyi ve en kolay yol, özellikle herhangi bir xml düzeni olmadan sadece yerçekimi merkeziyle metin görünümü isteyenler için.

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

uygulama temasını kontrol et !!
turbandroid

2

XML Düzenlerinde değişiklik yapılmasını gerektirmeyen yalnızca Kotlin çözümü:

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

İşte @ Stanislas Heili'nin cevabına dayanan eksiksiz bir Kotlin + androidx çözümü. Umarım başkaları için faydalı olabilir. Bu, aynı anda yalnızca bir parçanın etkin olduğu birden çok parçayı barındıran bir etkinliğiniz olduğunda geçerlidir.

Aktivitenizde:

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

Parçalarınızda:

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

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

1

Eylemi ortaya hizalamak için hızlı bir ipucu:

android:label=" YourTitle"

Eylem Çubuğunu Etkinleştirdiğiniz varsayılarak, bunu merkeze yerleştirmek için biraz boşluk bırakarak (Ayarlanabilir) aktivitenize ekleyebilirsiniz.

Ancak, bu sadece beceriksiz ve güvenilmez bir yöntemdir. Muhtemelen bunu yapmamalısın. Bu nedenle, yapılacak en iyi şey, özel bir ActionBar oluşturmaktır. Yani, yapmak istediğiniz şey, varsayılan Eylem Çubuğunu kaldırmak ve bunu bir Eylem Çubuğu olarak değiştirmek için kullanmaktır.

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

TextView'i ortalamak için Constraint Layout kullandım ve varsayılan ActionBar ile aynı görünmesi için 56dp yüksekliğinde 10dp yükseklik kullandım.


bunun gibi bir şey arıyordu, BINGO!
Anderson Spencer

0

Gördüğüm diğer öğreticiler, MenuItems'i gizleyen tüm eylem çubuğu düzenini geçersiz kılar. Sadece aşağıdaki adımları uygulayarak çalıştırdım:

Aşağıdaki gibi bir xml dosyası oluşturun:

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

Ve sınıfta yapın:

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

bu işe yaramıyor - belki de gezinme menüsü düğmesini gösterdiğim için?
Someone Somewhere

0

Kotlin kullanıcıları için:

Aktivitenizde aşağıdaki kodu kullanın:

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

Ve XML / kaynak düzeni:

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

Benim çözümüm, araç çubuğunun metin bölümünü ayrı tutmak, stili tanımlamak ve örneğin merkeze veya hangi hizalamaya göre ayarlamak olacaktır. XML'in kendisinde yapılabilir. Her zaman görünür olan eylemleriniz olduğunda, hesaplamalar yaptıktan sonra bazı doldurmalar belirtilebilir. Araç çubuğundan iki özniteliği TextView alt öğesine taşıdım. Bu textView, parçalardan erişilebilmesi için id sağlanabilir.

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

Bu kod geri düğmesini gizlemez, Aynı zamanda başlığı ortaya hizalar.

oncreate'de bu yöntemi çağırın

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;)
Khan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.