Androidツールバーの中央のタイトルとカスタムフォント


366

ツールバーのタイトルにカスタムフォントを使用する正しい方法を見つけて、ツールバーの中央に配置しようとしています(クライアントの要件)。

現時点では、古き良きActionBarを使用しており、タイトルを空の値に設定してsetCustomView、カスタムフォントTextViewを配置し、ActionBar.LayoutParamsを使用して中央揃えします。

それを行うより良い方法はありますか?新しいツールバーをアクションバーとして使用する。

回答:


718

カスタムタイトルを使用するためにToolbar必要なことは、それToolbarが単なるViewGroupであるため、次のようにカスタムタイトルを追加できることです。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >


     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title" />


    </android.support.v7.widget.Toolbar>

これはTextView、通常のものであるため、好みのスタイルを設定できることを意味しますTextView。だからあなたの活動ではあなたはそのようにタイトルにアクセスできます:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);

5
代わりにandroid:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_gravity = "center"を使用することをお勧めします。
SteelBytes 2014年

194
他の誰かがデフォルトのアプリ名のタイトルを削除できない場合は、次のようにします。1. setSupportActionBar(yourToolbar)を呼び出します。2. getSupportActionBar()。setDisplayShowTitleEnabled(false);を呼び出します。
リックサンチェス

75
カスタマイズされたTextViewにデフォルトのスタイルを使い続けるには、次のようなことを試して くださいstyle="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"この回答を参照してください)。
Jonik

5
android:paddingRight = "?attr / actionBarSize"を追加すると、ボタン(ホーム、ナビゲーションドロワーなど)がある場合にテキストを画面の中央に中央揃えするのに役立ちます
Gordak

5
ツールバーにハンバーガーのアイコンがあるとどうなりますか?ツールバー全体の幅の中央ではなく、ToolbarWidth-HamburgerIconWidthの中央になります。
Akshay

75

ToolBarのタイトルはスタイル設定可能です。カスタマイズはテーマで行う必要があります。例を挙げましょう。

ツールバーのレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    style="@style/ToolBarStyle.Event"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="@dimen/abc_action_bar_default_height_material" />

スタイル:

<style name="ToolBarStyle" parent="ToolBarStyle.Base"/>

<style name="ToolBarStyle.Base" parent="">
    <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

<style name="ToolBarStyle.Event" parent="ToolBarStyle">
    <item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item>
</style>

<style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
    <!--Any text styling can be done here-->
    <item name="android:textStyle">normal</item>
    <item name="android:textSize">@dimen/event_title_text_size</item>
</style>

59
これが正しい方法です。別のものを追加することTextViewは少しハッキーですが、反射の答えはただの悪です。
DariusL 2015

9
きれいですが、スタイルからカスタムフォントを設定することはできません。悲しいことに。
niqueco

20
タイトルの配置を変更することもできません。
Terry

7
@ user1560102ツールバーにTextViewを追加することについて、何も面倒なことはありません。そのために設計されました。
Tim Malseed 2015年

107
これはテキストを中央揃えしません。
Sebastian Roth

69

これは、@ MrEngineer13の回答と@Jonikと@Rick Sanchezのコメントを使用してすべてのピースを結合し、正しい順序でタイトルを簡単に中央揃えできるようにするためのものです。

レイアウトTextAppearance.AppCompat.Widget.ActionBar.Title

    <android.support.v7.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">

        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"                      
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            android:layout_gravity="center" />

    </android.support.v7.widget.Toolbar>

正しい順序で達成する方法:

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);

    setSupportActionBar(toolbar);
    mTitle.setText(toolbar.getTitle());

    getSupportActionBar().setDisplayShowTitleEnabled(false);

@ MrEngineer13の回答に投票することを忘れないでください!!!

これがサンプルプロジェクトToolbarCenterTitleSampleです。

ここに画像の説明を入力してください

他の誰かを助けることを願っています;)


5
setDisplayHomeAsUpEnabled(true)とsetDisplayShowHomeEnabled(true)を設定すると、戻る矢印を有効にします。その後、タイトルは中央に来ていません。私はactionBar.setTitle( "");を設定しようとしました。およびsetDisplayShowTitleEnabled(false)。しかし、それでも問題を解決できません
Prashanth Debbadwar

あなたはそれをテストしましたScrolling Activityか?
2017年

