web-dev-qa-db-ja.com

AppCompat v7 r21でActionBar Title TextViewを取得する

ActionBarタイトルにTextViewの色を使用する必要があるライブラリがあります。 AppCompat v7 r21以前は、findViewByIdを使用して、ビューから直接色を取得できました。ただし、何らかの理由により、現在は機能しません。ビューは常にnullです。ビュー階層全体を解析し、すべてのTextViewのID、タイプ、および値を出力するコードを記述しました。タイトルビューにIDがありませんでしたが、これは非常に奇妙です。

私が気づいたことの1つは、ActionBarを取得しようとしたときに返されたのがツールバーでした(アプリでツールバーを使用しなかった場合でも)。したがって、ツールバーの子ビューを繰り返し処理し、TextViewが見つかったときはいつでも、そのテキスト値をtoolbar.getTitle()と比較して、探しているTextViewであることを確認しました。理想的ではなく、それがすべてのケースで機能するかどうかはわかりません。

誰が最も安全な解決策になるか知っていますか?

17
Ahmed Nawara

通常、私のケースでツールバーを使用しているときに、タイトルで何かカスタムを行っている場合は、手動でタイトルビューを膨らませ、その属性をXMLで設定します。ツールバーの目的は、このようなことが起こらないようにすることです。そのため、ツールバーの外観をより細かく制御できます。

    <Android.support.v7.widget.Toolbar
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/my_awesome_toolbar"
        Android:layout_height="@dimen/standard_vertical_increment"
        Android:layout_width="match_parent"
        Android:minHeight="@dimen/standard_vertical_increment"
        Android:background="@drawable/actionbar_background">


        <TextView
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            Android:id="@+id/toolbar_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="@color/Red" />

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

次に、コードでは、次のようにします。

Toolbar toolbar = findViewById(R.id.my_awesome_toolbar);
//Get rid of the title drawn by the toolbar automatically
toolbar.setTitle("");
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
toolbarTitle.setTextColor(Color.BLUE);

私はこれが古い投稿であることを知っていますが、これは、ツールバーでカスタムtextcの色とフォントを許可するために見つけた最良の方法です

23
Jawnnypoo

独自のTextViewを作成する必要はありません。組み込みのタイトルを取得するには、ツールバーの子をループします。

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;
    }
}
23
headsvk

編集(2018年9月):現在は使用しないAndroid PリフレクションAndroid SDKは例外をスローする可能性があります!

リフレクションを使用して取得しました。

toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title"); //important step to set it otherwise getting null
TextView title = null;
try{
        Field f = toolbar.getClass().getDeclaredField("mTitleTextView");
        f.setAccessible(true);
        title = (TextView) f.get(toolbar);
        title.setText("I have title TextView");
} catch(Exception e){
        e.printStackTrace();
}

ツールバーがnot ActionBarをサポートするように設定されている場合は動作することに注意してください...

setSupportActionBar(toolbar); // with this set text view behave differently 
                              //and text may not be visible...
2
smory

このようにできます。

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
TextView title=(TextView )toolbar.getChildAt(0);

これは私の仕事です。

1
Rahul Giradkar

Android=がアイコンとテキストの順序を変更する場合に備えて、タイトルを取得する将来の証明方法を以下に示します。

//If you just want to set the text
ActionBar actBar = getSupportActionBar();
if(actBar != null) {
    actBar.setTitle(R.string.your_ab_title);
}

//If you want to customize more than the text    
Toolbar ab = findViewById(R.id.action_bar);
if(ab != null){
    for (int i= 0; i < ab.getChildCount(); i++){
        View child = ab.getChildAt(i);
        if(child instanceof TextView) {
            //You now have the title textView. Do something with it
        }
     }
}
0
Chris Sprague