Skip to content

Commit 3d78390

Browse files
author
mylhyl
committed
Toolbar 支持 menu textSize、
app:titleTextAppearance 与 app:subtitleTextAppearance
1 parent 629ce2d commit 3d78390

File tree

9 files changed

+220
-35
lines changed

9 files changed

+220
-35
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.zhy.autolayout.widget;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
6+
import android.support.v7.view.menu.ActionMenuItemView;
7+
import android.util.AttributeSet;
8+
import android.util.TypedValue;
9+
10+
11+
import com.zhy.autolayout.utils.AutoUtils;
12+
import com.zhy.autolayout.utils.DimenUtils;
13+
14+
/**
15+
* Created by hupei on 2016/3/7 14:44.
16+
*/
17+
public class AutoActionMenuItemView extends ActionMenuItemView {
18+
private static final int NO_VALID = -1;
19+
private int mMenuTextSize;
20+
21+
public AutoActionMenuItemView(Context context) {
22+
this(context, null);
23+
}
24+
25+
public AutoActionMenuItemView(Context context, AttributeSet attrs) {
26+
this(context, attrs, 0);
27+
}
28+
29+
public AutoActionMenuItemView(Context context, AttributeSet attrs, int defStyle) {
30+
super(context, attrs, defStyle);
31+
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Theme,
32+
defStyle, R.style.ThemeOverlay_AppCompat);
33+
int menuTextAppearance = a.getResourceId(R.styleable.Theme_actionBarTheme,
34+
R.style.ThemeOverlay_AppCompat_ActionBar);
35+
mMenuTextSize = loadTextSizeFromTextAppearance(menuTextAppearance);
36+
a.recycle();
37+
}
38+
39+
@Override
40+
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
41+
if (!this.isInEditMode()) {
42+
setUpTitleTextSize();
43+
}
44+
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
45+
}
46+
47+
private int loadTextSizeFromTextAppearance(int textAppearanceResId) {
48+
TypedArray a = getContext().obtainStyledAttributes(textAppearanceResId,
49+
R.styleable.TextAppearance);
50+
try {
51+
if (!DimenUtils.isPxVal(a.peekValue(R.styleable.TextAppearance_android_textSize)))
52+
return NO_VALID;
53+
return a.getDimensionPixelSize(R.styleable.TextAppearance_android_textSize, NO_VALID);
54+
} finally {
55+
a.recycle();
56+
}
57+
}
58+
59+
private void setUpTitleTextSize() {
60+
if (mMenuTextSize == -1) return;
61+
int autoTextSize = AutoUtils.getPercentHeightSize(mMenuTextSize);
62+
setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize);
63+
}
64+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.zhy.autolayout.widget;
2+
3+
import android.content.Context;
4+
import android.util.AttributeSet;
5+
import android.view.View;
6+
7+
import com.zhy.autolayout.AutoLayoutActivity;
8+
9+
/**
10+
* Created by hupei on 2016/3/7 16:44.
11+
*/
12+
public class AutoLayoutWidgetActivity extends AutoLayoutActivity {
13+
14+
private static final String ACTION_MENU_ITEM_VIEW = "android.support.v7.view.menu.ActionMenuItemView";
15+
private static final String TAB_LAYOUT = "android.support.design.widget.TabLayout";
16+
17+
@Override
18+
public View onCreateView(String name, Context context, AttributeSet attrs) {
19+
View view = null;
20+
21+
if (name.equals(ACTION_MENU_ITEM_VIEW)) {
22+
view = new AutoActionMenuItemView(context, attrs);
23+
}
24+
if (name.equals(TAB_LAYOUT)) {
25+
view = new AutoTabLayout(context, attrs);
26+
}
27+
28+
if (view != null) return view;
29+
return super.onCreateView(name, context, attrs);
30+
}
31+
}

autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoToolbar.java

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,105 @@
11
package com.zhy.autolayout.widget;
22

33
import android.content.Context;
4+
import android.content.res.TypedArray;
45
import android.support.v7.widget.Toolbar;
6+
import android.text.TextUtils;
57
import android.util.AttributeSet;
8+
import android.util.TypedValue;
9+
import android.widget.TextView;
610

711
import com.zhy.autolayout.AutoLayoutInfo;
812
import com.zhy.autolayout.utils.AutoLayoutHelper;
13+
import com.zhy.autolayout.utils.AutoUtils;
14+
import com.zhy.autolayout.utils.DimenUtils;
15+
16+
import java.lang.reflect.Field;
917