戻る矢印を使用すると、タイトルが中央に配置されないことは事実です(戻る矢印の幅の半分だけ右にずれています)。テキストを中央揃えにするために、必要に応じて、プログラムでテキストボックスの右側に十分なマージンをプログラムで決定したと思います。
誰かがどこかで

52

ToolBarのタイトルTextViewに直接アクセスできないため、リフレクションを使用してアクセスします。

  private TextView getActionBarTextView() {
    TextView titleTextView = null;

    try {
        Field f = mToolBar.getClass().getDeclaredField("mTitleTextView");
        f.setAccessible(true);
        titleTextView = (TextView) f.get(mToolBar);
    } catch (NoSuchFieldException e) {
    } catch (IllegalAccessException e) {
    }
    return titleTextView;
}

3
これはハッキーですが、ツールバーのテキストビューにアクセスする方法を見つけようとした後、このソリューションは私にとってはうまくいきます。ありがとうございました。
falc0nit3 2014

1
タイトルのためにうまく働きました。しかし、このようにmSubtitleTextViewを取得しようとすると、例外が発生しました。原因:java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド 'void android.widget.TextView.setTypeface(android.graphics.Typeface)'を呼び出そうとしました
Vinod

5
注:ツールバーのタイトルを設定した後でのみ、「mTitleTextView」フィールドにアクセスできます。フィールドは最初の使用で遅延初期化されます。
ファンコーダー2015

2
ProGuardでコードを難読化して、どうmTitleTextViewなるのabcde12345ですか?
voghDev 2016年

1
その場合、@ voghDev getDeclaredFieldはNoSuchFieldExceptionをスローし、コードが機能しなくなります。
ジェレミー

30

これはTextView、からインスタンスを検索するためのタイトルテキスト依存のアプローチToolbarです。

  public static TextView getToolbarTitleView(ActionBarActivity activity, Toolbar toolbar){
    ActionBar actionBar = activity.getSupportActionBar();
    CharSequence actionbarTitle = null;
    if(actionBar != null)
        actionbarTitle = actionBar.getTitle();
    actionbarTitle = TextUtils.isEmpty(actionbarTitle) ? toolbar.getTitle() : actionbarTitle;
    if(TextUtils.isEmpty(actionbarTitle)) return null;
    // can't find if title not set
    for(int i= 0; i < toolbar.getChildCount(); i++){
        View v = toolbar.getChildAt(i);
        if(v != null && v instanceof TextView){
            TextView t = (TextView) v;
            CharSequence title = t.getText();
            if(!TextUtils.isEmpty(title) && actionbarTitle.equals(title) && t.getId() == View.NO_ID){
                //Toolbar does not assign id to views with layout params SYSTEM, hence getId() == View.NO_ID
                //in same manner subtitle TextView can be obtained.
                return t;
            }
        }
    }
    return null;
}

28

次のクラスを定義します。

public class CenteredToolbar extends Toolbar {

    private TextView centeredTitleTextView;

    public CenteredToolbar(Context context) {
        super(context);
    }

    public CenteredToolbar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CenteredToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setTitle(@StringRes int resId) {
        String s = getResources().getString(resId);
        setTitle(s);
    }

    @Override
    public void setTitle(CharSequence title) {
        getCenteredTitleTextView().setText(title);
    }

    @Override
    public CharSequence getTitle() {
        return getCenteredTitleTextView().getText().toString();
    }

    public void setTypeface(Typeface font) {
        getCenteredTitleTextView().setTypeface(font);
    }

    private TextView getCenteredTitleTextView() {
        if (centeredTitleTextView == null) {
            centeredTitleTextView = new TextView(getContext());
            centeredTitleTextView.setTypeface(...);
            centeredTitleTextView.setSingleLine();
            centeredTitleTextView.setEllipsize(TextUtils.TruncateAt.END);
            centeredTitleTextView.setGravity(Gravity.CENTER);
            centeredTitleTextView.setTextAppearance(getContext(), R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);

            Toolbar.LayoutParams lp = new Toolbar.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            lp.gravity = Gravity.CENTER;
            centeredTitleTextView.setLayoutParams(lp);

            addView(centeredTitleTextView);
        }
        return centeredTitleTextView;
    }
}

