web-dev-qa-db-ja.com

CollapsingToolbarLayout setTitle()は、折りたたまれない限り更新されません

新しいデザインライブラリでは、ツールバーのタイトルをCollapsingToolbarLayout自体ではなく、Toolbarに設定することになっています(少なくとも折りたたみツールバーを使用する場合)。ただし、setTitle()は、次の特定の状況でのみタイトルを更新します。

1)CollapsingToolbarLayoutにまだタイトルがない場合

2)CollapsingToolbarLayoutが完全に折りたたまれた瞬間

3)CollapsingToolbarLayoutが展開し始めた瞬間

私が実際にやろうとしているのは、タイトルを完全に展開したときにEditTextにし、ユーザーがキャラクターに名前を付けてタイトルとして表示できるようにすることです。 invalidate()またはrequestLayout()、およびCollapsingToolbarLayoutの子に対するこれらのメソッドの両方を呼び出して、問題を強制しようとしました。無効。

何か案は?

26
Amagi82

編集:このソリューションは不要になりました。 v22.2.1 で修正されたバグ

リンクだけを残したくなかったので、ここに完全なソリューションがあります。

折りたたみ可能なタイトルを処理するコードは、現在のタイトルがnullまたはテキストサイズが変更された場合にのみ実際のタイトルを更新するため、バグが発生します。回避策は、タイトルのテキストサイズを変更してから、元に戻すことです。私は0.5 spを使用したので、あまりジャンプしませんでした。テキストサイズを変更すると、テキストが強制的に更新され、ちらつきがなくなります。わずかなテキストサイズの変更。

これは私が持っているものです

private void setCollapsingToolbarLayoutTitle(String title) {
    mCollapsingToolbarLayout.setTitle(title);
    mCollapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ExpandedAppBar);
    mCollapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.CollapsedAppBar);
    mCollapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ExpandedAppBarPlus1);
    mCollapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.CollapsedAppBarPlus1);
}

私が持っているstyles.xmlで

<style name="ExpandedAppBar" parent="@Android:style/TextAppearance.Medium">
    <item name="Android:textSize">28sp</item>
    <item name="Android:textColor">#000</item>
    <item name="Android:textStyle">bold</item>
</style>

<style name="CollapsedAppBar" parent="@Android:style/TextAppearance.Medium">
    <item name="Android:textSize">24sp</item>
    <item name="Android:textColor">@color/white</item>
    <item name="Android:textStyle">normal</item>
</style>

<style name="ExpandedAppBarPlus1" parent="@Android:style/TextAppearance.Medium">
    <item name="Android:textSize">28.5sp</item>
    <item name="Android:textColor">#000</item>
    <item name="Android:textStyle">bold</item>
</style>

<style name="CollapsedAppBarPlus1" parent="@Android:style/TextAppearance.Medium">
    <item name="Android:textSize">24.5sp</item>
    <item name="Android:textColor">@color/white</item>
    <item name="Android:textStyle">normal</item>
</style>

ハッピーコーディング。

27
doubleA

さて、Googleを待っている間に回避策があります:

  1. https://Gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.Java (オリジナルの作者ではありませんが)これにより、AppBarLayoutにいくつかのメソッド、つまり展開と折りたたみが追加されます

  2. setTitle()を呼び出すメソッド内:

_collapsingToolbar.setTitle("All Recent");
getSupportActionBar().setTitle("All Recent");
collapseThenExpand();
_
  1. collapseThenExpand()メソッドを作成します:
_private void collapseThenExpand() {
  appbar.collapseToolbar();

  Handler h = new Handler();
  h.postDelayed(new Runnable() {
    @Override
    public void run() {
      appbar.expandToolbar(true);
    }
  }, 800);
}
_

Falseに設定すると、エキスパンドアニメーションをオフにできることに注意してください。

5
Tommy Chan

私のソリューションでは、ツールバーと折りたたみツールバーの両方のタイトルを機能させるために設定する必要がありました。

OnCreateの場合:

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

    collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);

そしてさらにフラグメントを切り替えると、タブが選択されたときに両方のタイトルを設定します:

            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

                //TAB1 - THE DEFAULT TAB
                switch (item.getItemId()) {

                        case R.id.tab_rooms:
                            toolbar.setTitle("My Title");
                            collapsingToolbar.setTitle("My Title");
                            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                            fragment = new RoomsFragment();
                            transaction.replace(R.id.fragment_container, fragment);
                            transaction.addToBackStack(null);
                            transaction.commit();

                            return true;

                        case R.id.tab_shisha:
                            toolbar.setTitle("My Title2");
                            collapsingToolbar.setTitle("My Title2");
                            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                            fragment = new ShishaFragment();
                            transaction.replace(R.id.fragment_container, fragment);
                            transaction.addToBackStack(null);
                            transaction.commit();
                            return true;
                          }

                    return false;
                }

それが誰かを助けることを願っています!

0
Daveak