1018
/**
1119
* Created by hupei on 2015/12/28 20:33.
1220
*/
1321
public class AutoToolbar extends Toolbar {
14-
22+
private static final int NO_VALID = -1;
23+
private int mTextSize;
24+
private int mSubTextSize;
1525
private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
1626

1727
public AutoToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
1828
super(context, attrs, defStyleAttr);
29+
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Toolbar,
30+
defStyleAttr, R.style.Widget_AppCompat_Toolbar);
31+
32+
int titleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance,
33+
R.style.TextAppearance_Widget_AppCompat_Toolbar_Title);
34+
35+
int subtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance,
36+
R.style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle);
37+
38+
mTextSize = loadTextSizeFromTextAppearance(titleTextAppearance);
39+
mSubTextSize = loadTextSizeFromTextAppearance(subtitleTextAppearance);
40+
41+
TypedArray menuA = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Theme,
42+
defStyleAttr, R.style.ThemeOverlay_AppCompat);
43+
int menuTextAppearance = menuA.getResourceId(R.styleable.Theme_actionBarTheme,
44+
R.style.ThemeOverlay_AppCompat_ActionBar);
45+
int menuTextSize = loadTextSizeFromTextAppearance(menuTextAppearance);
46+
47+
//防止 menu 定义 textSize,而 Toolbar 无定义 textSize 时,title 的 textSize 随 menu 变化
48+
if (mTextSize == NO_VALID) mTextSize = menuTextSize;
49+
if (mSubTextSize == NO_VALID) mSubTextSize = menuTextSize;
50+
51+
a.recycle();
52+
menuA.recycle();
1953
}
2054

2155
public AutoToolbar(Context context, AttributeSet attrs) {
22-
super(context, attrs);
56+
this(context, attrs, 0);
2357
}
2458

2559
public AutoToolbar(Context context) {
26-
super(context);
60+
this(context, null);
61+
}
62+
63+
private int loadTextSizeFromTextAppearance(int textAppearanceResId) {
64+
TypedArray a = getContext().obtainStyledAttributes(textAppearanceResId,
65+
R.styleable.TextAppearance);
66+
try {
67+
if (!DimenUtils.isPxVal(a.peekValue(R.styleable.TextAppearance_android_textSize)))
68+
return NO_VALID;
69+
return a.getDimensionPixelSize(R.styleable.TextAppearance_android_textSize, NO_VALID);
70+
} finally {
71+
a.recycle();
72+
}
73+
}
74+
75+
private void setUpTitleTextSize() {
76+
CharSequence title = getTitle();
77+
if (!TextUtils.isEmpty(title) && mTextSize != NO_VALID)
78+
setUpTitleTextSize("mTitleTextView", mTextSize);
79+
CharSequence subtitle = getSubtitle();
80+
if (!TextUtils.isEmpty(subtitle) && mSubTextSize != NO_VALID)
81+
setUpTitleTextSize("mSubtitleTextView", mSubTextSize);
82+
}
83+
84+
private void setUpTitleTextSize(String name, int val) {
85+
try {
86+
//反射 Toolbar 的 TextView
87+
Field f = getClass().getSuperclass().getDeclaredField(name);
88+
f.setAccessible(true);
89+
TextView textView = (TextView) f.get(this);
90+
if (textView != null) {
91+
int autoTextSize = AutoUtils.getPercentHeightSize(val);
92+
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize);
93+
}
94+
} catch (Exception e) {
95+
e.printStackTrace();
96+
}
2797
}
2898

2999
@Override
30100
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
31101
if (!this.isInEditMode()) {
102+
setUpTitleTextSize();
32103
this.mHelper.adjustChildren();
33104
}
34105
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