...そして次のToolbarように通常の代わりにそれを使用します:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent">

        <your.packagename.here.CenteredToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            android:theme="?attr/actionBarTheme"
            app:title="@string/reset_password_page_title"/>

        <!-- Other views -->

</RelativeLayout>

あなたはまだあなたの中にこれらの2行のコードが必要ですActivity(標準のようにToolbar):

Toolbar toolbar = (Toolbar) findViewByid(R.id.toolbar); // note that your activity doesn't need to know that it is actually a custom Toolbar
setSupportActionBar(binding.toolbar);

それでおしまい!標準の左揃えのタイトルを非表示にする必要はありません。同じXMLコードを何度も複製する必要はありません。CenteredToolbarデフォルトの場合と同じように使用してくださいToolbar。に直接アクセスできるようになったため、プログラムでカスタムフォントを設定することもできますTextView。お役に立てれば。


1
ありがとう!「v7.widget」をツールバーにインポートするのを忘れないようにするのが最良の解決策
David

これはかなり古いのですが...テキストの色を変更するにはどうすればよいですか?app:titleTextColorを使用してXMLで、centeredTitleTextView.setColorを使用してコードで試してみました。@fraggjkee?
Genaro Alberto Cancino Herrera

centeredTitleTextView.setTextColor(...)動作するはずです
fraggjkee

そうじゃないのLayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
リミナル

16

誰もこれについて言及していませんが、にはいくつかの属性がありますToolbar

app:titleTextColor タイトルのテキストの色を設定します

app:titleTextAppearance タイトルテキストの外観を設定するため

app:titleMargin マージン設定用

また、などの特定の側のマージンもありますmarginStart


1
完璧なソリューション.. FontOverrideに気付いている場合は、styles.xmlでスタイルを作成<style name="customFontTextAppearanceStyle"> <item name="android:textSize">18sp</item> <item name="android:typeface">monospace</item> してツールバーに適用する だけ app:titleTextAppearance="@styles/customFontTextAppearanceStyle"
Chinmay Thoriya

2
この方法を使用しましたが、ツールバーには何も起こりませんでした。私は「<スタイル>」新しいを作成し、それを設定するapp:titleTextAppearanc="style name" 上でandroid.support.v7.widget.Toolbarタグ
AN

12

私はこのソリューションを使用します:

static void centerToolbarTitle(@NonNull final Toolbar toolbar) {
    final CharSequence title = toolbar.getTitle();
    final ArrayList<View> outViews = new ArrayList<>(1);
    toolbar.findViewsWithText(outViews, title, View.FIND_VIEWS_WITH_TEXT);
    if (!outViews.isEmpty()) {
        final TextView titleView = (TextView) outViews.get(0);
        titleView.setGravity(Gravity.CENTER);
        final Toolbar.LayoutParams layoutParams = (Toolbar.LayoutParams) titleView.getLayoutParams();
        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        toolbar.requestLayout();
        //also you can use titleView for changing font: titleView.setTypeface(Typeface);
    }
}

1
非常にうまく機能しますが、何らかの理由で、アイテムボタンのないツールバーでは正しく中央に配置されません。
Munib 2017

1
追加:ツールバーにナビドロワーまたは戻るアイコンがある場合、タイトルが正確に中央に留まらない。この状況では、空の設定メニューアイコンを追加します。私の空のメニュー項目は次のとおりです:<item android:id = "@ + id / empty" android:orderInCategory = "100" android:icon = "@ android:color / transparent" app:showAsAction = "always" tools:ignore = " MenuTitle "/>
Mete

10

ツールバーTextViewなしで、以下のコードを使用してフォントをカスタマイズできます

getSupportActionBar().setDisplayShowTitleEnabled(false);
or
getActionBar().setDisplayShowTitleEnabled(false);

