Skip to content

Commit 491f1bc

Browse files
ferinagyymarian
authored andcommitted
[CollapsingToolbarLayout] Fix CollapsingToolbar multiline position
GIT_ORIGIN_REV_ID=7dbd8905bf58eb5811c4661ee77512d4d9c59c19 Co-authored-by: ymarian <[email protected]> PiperOrigin-RevId: 321294325 (cherry picked from commit 8210b3a)
1 parent a1e0883 commit 491f1bc

File tree

7 files changed

+171
-65
lines changed

7 files changed

+171
-65
lines changed

catalog/java/io/material/catalog/application/theme/res/values/styles.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
See the License for the specific language governing permissions and
1515
limitations under the License.
1616
-->
17-
<resources>
17+
<resources xmlns:tools="http://schemas.android.com/tools">
1818

1919
<style name="Widget.Catalog.Toolbar" parent="Widget.MaterialComponents.Toolbar.PrimarySurface">
2020
<!-- Toolbar should always be within an AppBarLayout which provides the background. -->
@@ -47,6 +47,13 @@
4747
<style name="ThemeOverlay.Catalog.AppBarLayout" parent="">
4848
<item name="android:textColorPrimary">?attr/colorOnPrimarySurface</item>
4949
<item name="colorControlNormal">?attr/colorOnPrimarySurface</item>
50+
<item name="android:popupTheme" tools:targetApi="lollipop">@style/Theme.Catalog.PopupMenu</item>
51+
<item name="popupTheme">@style/Theme.Catalog.PopupMenu</item>
5052
</style>
51-
53+
54+
<style name="Theme.Catalog.PopupMenu" parent="">
55+
<item name="android:textColorPrimary">?attr/colorOnSurface</item>
56+
<item name="colorControlNormal">?attr/colorOnSurface</item>
57+
</style>
58+
5259
</resources>

catalog/java/io/material/catalog/topappbar/TopAppBarCollapsingMultilineDemoFragment.java

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,43 @@
1616

1717
package io.material.catalog.topappbar;
1818

19-
import io.material.catalog.R;
20-
2119
import android.os.Bundle;
22-
import androidx.annotation.Nullable;
23-
import androidx.appcompat.app.AppCompatActivity;
24-
import androidx.appcompat.widget.Toolbar;
20+
import android.text.SpannableString;
21+
import android.text.style.ForegroundColorSpan;
22+
import android.util.SparseIntArray;
2523
import android.view.LayoutInflater;
24+
import android.view.Menu;
25+
import android.view.MenuInflater;
26+
import android.view.MenuItem;
2627
import android.view.View;
2728
import android.view.ViewGroup;
29+
import androidx.annotation.ColorInt;
30+
import androidx.annotation.NonNull;
31+
import androidx.annotation.Nullable;
32+
import androidx.appcompat.app.AppCompatActivity;
33+
import androidx.appcompat.widget.Toolbar;
34+
import com.google.android.material.appbar.CollapsingToolbarLayout;
35+
import com.google.android.material.color.MaterialColors;
36+
import io.material.catalog.R;
2837
import io.material.catalog.feature.DemoFragment;
2938