widgetsample/build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ android {
2121

2222
dependencies {
2323
compile fileTree(dir: 'libs', include: ['*.jar'])
24-
compile 'com.android.support:support-v4:23.1.0'
25-
compile 'com.android.support:appcompat-v7:23.1.0'
2624
compile project(':autolayout')
2725
compile project(':autolayout-widget')
28-
26+
compile 'com.android.support:design:23.1.1'
27+
compile 'com.android.support:support-v4:23.1.1'
28+
compile 'com.android.support:appcompat-v7:23.1.1'
29+
compile 'com.android.support:gridlayout-v7:23.1.1'
30+
compile 'com.android.support:cardview-v7:23.1.1'
2931
}

widgetsample/src/main/java/com/zhy/autolayout/test/widgets/MainActivity.java

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,42 @@
55
import android.support.v4.app.Fragment;
66
import android.support.v4.app.FragmentPagerAdapter;
77
import android.support.v4.view.ViewPager;
8+
import android.support.v7.widget.Toolbar;
89
import android.view.Menu;
910
import android.view.MenuItem;
1011

11-
import com.zhy.autolayout.AutoLayoutActivity;
1212
import com.zhy.autolayout.test.widgets.fragments.SimpleFragment;
13+
import com.zhy.autolayout.widget.AutoLayoutWidgetActivity;
1314

14-
public class MainActivity extends AutoLayoutActivity
15-
{
15+
public class MainActivity extends AutoLayoutWidgetActivity {
1616
private TabLayout mTabLayout;
1717
private ViewPager mViewPager;
1818

19+
1920
@Override
20-
protected void onCreate(Bundle savedInstanceState)
21-
{
21+
protected void onCreate(Bundle savedInstanceState) {
2222
super.onCreate(savedInstanceState);
2323
setContentView(R.layout.activity_main);
2424

25+
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
26+
toolbar.setTitle("标题");
27+
setSupportActionBar(toolbar);
2528
mTabLayout = (TabLayout) findViewById(R.id.id_tablayout);
2629
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
2730

28-
mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager())
29-
{
31+
mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
3032
@Override
31-
public Fragment getItem(int position)
32-
{
33+
public Fragment getItem(int position) {
3334
return new SimpleFragment();
3435
}
3536

3637
@Override
37-
public int getCount()
38-
{
38+
public int getCount() {
3939
return 2;
4040
}
4141

4242
@Override
43-
public CharSequence getPageTitle(int position)
44-
{
43+
public CharSequence getPageTitle(int position) {
4544
return "Page " + position;
4645
}
4746
});
@@ -51,24 +50,21 @@ public CharSequence getPageTitle(int position)
5150
}
5251

5352
@Override
54-
public boolean onCreateOptionsMenu(Menu menu)
55-
{
53+
public boolean onCreateOptionsMenu(Menu menu) {
5654
// Inflate the menu; this adds items to the action bar if it is present.
5755
getMenuInflater().inflate(R.menu.menu_main, menu);
5856
return true;
5957
}
6058

6159
@Override
62-
public boolean onOptionsItemSelected(MenuItem item)
63-
{
60+
public boolean onOptionsItemSelected(MenuItem item) {
6461
// Handle action bar item clicks here. The action bar will
6562
// automatically handle clicks on the Home/Up button, so long
6663
// as you specify a parent activity in AndroidManifest.xml.
6764
int id = item.getItemId();
6865

6966
//noinspection SimplifiableIfStatement
70-
if (id == R.id.action_settings)
71-
{
67+
if (id == R.id.action_settings) {
7268
return true;
7369
}
7470

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,38 @@
1-
<LinearLayout
2-
xmlns:android="http://schemas.android.com/apk/res/android"
1+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
32
xmlns:app="http://schemas.android.com/apk/res-auto"
43
xmlns:tools="http://schemas.android.com/tools"
54
android:layout_width="match_parent"
65
android:layout_height="match_parent"
7-
android:orientation="vertical"
8-
>
6+
android:orientation="vertical">
97

8+
<com.zhy.autolayout.widget.AutoToolbar
9+
android:id="@+id/toolbar"
10+
android:layout_width="match_parent"
11+
android:layout_height="wrap_content"
12+
android:background="?attr/colorPrimary"
13+
android:fitsSystemWindows="true"
14+
android:minHeight="?attr/actionBarSize"
15+
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
16+
app:subtitleTextAppearance="@style/ToolbarSubTitleTextAppearance"
17+
app:theme="@style/ToolBarMenuStyle"
18+
app:titleTextAppearance="@style/ToolbarTitleTextAppearance">
19+
20+
</com.zhy.autolayout.widget.AutoToolbar>
1021

11-
<com.zhy.autolayout.widget.AutoTabLayout
22+
<android.support.design.widget.TabLayout
1223
android:id="@+id/id_tablayout"
1324
android:layout_width="match_parent"
1425
android:layout_height="96px"
1526
android:background="#1787ff"
1627
app:tabIndicatorColor="#ff4a1c"
1728
app:tabSelectedTextColor="#ff4a1c"
1829
app:tabTextAppearance="@style/MyCustomTabTextAppearance"
19-
app:tabTextColor="#ffffff"/>
30+
app:tabTextColor="#ffffff" />
2031

2132

2233
<android.support.v4.view.ViewPager
2334
android:id="@+id/id_viewpager"
2435
android:layout_width="match_parent"
2536
android:layout_height="0dp"
26-
android:layout_weight="1"
27-
/>
37+
android:layout_weight="1" />
2838
</LinearLayout>

widgetsample/src/main/res/menu/menu_main.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
<item android:id="@+id/action_settings"
66
android:title="@string/action_settings"
77
android:orderInCategory="100"
8-
app:showAsAction="never"/>
8+
app:showAsAction="never|ifRoom"/>
99
</menu>

widgetsample/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
<string name="app_name">widgetSample</string>
33

44
<string name="hello_world">Hello world!</string>
5-
<string name="action_settings">Settings</string>
5+
<string name="action_settings">设置</string>
66
</resources>

widgetsample/src/main/res/values/styles.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,16 @@
88
<style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
99
<item name="android:textSize">32px</item>
1010
</style>
11+
<style name="ToolBarMenuStyle" parent="ThemeOverlay.AppCompat.ActionBar">
12+
<item name="actionMenuTextColor">@android:color/darker_gray</item>
13+
<item name="android:textSize">50px</item>
14+
</style>
15+
16+
<style name="ToolbarTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
17+
<item name="android:textSize">60px</item>
18+
</style>
1119

20+
<style name="ToolbarSubTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
21+
<item name="android:textSize">40px</item>
22+
</style>
1223
</resources>

0 commit comments

Comments
 (0)