新しいデザインライブラリでは、ツールバーのタイトルをCollapsingToolbarLayout
自体ではなく、Toolbar
に設定することになっています(少なくとも折りたたみツールバーを使用する場合)。ただし、setTitle()
は、次の特定の状況でのみタイトルを更新します。
1)CollapsingToolbarLayout
にまだタイトルがない場合
2)CollapsingToolbarLayout
が完全に折りたたまれた瞬間
3)CollapsingToolbarLayout
が展開し始めた瞬間
私が実際にやろうとしているのは、タイトルを完全に展開したときにEditText
にし、ユーザーがキャラクターに名前を付けてタイトルとして表示できるようにすることです。 invalidate()
またはrequestLayout()
、およびCollapsingToolbarLayout
の子に対するこれらのメソッドの両方を呼び出して、問題を強制しようとしました。無効。
何か案は?
編集:このソリューションは不要になりました。 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>
ハッピーコーディング。
さて、Googleを待っている間に回避策があります:
https://Gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.Java (オリジナルの作者ではありませんが)これにより、AppBarLayout
にいくつかのメソッド、つまり展開と折りたたみが追加されます
setTitle()
を呼び出すメソッド内:
_collapsingToolbar.setTitle("All Recent");
getSupportActionBar().setTitle("All Recent");
collapseThenExpand();
_
collapseThenExpand()
メソッドを作成します:_private void collapseThenExpand() {
appbar.collapseToolbar();
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
appbar.expandToolbar(true);
}
}, 800);
}
_
Falseに設定すると、エキスパンドアニメーションをオフにできることに注意してください。
私のソリューションでは、ツールバーと折りたたみツールバーの両方のタイトルを機能させるために設定する必要がありました。
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;
}
それが誰かを助けることを願っています!