public void updateActionbar(String title){
    SpannableString spannableString = new SpannableString(title);
    spannableString.setSpan(new TypefaceSpanString(this,  "futurastdmedium.ttf"),
            0, spannableString.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    mToolbar.setTitle(spannableString);
}

1
フォントを変更するだけの場合は、これが最もクリーンなソリューションのようです。注:TypefaceSpanStringはこれだけです:stackoverflow.com/a/17961854
Mohib Irshad

8
    public class TestActivity extends AppCompatActivity {
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_test);

        toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
        setSupportActionBar(toolbar);

        customizeToolbar(toolbar);
    }

    public void customizeToolbar(Toolbar toolbar){
        // Save current title and subtitle
        final CharSequence originalTitle = toolbar.getTitle();
        final CharSequence originalSubtitle = toolbar.getSubtitle();

        // Temporarily modify title and subtitle to help detecting each
        toolbar.setTitle("title");
        toolbar.setSubtitle("subtitle");

        for(int i = 0; i < toolbar.getChildCount(); i++){
            View view = toolbar.getChildAt(i);

            if(view instanceof TextView){
                TextView textView = (TextView) view;


                if(textView.getText().equals("title")){
                    // Customize title's TextView
                    Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
                    params.gravity = Gravity.CENTER_HORIZONTAL;
                    textView.setLayoutParams(params);

                    // Apply custom font using the Calligraphy library
                    Typeface typeface = TypefaceUtils.load(getAssets(), "fonts/myfont-1.otf");
                    textView.setTypeface(typeface);

                } else if(textView.getText().equals("subtitle")){
                    // Customize subtitle's TextView
                    Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
                    params.gravity = Gravity.CENTER_HORIZONTAL;
                    textView.setLayoutParams(params);

                    // Apply custom font using the Calligraphy library
                    Typeface typeface = TypefaceUtils.load(getAssets(), "fonts/myfont-2.otf");
                    textView.setTypeface(typeface);
                }
            }
        }

        // Restore title and subtitle
        toolbar.setTitle(originalTitle);
        toolbar.setSubtitle(originalSubtitle);
    }
}

1
ソリューションは、コードの最後の2行を出力するときにうまく機能します。それはforループの中にあるべきではありません。toolbar.setSubtitle(originalSubtitle);
Ivan Stojkovic 2017年

5

レイアウト:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

     <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:layout_gravity="center"
        android:gravity="center"
        android:id="@+id/toolbar_title" />
</android.support.v7.widget.Toolbar>

コード:

    Toolbar mToolbar = parent.findViewById(R.id.toolbar_top);
    TextView mToolbarCustomTitle = parent.findViewById(R.id.toolbar_title);

    //setup width of custom title to match in parent toolbar
    mToolbar.postDelayed(new Runnable()
    {
        @Override
        public void run ()
        {
            int maxWidth = mToolbar.getWidth();
            int titleWidth = mToolbarCustomTitle.getWidth();
            int iconWidth = maxWidth - titleWidth;

            if (iconWidth > 0)
            {
                //icons (drawer, menu) are on left and right side
                int width = maxWidth - iconWidth * 2;
                mToolbarCustomTitle.setMinimumWidth(width);
                mToolbarCustomTitle.getLayoutParams().width = width;
            }
        }
    }, 0);

1
「int width = maxWidth-titleWidth * 2;」は「int width = maxWidth-iconWidth * 2;」である必要があると思います!
oldfeel

4

私はこの解決策を解決しました、そしてこれは次のコードです:

<android.support.v7.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" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Order History"
            android:layout_gravity="center"
            android:id="@+id/toolbar_title"
            android:textSize="17sp"
            android:textStyle="bold"
            android:textColor="@color/colorWhite"
            />

    </android.support.v7.widget.Toolbar>

そして、あなたはタイトル/ラベルを変更できます、アクティビティで、以下のコードを書きます:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);

TextView mTitle =(TextView)toolbarTop.findViewById(R.id.toolbar_title); mTitle.setText( "@ string / ....");


4

次のように使えます

 <android.support.v7.widget.Toolbar
    android:id="@+id/top_actionbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppThemeToolbar">

    <TextView
        android:id="@+id/pageTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />
</android.support.v7.widget.Toolbar>

setDisplayHomeAsUpEnabled(true)とsetDisplayShowHomeEnabled(true)を設定すると、戻る矢印を有効にします。その後、タイトルは中央に来ていません。私はactionBar.setTitle( "");を設定しようとしました。およびsetDisplayShowTitleEnabled(false)。しかし、それでも問題を解決できません
Prashanth Debbadwar

4

カスタムフォントを設定するための非常に迅速簡単な方法はtitleTextAppearancefontFamily

styles.xmlに追加します

<style name="ToolbarTitle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">#FF202230</item>
    <item name="android:fontFamily">@font/varela_round_regular</item>
</style>

