在低版本Android上使用Material Design——AppCompat v21
What's new in AppCompat?
开始使用
dependencies{compile"com.android.support:appcompat-v7:21.0.+"}
如果你的App首次使用AppCompat
-
所有的Activity必须继承ActionBarActivity,ActionBarActivity继承自v4包的FragmentActivity,因此你仍然可以使用Fragment.
-
所有theme必须继承
Theme.AppCompat
——这个主题包含一些不同的子主题,比如Light
和NoActionBar
。 -
如果你要inflate一些元素(比如说一个列表)以展示在ActionBar上的话,请确保你使用的是ActionBar的themed context——使用getSupportActionBar().getThemedContext()方法获得这个context。
-
对MenuItem进行相关操作时,必须MenuItemCompat的静态方法
如果你的App之前就使用AppCompat
values/themes.xml:<stylename="Theme.MyTheme"parent="Theme.AppCompat.Light"><!--SetAppCompat’sactionBarStyle--><itemname="actionBarStyle">@style/MyActionBarStyle</item><!--SetAppCompat’scolorthemingattrs--><itemname=”colorPrimary”>@color/my_awesome_red</item><itemname=”colorPrimaryDark”>@color/my_awesome_darker_red</item><!--Therestofyourattributes--></style>
设置主题
values/themes.xml:<stylename="Theme.MyTheme"parent="Theme.AppCompat.Light"><!--colorPrimaryisusedforthedefaultactionbarbackground--><itemname=”colorPrimary”>@color/my_awesome_color</item><!--colorPrimaryDarkisusedforthestatusbar--><itemname=”colorPrimaryDark”>@color/my_awesome_darker_color</item><!--colorAccentisusedasthedefaultvalueforcolorControlActivated,whichisusedtotintwidgets--><itemname=”colorAccent”>@color/accent</item><!--YoucanalsosetcolorControlNormal,colorControlActivatedcolorControlHighlight,andcolorSwitchThumbNormal.--></style>
Widget着色(Widget tinting)
-
AppCompat’s toolbar中的一切 (action modes等等)
-
EditText
-
Spinner
-
CheckBox
-
RadioButton
-
Switch (要使用新的android.support.v7.widget.SwitchCompat)
-
CheckedTextView
Toolbar组件
-
如果你想要使用现有的ActionBar功能(比如使用菜单、ActionBarDrawerToggle等等)同时又想自己掌握它的样式,那么你可以把ToolBar用作ActionBar。
-
对于一些ActionBar所不支持的场景——比如说在同一屏幕上使用多个ToolBar、使用低于屏幕宽度的尺寸的ToolBar等等(看上图就知道了)——你就要使用ToolBar了。
Action Bar
<android.support.v7.widget.Toolbarandroid:id=”@+id/my_awesome_toolbar”android:layout_height=”wrap_content”android:layout_width=”match_parent”android:minHeight=”?attr/actionBarSize”android:background=”?attr/colorPrimary”/>
@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.blah);Toolbartoolbar=(Toolbar)findViewById(R.id.my_awesome_toolbar);setSupportActionBar(toolbar);}
Standalone
@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.blah);Toolbartoolbar=(Toolbar)findViewById(R.id.my_awesome_toolbar);//SetanOnMenuItemClickListenertohandlemenuitemclickstoolbar.setOnMenuItemClickListener(newToolbar.OnMenuItemClickListener(){@OverridepublicbooleanonMenuItemClick(MenuItemitem){//Handlethemenuitemreturntrue;}});//Inflateamenutobedisplayedinthetoolbartoolbar.inflateMenu(R.menu.your_toolbar_menu);}
Styling
<android.support.v7.widget.Toolbarandroid:layout_height="wrap_content"android:layout_width="match_parent"android:minHeight="?attr/actionBarSize"app:theme="@style/ThemeOverlay.AppCompat.ActionBar"/>
DarkActionBar
<android.support.v7.widget.Toolbarandroid:layout_height=”wrap_content”android:layout_width=”match_parent”android:minHeight=”@dimen/triple_height_toolbar”app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
SearchView Widget
values/themes.xml:<stylename=”Theme.MyTheme”parent=”Theme.AppCompat”><itemname=”searchViewStyle”>@style/MySearchViewStyle</item></style><stylename=”MySearchViewStyle”parent=”Widget.AppCompat.SearchView”><!--Backgroundforthesearchquerysection(e.g.EditText)--><itemname="queryBackground">...</item><!--Backgroundfortheactionssection(e.g.voice,submit)--><itemname="submitBackground">...</item><!--Closebuttonicon--><itemname="closeIcon">...</item><!--Searchbuttonicon--><itemname="searchIcon">...</item><!--Go/commitbuttonicon--><itemname="goIcon">...</item><!--Voicesearchbuttonicon--><itemname="voiceIcon">...</item><!--Commiticonshowninthequerysuggestionrow--><itemname="commitIcon">...</item><!--Layoutforquerysuggestionrows--><itemname="suggestionRowLayout">...</item></style>
结语
FAQ
为啥我的老Android系统上的EditText(或者上面提到的支持的控件)长得不像Material风格呢?
-
你使用自己的自定义的widget(比如使用的自定义的继承了EditText的类)。
-
你创建EditText的时候没有给它LayoutInflater(比如直接New EditText())
为何某某组件在我的老Android系统上长得不像Material风格?
为啥我的ActionBar在Android 5.0上的阴影,我已经把android:windowContentOverlay设置为null了啊?
为啥我的老版本Android没有波纹效果?
我使用了AppCompat后还能用Preference么?
更多相关文章
- android——xml drawable实现背景样式
- Android教程:LayerDrawable层叠样式layer-list
- Android之四大组件
- Android的TextView组件相关属性
- 总结一下Android中主题(Theme)的正确玩法
- android GridView item中组件获取焦点
- android DatePicker样式设置
- Android架构组件(三)——ViewModel