Bagaimana cara mensejajarkan judul ActionBar di Android?

99

Saya mencoba menggunakan kode berikut untuk memusatkan teks di ActionBar, tetapi itu menyelaraskan dirinya ke kiri.

Bagaimana Anda membuatnya muncul di tengah?

ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle("Canteen Home");
actionBar.setHomeButtonEnabled(true);
actionBar.setIcon(R.drawable.back);
Sourabh Saldi
sumber
Ini adalah pertanyaan yang SANGAT lama. Namun, satu-satunya solusi yang saya lihat di bawah adalah membuat bilah tindakan kustom. Jadi inilah solusinya tanpa membuat bilah tindakan khusus. stackoverflow.com/a/42465266/3866010 berharap ini membantu seseorang
ᴛʜᴇᴘᴀᴛᴇʟ
1
Hampir 8 tahun setelah saya menanyakan pertanyaan ini, menggunakan jawabannya lagi: D
Sourabh Saldi

Jawaban:

197

Untuk memiliki judul yang berpusat di ABS (jika Anda ingin memiliki ini secara default ActionBar, cukup hapus "dukungan" di nama metode), Anda dapat melakukan ini:

Dalam Aktivitas Anda, dalam onCreate()metode Anda :

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>

Sekarang Anda harus memiliki Actionbarhanya dengan satu judul. Jika Anda ingin menyetel latar belakang khusus, setel di Tata Letak di atas (tapi jangan lupa untuk menyetelnya android:layout_height="match_parent").

atau dengan:

getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.yourimage));
Ahmad
sumber
6
bagaimana cara menambahkan gambar tombol kembali kustom ke ini?
Sourabh Saldi
13
Bagi saya, hasilnya adalah panel tindakan sedikit bergeser ke kanan atau kiri tergantung pada tombol tindakan yang saya tunjukkan. Untuk memperbaikinya, saya cukup menyetel layout_width ke "WRAP_CONTENT"
alfongj
11
Solusi Pepillo tidak berhasil untuk saya, karena konten tidak lagi terpusat sama sekali. Saya bisa menyelesaikan ini dengan menambahkan android:layout_gravity="center"ke LinearLayout.
Silox
8
@Nezam itu perilaku yang diharapkan. Coba ((TextView)actionBar.getCustomView().findViewById(R.id.textView1)).setText("new title");, di mana textView1 adalah TextViewID Anda di CustomView.
Sufian
8
Jika ada item menu, itu tidak akan terpusat dengan benar. Untuk benar-benar selalu memiliki judul yang berpusat, tambahkan "WRAP_CONTENT" ke LinearLayout dan pindahkan android: layout_gravity = "center" dari TextView ke LinearLayout.
DominicM
35

Saya belum banyak berhasil dengan jawaban lain ... di bawah ini persis seperti yang berhasil untuk saya di Android 4.4.3 menggunakan ActionBar di pustaka dukungan v7. Saya sudah menyiapkannya untuk menampilkan ikon panel samping navigasi ("tombol menu burger")

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>

Jawa

//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);
Seseorang disuatu tempat
sumber
Mengapa kita perlu membuat paramsobjek ?? Bisakah kita tidak menentukan gravitasi di file tata letak eksternal yang kita tetapkan ke ActionBar.
Deep Lathia
10

Tentukan tampilan kustom Anda sendiri dengan teks judul, lalu teruskan LayoutParams ke setCustomView (), seperti yang dikatakan Sergii.

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

DIEDIT : Setidaknya untuk lebar, Anda harus menggunakan WRAP_CONTENT atau panel samping navigasi, ikon aplikasi, dll. TIDAK AKAN DITAMPILKAN (tampilan kustom ditampilkan di atas tampilan lain di bilah tindakan). Ini akan terjadi terutama jika tidak ada tombol tindakan yang ditampilkan.

DIEDIT : Setara dengan tata letak 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">

Ini tidak memerlukan LayoutParams untuk ditentukan.

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

Sekadar tambahan singkat dari jawaban Ahmad. Anda tidak dapat menggunakan getSupportActionBar (). SetTitle lagi saat menggunakan tampilan kustom dengan TextView. Jadi untuk menyetel judul saat Anda memiliki beberapa Aktivitas dengan ActionBar kustom ini (menggunakan yang satu ini xml), dalam metode onCreate () Anda setelah Anda menetapkan tampilan kustom:

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

BAIK. Setelah banyak penelitian, dikombinasikan dengan jawaban yang diterima di atas, saya telah menemukan solusi yang juga berfungsi jika Anda memiliki hal lain di bilah tindakan Anda (tombol kembali / beranda, tombol menu). Jadi pada dasarnya saya telah meletakkan metode override dalam aktivitas dasar (yang diperluas oleh semua aktivitas lainnya), dan menempatkan kode di sana. Kode ini menetapkan judul setiap aktivitas seperti yang disediakan di AndroidManifest.xml, dan juga melakukan beberapa hal khusus lainnya (seperti menyetel warna khusus pada tombol bilah tindakan, dan font khusus pada judul). Anda hanya perlu menghilangkan gravitasi di action_bar.xml, dan menggunakan padding sebagai gantinya. actionBar != nullcek digunakan, karena tidak semua aktivitas saya memilikinya.