あなたの中のres作成したフォルダのフォントフォルダを(例:varela_round_regular.ttf

詳細については、公式ガイドをご覧くださいhttps://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html


3

appcompatライブラリに何か変更があったかどうかはわかりませんが、かなり簡単で、リフレクションの必要はありません。

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// loop through all toolbar children right after setting support 
// action bar because the text view has no id assigned

// also make sure that the activity has some title here
// because calling setText() with an empty string actually
// removes the text view from the toolbar

TextView toolbarTitle = null;
for (int i = 0; i < toolbar.getChildCount(); ++i) {
    View child = toolbar.getChildAt(i);

    // assuming that the title is the first instance of TextView
    // you can also check if the title string matches
    if (child instanceof TextView) {
        toolbarTitle = (TextView)child;
        break;
    }
}

3

この問題に使用した解決策:

 public static void applyFontForToolbarTitle(Activity a){
        Toolbar toolbar = (Toolbar) a.findViewById(R.id.app_bar);
        for(int i = 0; i < toolbar.getChildCount(); i++){
            View view = toolbar.getChildAt(i);
            if(view instanceof TextView){
                TextView tv = (TextView) view;
                if(tv.getText().equals(a.getTitle())){
                    tv.setTypeface(getRuneTypefaceBold(a));
                    break;
                }
            }
        }
    }

重心の場合、レイアウトパラメータをmatch_parentに水平に変更してから、次のようにする必要があると思います。

tv.setGravity(Gravity.CENTER);

3

@ MrEngineer13の回答から更新:ハンバーガーアイコン、オプションメニューなど、タイトルの中央を揃えるには、次のFrameLayoutようにツールバーにを追加します。

   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

         <FrameLayout android:layout_width="match_parent"
                    android:layout_height="match_parent">

              <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="Toolbar Title"
               android:layout_gravity="center"
               style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
               android:id="@+id/toolbar_title" />

        </FrameLayout>

   </android.support.v7.widget.Toolbar>

3

XMLでこれを試してください:

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="@color/action_bar_bkgnd"
app:theme="@style/ToolBarTheme" >


 <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Toolbar Title"
    android:layout_gravity="center"
    android:id="@+id/toolbar_title" />


</android.support.v7.widget.Toolbar>

コード:

Toolbar myToolbar= (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) mytoolbar.findViewById(R.id.toolbar_title);

2

ツールバーにテキストビューを追加すると、タイトルのスタイリングの制限の問題を解決できますが、問題があります。レイアウトに追加しないので、幅をあまり制御できません。wrap_contentまたはmatch_parentを使用できます。

次に、ツールバーの右端にボタンとしてsearchViewがあるシナリオを考えます。タイトルの内容が多い場合は、ボタンの上に表示され、不明瞭になります。ラベルに幅を設定するだけではこれを制御する方法はなく、レスポンシブデザインを実現したい場合には、実行したくないものです。

だから、ここに私のために働いた解決策があります、それはツールバーにテキストビューを追加することとは少し異なります。代わりに、ツールバーとテキストビューを相対レイアウトに追加し、テキストビューがツールバーの上に来るようにします。次に、適切なマージンを使用して、テキストビューが表示したい場所に表示されることを確認します。

タイトルが表示されないようにツールバーを設定してください。

このソリューションのXMLは次のとおりです。

<RelativeLayout
                    android:orientation="horizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="?attr/colorPrimary">

                    <android.support.v7.widget.Toolbar
                        android:theme="@style/ThemeOverlay.AppCompat.Dark"
                        android:id="@+id/activity_toolbar"
                        android:layout_width="match_parent"
                        android:layout_height="?attr/actionBarSize"
                        android:background="?attr/colorPrimary"
                        android:titleTextAppearance="@style/AppTheme.TitleTextView"
                        android:layout_marginRight="40dp"
                        android:layoutMode="clipBounds">

                        <android.support.v7.widget.SearchView
                            android:id="@+id/search_view"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="right"
                            android:layout_centerVertical="true"
                            android:layout_alignParentRight="true"
                            android:foregroundTint="@color/white" />
                        </android.support.v7.widget.Toolbar>

                    <TextView
                        android:id="@+id/toolbar_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginRight="90dp"
                        android:text="@string/app_name"
                        android:textSize="@dimen/title_text_size"
                        android:textColor="@color/white"
                        android:lines="1"
                        android:layout_marginLeft="72dp"
                        android:layout_centerVertical="true" />

                </RelativeLayout>

上記の@ ankur-chaudharyの問題を解決します。


2

android.support.v7.appcompat 24.2 Toolbarメソッドがあるので、setTitleTextAppearance外部のフォントなしでフォントを設定できますtextview

styles.xmlに新しいスタイルを作成する

<style name="RobotoBoldTextAppearance">
        <item name="android:fontFamily">@font/roboto_condensed_bold</item>
</style>

そしてそれを使う

mToolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);