3039
/** A fragment that displays a collapsing Top App Bar demo for the Catalog app. */
3140
public class TopAppBarCollapsingMultilineDemoFragment extends DemoFragment {
3241

42+
private SparseIntArray linesMap;
43+
@ColorInt private int colorPrimary;
44+
45+
@Override
46+
public void onCreate(@Nullable Bundle bundle) {
47+
super.onCreate(bundle);
48+
setHasOptionsMenu(true);
49+
50+
linesMap = new SparseIntArray();
51+
linesMap.put(R.id.maxLines1, 1);
52+
linesMap.put(R.id.maxLines2, 2);
53+
linesMap.put(R.id.maxLines3, 3);
54+
}
55+
3356
@Override
3457
public View onCreateDemoView(
3558
LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
@@ -40,10 +63,48 @@ public View onCreateDemoView(
4063
Toolbar toolbar = view.findViewById(R.id.toolbar);
4164
AppCompatActivity activity = (AppCompatActivity) getActivity();
4265
activity.setSupportActionBar(toolbar);
66+
colorPrimary = MaterialColors.getColor(view, R.attr.colorPrimary);
4367

4468
return view;
4569
}
4670

71+
@Override
72+
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
73+
menuInflater.inflate(R.menu.cat_topappbar_menu_maxlines, menu);
74+
75+
super.onCreateOptionsMenu(menu, menuInflater);
76+
}
77+
78+
@Override
79+
public void onPrepareOptionsMenu(@NonNull Menu menu) {
80+
super.onPrepareOptionsMenu(menu);
81+
82+
CollapsingToolbarLayout collapsingToolbarLayout =
83+
requireView().findViewById(R.id.collapsingtoolbarlayout);
84+
int maxLines = collapsingToolbarLayout.getMaxLines();
85+
for (int i = 0; i < linesMap.size(); i++) {
86+
int value = linesMap.valueAt(i);
87+
int itemId = linesMap.keyAt(i);
88+
MenuItem item = menu.findItem(itemId);
89+
CharSequence title = getString(R.string.menu_max_lines, value);
90+
if (maxLines == value) {
91+
SpannableString spannable = new SpannableString(title);
92+
spannable.setSpan(new ForegroundColorSpan(colorPrimary), 0, title.length(), 0);
93+
title = spannable;
94+
}
95+
96+
item.setTitle(title);
97+
}
98+
}
99+
100+
@Override
101+
public boolean onOptionsItemSelected(MenuItem item) {
102+
CollapsingToolbarLayout collapsingToolbarLayout =
103+
requireView().findViewById(R.id.collapsingtoolbarlayout);
104+
collapsingToolbarLayout.setMaxLines(linesMap.get(item.getItemId(), 1));
105+
return super.onOptionsItemSelected(item);
106+
}
107+
47108
@Override
48109
public boolean shouldShowDefaultDemoActionBar() {
49110
return false;

catalog/java/io/material/catalog/topappbar/res/layout/cat_topappbar_collapsing_multiline_fragment.xml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<!--
33
Copyright 2020 The Android Open Source Project
4+
45
Licensed under the Apache License, Version 2.0 (the "License");
56
you may not use this file except in compliance with the License.
67
You may obtain a copy of the License at
7-
https://www.apache.org/licenses/LICENSE-2.0
8+
9+
https://www.apache.org/licenses/LICENSE-2.0
10+
811
Unless required by applicable law or agreed to in writing, software
912
distributed under the License is distributed on an "AS IS" BASIS,
1013
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1114
See the License for the specific language governing permissions and
1215
limitations under the License.
1316
-->
14-
<androidx.coordinatorlayout.widget.CoordinatorLayout
17+
<androidx.coordinatorlayout.widget.CoordinatorLayout
1518
xmlns:android="http://schemas.android.com/apk/res/android"
1619
xmlns:app="http://schemas.android.com/apk/res-auto"
1720
xmlns:tools="http://schemas.android.com/tools"
@@ -23,22 +26,21 @@
2326
<com.google.android.material.appbar.AppBarLayout
2427
android:id="@+id/appbarlayout"
2528
android:layout_width="match_parent"
26-
android:layout_height="170dp"
29+
android:layout_height="192dp"
2730
android:fitsSystemWindows="true"
2831
android:theme="@style/ThemeOverlay.Catalog.AppBarLayout">
2932

3033
<com.google.android.material.appbar.CollapsingToolbarLayout
3134
android:id="@+id/collapsingtoolbarlayout"
32-
style="?attr/catalogToolbarStyle"
3335
android:layout_width="match_parent"
3436
android:layout_height="match_parent"
3537
app:collapsedTitleTextAppearance="?attr/textAppearanceHeadline6"
3638
app:expandedTitleGravity="bottom"
3739
app:expandedTitleMarginBottom="24dp"
3840
app:expandedTitleMarginStart="16dp"
3941
app:expandedTitleTextAppearance="?attr/textAppearanceHeadline5"
40-
app:maxLines="3"
41-
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
42+
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
43+
app:maxLines="3">
4244

4345
<androidx.appcompat.widget.Toolbar
4446
android:id="@+id/toolbar"
@@ -57,7 +59,7 @@
5759
android:layout_height="match_parent"
5860
app:layout_behavior="@string/appbar_scrolling_view_behavior">
5961

60-
<include layout="@layout/cat_topappbar_filler_text_view"/>
62+
<include layout="@layout/cat_topappbar_filler_text_view" />
6163
</androidx.core.widget.NestedScrollView>
6264

6365
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="utf-8"?><!--
2+
Copyright 2020 The Android Open Source Project
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
-->
16+
<menu xmlns:android="http://schemas.android.com/apk/res/android"
17+
xmlns:tools="http://schemas.android.com/tools"
18+
tools:ignore="MenuTitle">
19+
<item android:id="@+id/maxLines1" />
20+
<item android:id="@+id/maxLines2" />
21+
<item android:id="@+id/maxLines3" />
22+
</menu>

catalog/java/io/material/catalog/topappbar/res/values/strings.xml

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,45 +15,61 @@
1515
limitations under the License.
1616
-->
1717

18-
<resources>
18+
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
19+
<!-- Title for the Top App Bar demo [CHAR_LIMIT=NONE] -->
1920
<string name="cat_topappbar_title">Top App Bar</string>
21+
<!-- Description for the Top App Bar demo [CHAR_LIMIT=NONE] -->
2022
<string name="cat_topappbar_description">The Top App Bar, formerly known as the action bar in Android, is a special kind of toolbar that’s used for branding, navigation, search, and actions.</string>
21-
<string name="cat_topappbar_scrolling_title">Scrolling Demo</string>
22-
<string name="cat_topappbar_scrolling_transparent_title">Scrolling Demo (transparent status bar)</string>
23-
<string name="cat_topappbar_collapsing_title">Collapsing Demo</string>
23+
<string name="cat_topappbar_scrolling_title" translatable="false">Scrolling Demo</string>
24+
<string name="cat_topappbar_scrolling_transparent_title" translatable="false">Scrolling Demo (transparent status bar)</string>
25+
<string name="cat_topappbar_collapsing_title" translatable="false">Collapsing Demo</string>
2426
<string name="cat_topappbar_toolbar_title" translatable="false">Toolbar Demo</string>
25-
<string name="cat_topappbar_collapsing_multiline_title" description="Title for a demo containing a multiline Toolbar [CHAR_LIMIT=NONE]">Collapsing Demo (Multiline title)</string>
26-
<string name="cat_topappbar_action_bar_title">Action Bar Demo</string>
27-
<string name="cat_topappbar_dark_action_bar_title">Dark Action Bar Demo</string>
28-
27+
<string name="cat_topappbar_collapsing_multiline_title" translatable="false">Collapsing Demo (Multiline title)</string>
28+
<string name="cat_topappbar_action_bar_title" translatable="false">Action Bar Demo</string>
29+
<string name="cat_topappbar_dark_action_bar_title" translatable="false">Dark Action Bar Demo</string>
2930
<string name="cat_topappbar_lorem_ipsum" translatable="false">
3031
\t\tLorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a, ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.
3132
\n\n\t\tSuspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae, molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor bibendum, vel congue leo egestas.
3233
\n\n\t\tSed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel, molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula, in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque est.
3334
\n\n\t\tAenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh. Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc, quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus convallis.
3435
\n\n\t\tPhasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper, libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
3536
</string>
37+
<!-- Title for the regular toolbar demo [CHAR_LIMIT=NONE] -->
3638
<string name="cat_topappbar_main_demo_toolbar_title">Regular Title</string>
39+
<!-- Title for the scrolling toolbar demo [CHAR_LIMIT=NONE] -->
3740
<string name="cat_topappbar_scrolling_demo_toolbar_title">Scrolling Title</string>
41+
<!-- Title for the collpasing toolbar demo [CHAR_LIMIT=NONE] -->
3842
<string name="cat_topappbar_collapsing_demo_toolbar_title">Collapsing Title</string>
39-
43+
<!-- Label for a button in the menu [CHAR_LIMIT=NONE] -->
4044
<string name="cat_topappbar_edit_menu_item_title">Edit</string>
45+
<!-- Label for a button in the menu [CHAR_LIMIT=NONE] -->
4146
<string name="cat_topappbar_favorite_menu_item_title">Favorite</string>
47+
<!-- Label for a button in the menu [CHAR_LIMIT=NONE] -->
4248
<string name="cat_topappbar_settings_menu_item_title">Settings</string>
49+
<!-- Label for a button in the menu [CHAR_LIMIT=NONE] -->
4350
<string name="cat_topappbar_help_and_feedback_menu_item_title">Help &amp; feedback</string>
44-
51+
<!-- Sample subitle [CHAR_LIMIT=NONE] -->
4552
<string name="cat_topappbar_action_bar_subtitle">Subtitle text</string>
53+
<!-- The description of the AppBar component [CHAR_LIMIT=NONE] -->
4654
<string name="cat_topappbar_action_bar_description">
4755
Action Bars within a Material Components theme will default to a titleTextStyle of
4856
textAppearanceHeadline6 and a subtitleTextStyle of textAppearanceSubtitle1.
4957
\n\nAdditionally, the height of Material Action Bars will be the same in portrait and landscape,
5058
in order to avoid vertical space concerns with the above-mentioned text appearances.
5159
</string>
60+
<!-- Label for a button to toggle the action mode [CHAR_LIMIT=NONE] -->
5261
<string name="cat_topappbar_action_bar_toggle_action_mode_button">Toggle Action Mode</string>
62+
<!-- Sample title for an action bar [CHAR_LIMIT=NONE] -->
5363
<string name="cat_topappbar_action_bar_action_mode_title">Action Mode Title</string>
64+
<!-- Sample subtitle [CHAR_LIMIT=NONE] -->
5465
<string name="cat_topappbar_action_bar_action_mode_subtitle">Action Mode Subtitle</string>
66+
<!-- sample action in a menu [CHAR_LIMIT=NONE] -->
5567
<string name="cat_topappbar_action_bar_action_mode_menu_item1">Action 1</string>
68+
<!-- sample action in a menu [CHAR_LIMIT=NONE] -->
5669
<string name="cat_topappbar_action_bar_action_mode_menu_item2">Action 2</string>
70+
<!-- Sample long title [CHAR_LIMIT=NONE] -->
5771
<string name="cat_topappbar_collapsing_multiline_demo_toolbar_title" description="Long title [CHAR_LIMIT=NONE]">This Collapsing Title is
5872
extremely long and thus will be displayed in multiple lines.</string>
73+
<!-- Label for a button to change the maximum number of lines [CHAR_LIMIT=32] -->
74+
<string name="menu_max_lines">Max lines = <xliff:g id="max">%d</xliff:g></string>
5975
</resources>

lib/java/com/google/android/material/appbar/CollapsingToolbarLayout.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto
482482
collapsingTextHelper.setCollapsedBounds(
483483
tmpRect.left + (isRtl ? toolbar.getTitleMarginEnd() : toolbar.getTitleMarginStart()),
484484
tmpRect.top + maxOffset + toolbar.getTitleMarginTop(),
485-
tmpRect.right + (isRtl ? toolbar.getTitleMarginStart() : toolbar.getTitleMarginEnd()),
485+
tmpRect.right - (isRtl ? toolbar.getTitleMarginStart() : toolbar.getTitleMarginEnd()),
486486
tmpRect.bottom + maxOffset - toolbar.getTitleMarginBottom());
487487

488488
// Update the expanded bounds

0 commit comments

Comments
 (0)