26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Toolbarのタイトルのセット方法について

Last updated at Posted at 2017-11-08

setSupportActionBarについてちょっとハマったのでメモします
動的にタイトルを変えたいときに以下だと反映できません。

NG

onCreate内
setSupportActionBar(toolbar)
toolbar.setTitle("test")

ただ以下だと大丈夫です。

OK

onCreate内
toolbar.setTitle("test")
setSupportActionBar(toolbar)

OK

onCreate内
setSupportActionBar(toolbar)
supportActionBar?.setTitle("test")

なぜ?

setSupportActionBar()でToolbarWidgetWrapperがnewされます。
そのタイミングで以下のようにタイトルがあればmTitleSetがtrueになります。
あとからセットするため、最初はmTitleSetはfalseになります。このフラグが後から効いてきます。

ToolbarWidgetWrapper.java
    public ToolbarWidgetWrapper(Toolbar toolbar, boolean style,
            int defaultNavigationContentDescription, int defaultNavigationIcon) {
        mToolbar = toolbar;
        mTitle = toolbar.getTitle();
...
        mTitleSet = mTitle != null;

setSupportActionBar()を呼んだ後、onCreate内でtoolbarにタイトルをセットしていたとしてもActivity#onPostCreate()から呼ばれる一連の流れで、toolbarのsetTitle()が呼ばれます。

〜一連の流れ〜

Activity.java
    @CallSuper
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        if (!isChild()) {
            mTitleReady = true;
            onTitleChanged(getTitle(), getTitleColor());
        }
        mCalled = true;
    }
AppCompatActivity.java
    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
        getDelegate().setTitle(title);
    }
AppCompatDelegateImplV9.java
    @Override
    void onTitleChanged(CharSequence title) {
        ...
            peekSupportActionBar().setWindowTitle(title);
        ...
    }

ToobarWidgetWrapperで mTitleSetがfalseであればtoolbarへActivityのタイトルのセットがされます。

ToolbarのsetTitleではなくToobarWidgetWrapperのsetTitleを呼ぶことで、mTitleSetがtrueになるので、これを阻止できます。つまりgetSupportActionBar().setTitle("test")であれば阻止できます。

ToobarWidgetWrapper.java
    @Override
    public void setWindowTitle(CharSequence title) {
        // "Real" title always trumps window title.
        if (!mTitleSet) {
            setTitleInt(title);
        }
    }

...
    @Override
    public void setTitle(CharSequence title) {
        mTitleSet = true;
        setTitleInt(title);
    }

    private void setTitleInt(CharSequence title) {
        mTitle = title;
        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
            mToolbar.setTitle(title);
        }
    }
26
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?