2

普遍的な解決策を探すために数日を費やしました。Androidメニューとナビゲーションアイコンを操作するツールバー。

最初に、カスタムツールバークラスを作成する必要があります。このクラスは、タイトルを中心とした位置(パディング)を計算する必要があります。

    class CenteredToolbar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
    : Toolbar(context, attrs, defStyleAttr) {

    init {
        addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
            override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {
                val titleTextView = findViewById<TextView>(R.id.centerTitle)

                val x = titleTextView.x.toInt()
                val x2 = x + titleTextView.width

                val fullWidth = width
                val fullCenter = fullWidth / 2

                val offsetLeft = Math.abs(fullCenter - x)
                val offsetRight = Math.abs(x2 - fullCenter)
                val differOffset = Math.abs(offsetLeft - offsetRight)

                if (offsetLeft > offsetRight) {
                    titleTextView.setPadding(differOffset, 0, 0, 0)
                } else if (offsetRight > offsetLeft) {
                    titleTextView.setPadding(0, 0, differOffset, 0)
                }

                removeOnLayoutChangeListener(this)
            }
        })
    }

    override fun setTitle(resId: Int) = getTitleView().setText(resId)

    override fun setTitle(title: CharSequence?) = getTitleView().setText(title)

    fun getTitleView(): TextView = findViewById(R.id.centerTitle)

}

次に、レイアウトツールバーを作成する必要があります。

<CenteredToolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar">

    <TextView
        android:id="@+id/centerTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</CenteredToolbar>

それで全部です


2

別のビューでツールバーとタイトルを取得してみてください。右端のビューを見て、それらにツールバーの重みと等しい重みを与えます。このようにして、タイトルが中央に表示されます。

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:background="@color/white_color">
  <LinearLayout
   android:id="@+id/toolbar_layout"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@color/white_color">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/white_color"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        android:layout_weight="0.2"

        app:contentInsetStartWithNavigation="0dp"
        app:navigationIcon="@color/greyTextColor">
       </android.support.v7.widget.Toolbar>


        <com.an.customfontview.CustomTextView
            android:id="@+id/headingText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.6"
            android:gravity="center"
            android:text="Heading"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:textColor="@color/colorPrimary"
            android:textSize="@dimen/keyboard_number"
            android:layout_gravity="center_horizontal|center_vertical"
            app:textFontPath="fonts/regular.ttf" />
            <ImageView
                android:id="@+id/search_icon"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:visibility="visible"
                android:layout_weight="0.2"
                android:layout_gravity="center_horizontal|center_vertical"
                android:src="@drawable/portfolio_icon"/>
        </LinearLayout>

       </android.support.design.widget.AppBarLayout>

2

このコードをxmlファイルに挿入できます

 <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryDark"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:textColor="#000000"
        android:textSize="20dp"
        android:id="@+id/toolbar_title" />

</androidx.appcompat.widget.Toolbar>

こんにちはUzair。どのxmlファイルですか?空のアクティビティテンプレートから作成されたAndroid Studio 3.6.3プロジェクトを使用しています。ありがとう。
愛と平和-ジョーコードスウェル

1
private void makeTitleCenter(String title, Toolbar toolbar) {
    if (title != null && !TextUtils.isEmpty(title.trim())) {
        final String tag = " ";
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle(tag);
        }
        TextView titleTv = null;
        View leftBtn = null;
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            View view = toolbar.getChildAt(i);
            CharSequence text = null;
            if (view instanceof TextView && (text = ((TextView) view).getText()) != null && text.equals(tag)) {
                titleTv = (TextView) view;
            } else if (view instanceof ImageButton) {
                leftBtn = view;
            }
        }
        if (titleTv != null) {
            final TextView fTitleTv = titleTv;
            final View fLeftBtn = leftBtn;
            fTitleTv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    fTitleTv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    int leftWidgetWidth = fLeftBtn != null ? fLeftBtn.getWidth() : 0;
                    fTitleTv.setPadding(DimenUtil.getResources().getDisplayMetrics().widthPixels / 2 - leftWidgetWidth - fTitleTv.getWidth() / 2, 0, 0, 0);
                    fTitleTv.requestLayout();
                }
            });
        }
    }
}

