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: <style name="Theme.MyTheme" parent="Theme.AppCompat.Light"> <!-- Set AppCompat’s actionBarStyle --> <item name="actionBarStyle">@style/MyActionBarStyle</item> <!-- Set AppCompat’s color theming attrs --> <item name=”colorPrimary”>@color/my_awesome_red</item> <item name=”colorPrimaryDark”>@color/my_awesome_darker_red</item> <!-- The rest of your attributes --> </style>
设置主题
values/themes.xml: <style name="Theme.MyTheme" parent="Theme.AppCompat.Light"> <!-- colorPrimary is used for the default action bar background --> <item name=”colorPrimary”>@color/my_awesome_color</item> <!-- colorPrimaryDark is used for the status bar --> <item name=”colorPrimaryDark”>@color/my_awesome_darker_color</item> <!-- colorAccent is used as the default value for colorControlActivated, which is used to tint widgets --> <item name=”colorAccent”>@color/accent</item> <!-- You can also set colorControlNormal, colorControlActivated colorControlHighlight, and colorSwitchThumbNormal. --> </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.Toolbar android:id=”@+id/my_awesome_toolbar” android:layout_height=”wrap_content” android:layout_width=”match_parent” android:minHeight=”?attr/actionBarSize” android:background=”?attr/colorPrimary” />
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.blah); Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); setSupportActionBar(toolbar); }
Standalone
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.blah); Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); // Set an OnMenuItemClickListener to handle menu item clicks toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // Handle the menu item return true; } }); // Inflate a menu to be displayed in the toolbar toolbar.inflateMenu(R.menu.your_toolbar_menu); }
Styling
<android.support.v7.widget.Toolbar android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
DarkActionBar
<android.support.v7.widget.Toolbar android: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: <style name=”Theme.MyTheme” parent=”Theme.AppCompat”> <item name=”searchViewStyle”>@style/MySearchViewStyle</item> </style> <style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”> <!-- Background for the search query section (e.g. EditText) --> <item name="queryBackground">...</item> <!-- Background for the actions section (e.g. voice, submit) --> <item name="submitBackground">...</item> <!-- Close button icon --> <item name="closeIcon">...</item> <!-- Search button icon --> <item name="searchIcon">...</item> <!-- Go/commit button icon --> <item name="goIcon">...</item> <!-- Voice search button icon --> <item name="voiceIcon">...</item> <!-- Commit icon shown in the query suggestion row --> <item name="commitIcon">...</item> <!-- Layout for query suggestion rows --> <item name="suggestionRowLayout">...</item> </style>
结语
FAQ
为啥我的老Android系统上的EditText(或者上面提到的支持的控件)长得不像Material风格呢?
-
你使用自己的自定义的widget(比如使用的自定义的继承了EditText的类)。
-
你创建EditText的时候没有给它LayoutInflater(比如直接New EditText())