Diuji pada 4.4.2 dan 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);
} ...

Dan action_bar.xml saya seperti ini (jika ada yang tertarik):

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

EDIT : Jika Anda perlu mengubah judul menjadi sesuatu yang lain SETELAH aktivitas dimuat (onCreateOptionsMenu sudah dipanggil), letakkan TextView lain di action_bar.xml Anda dan gunakan kode berikut untuk "mengisi" TextView baru ini, setel teks dan tampilkan Itu:

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) : Ini tidak berfungsi dengan revisi appcompat 24.2.0 (Agustus 2016), jika aktivitas Anda memiliki "tombol kembali". Saya mengajukan laporan bug ( Masalah 220899 ), tetapi saya tidak tahu apakah ada gunanya (ragu ini akan diperbaiki dalam waktu dekat). Sementara itu solusinya adalah memeriksa apakah kelas anak sama dengan AppCompatImageButton.class dan melakukan hal yang sama, hanya menambah lebar sebesar 30% (misalnya appCompatImageButton.getWidth () * 1.3 sebelum mengurangi nilai ini dari padding asli):

padding -= appCompatImageButton.getWidth()*1.3;

Sementara itu, saya melakukan beberapa pemeriksaan padding / margin di sana:

    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;
        }
    }
Untuk berjaga-jaga
sumber
4

tanpa customview, ia dapat memusatkan judul bilah tindakan. ini berfungsi sempurna untuk laci navigasi juga

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

Selamat membuat kode. Terima kasih.

Dinithe Pieris
sumber
3

Setelah banyak penelitian: Ini benar-benar berfungsi:

 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;

Anda harus menentukan tata letak custom_actionbar.xml yang sesuai dengan kebutuhan Anda, misalnya:

<?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>
Roshan Ramtel
sumber
Sederhana, dan berhasil! quotehd.com/imagequotes/authors39/tmb/…
AndrewBramwell
@AndrewBramwell getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_CUSTOM); melempar pengecualian pointer nol
Ruchir Baronia
Apakah kalian tahu bagaimana saya bisa memperbaikinya?
Ruchir Baronia
3

Ini bekerja dengan baik.

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

Di bawah tata letak 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>
Vlad
sumber
2

Anda perlu mengatur ActionBar.LayoutParams.WRAP_CONTENTdanActionBar.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 );
曲 连 强
sumber
"Saya menyetel ActionBar.LayoutParams ..." - itu tidak masuk akal. Selain itu, format kode Anda.
sashoalm
Hah, tolong jangan mengalahkan 曲 连 强, contoh setDisplayOptions-nya membantu saya menambahkan judul di tengah DAN menampilkan tombol beranda
djdance
Apa itu "R.layout.action_bar_title"? Saya tidak dapat menemukannya.
Jose Manuel Abarca Rodríguez
Apa itu "R.layout.action_bar_title"? Jelaskan itu. Apakah saya perlu mendaftarkan xml khusus itu di manifests.xml
Ajay Kulkarni
2

Cara terbaik dan termudah, khusus untuk mereka yang hanya menginginkan tampilan teks dengan pusat gravitasi tanpa tata letak 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);
turbandroid
sumber
periksa tema aplikasi Anda !!
turbandroid
2

Kode di sini bekerja untuk saya.

    // 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);
}
Lakukan Xuan Nguyen
sumber
2

Solusi khusus Kotlin yang tidak memerlukan perubahan dalam Tata Letak 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
}
Stanislas Heili
sumber
2

Berikut adalah solusi Kotlin + androidx lengkap, yang dibangun berdasarkan jawaban dari @Stanislas Heili. Semoga bermanfaat bagi orang lain. Ini untuk kasus ketika Anda memiliki aktivitas yang menghosting beberapa fragmen, dengan hanya satu fragmen yang aktif pada waktu yang sama.

Dalam aktivitas Anda:

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

Dalam fragmen Anda:

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

    activity?.title = "some title for fragment"
}
Menurut Christian Henden
sumber
0

Tutorial lain yang pernah saya lihat menimpa seluruh tata letak bilah tindakan yang menyembunyikan MenuItems. Saya sudah berhasil hanya dengan melakukan langkah-langkah berikut:

Buat file xml sebagai berikut:

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

Dan di kelas lakukan:

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");
Leonardo Cardoso
sumber
ini tidak berfungsi - mungkin karena saya menampilkan tombol menu navigasi?
Seseorang Di Suatu Tempat
0

Untuk pengguna Kotlin:

Gunakan kode berikut dalam aktivitas Anda:

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

Dan XML / tata letak sumber daya:

<?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>
Maihan Nijat
sumber
-1

Kode ini tidak akan menyembunyikan tombol kembali, waktu yang sama akan menyelaraskan judul di tengah.

panggil metode ini di 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);
    }
}
Gurumoorthy Arumugam
sumber
java.lang.NullPointerException;)
Khan