1

設定android:gravity="center"は私のために働いた

スタイリングなし。ツールバーは基本的に、ViewGroup要素の重力を設定するだけで実行できます。

        <android.support.v7.widget.Toolbar
            android:id="@+id/htab_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:layout_gravity="top"
            android:background="@color/partial_transparent"
            android:gravity="center"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

8
次とは動作しませんandroidx.appcompat.widget.Toolbar
tmm1 2018年

1

ツールバーのカスタムフォントの場合、textViewフォントをスタイルで上書きできます。その後、アプリのすべてのtextViewツールバーのタイトルフォントも自動的に変更され、Android Studio 3.1.3でテストしました

スタイルでそれを行います:

<style name="defaultTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">@font/your_custom_font</item>
</style>

そして、あなたのテーマでこれを使用してください:

<item name="android:textViewStyle">@style/defaultTextViewStyle</item>

1

特別なJava / Kotlinコードなしでカスタムツールバーを追加する別の方法を見つけました。

  • 最初に、AppBarLayoutを親として持つカスタムツールバーレイアウトでXMLを作成します。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.AppBarLayout                     
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
    <android.support.v7.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">
    
        <ImageView
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginEnd="@dimen/magin_default"
            android:src="@drawable/logo" />
    
    </android.support.v7.widget.Toolbar>

  • 2番目:レイアウトにツールバーを含めます。

    <?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"
        android:background="@color/blue"
        tools:context=".app.MainAcitivity"
        tools:layout_editor_absoluteY="81dp">
    
        <include
            layout="@layout/toolbar_inicio"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <!-- Put your layout here -->
    
    </android.support.constraint.ConstraintLayout>

1

私が見ると、2つのオプションがあります。

1)ツールバーXMLを編集します。ツールバーをXMLに追加すると、通常は次のようになります。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:elevation="4dp"
    app:popupTheme="@style/AppTheme.PopupOverlay"/>

カスタマイズしたい場合は、最後の「/」を削除して、次のようにします。

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:elevation="4dp"
            app:popupTheme="@style/AppTheme.PopupOverlay">

            <android.support.constraint.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <ImageView
                    android:id="@+id/toolbar_iv"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:src="@mipmap/ic_launcher"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

                <TextView
                    android:id="@+id/toolbar_tv"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="20dp"
                    android:gravity="center"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toRightOf="@+id/toolbar_iv"
                    app:layout_constraintTop_toTopOf="parent" />

            </android.support.constraint.ConstraintLayout>
        </android.support.v7.widget.Toolbar>

このようにして、ツールバーを作成し、テキストビューとロゴをカスタマイズできます。

2)ネイティブのテキストビューとアイコンをプログラムで変更します。

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setIcon(R.drawable.ic_question_mark);
getSupportActionBar().setTitle("Title");

ツールバーに何かを設定する前に、ツールバーがnullでないことを確認してください。


1

次のTextViewように、ツールバーにカスタムを設定できます。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title" />


</android.support.v7.widget.Toolbar>

したがって、これはテキストを中央揃えにします。通常のフォントにカスタムフォントを追加する場合はToolbar、次のようにし<style>ます。

<style android:name="ToolbarFont">
    <item android:fontFamily = "@font/fontName" />
</style>

そしてそれをツールバーに追加します:

toolbar.setTitleTextAppearance(this, R.style.ToolbarFont);

ツールバーのテキストビューについては、fontFamily属性で定義できます。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_top"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title"
        android:fontFamily="@font/fontFamily" />


</android.support.v7.widget.Toolbar>

1

私は同じ問題に直面していましたが、MainActivityでこれを行うことで修正されました

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

そして断片的に

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (view == null) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_example, container, false);
        init();
    }
    getActivity().setTitle("Choose Fragment");
    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.example_menu, menu);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.