工具栏被移植到了AppCompat库中,老版本android系统也可使用
整合AppCompat库
1.添加AppCompat依赖项
2.使用一种AppCompat主题
3.确保所以activity都是AppCompatActivity的子类
(本例中由于AppCompatActivity是FragmentActivity的子类,所以把继承自FragmentActivity的改成继承自AppCompatActivity即可)
AppCompat库自带的三种主题
Theme.AppCompat:黑色主题
Theme.AppCompat.Light:浅色主题
Theme.AppCompat.Light.DarkActionBar:带黑色工具栏的浅色主题
主题可以按application来配置整个应用或只配置与某个activity
android:theme="@style/AppTheme"
<style name="APPTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
AppCompat库可以统一各系统版本的主题风格,从而省去了适配的麻烦,只需要唯一一个style.xml文件即可
//设置工具栏子标题
private void updateSubtitle(){
CrimeLab crimeLab=CrimeLab.get(getActivity());
String crimeCount=crimeLab.getCrimes().size()+"";
//这里为什么报错,一开始crimeCount是int改成string就好了
String subtitle=getString(R.string.subtitle_format,crimeCount);
//菜单标题与子标题的联动
if(!mSubtitleVisible){
subtitle=null;
}
AppCompatActivity activity=(AppCompatActivity)getActivity();
activity.getSupportActionBar().setSubtitle(subtitle);
}
层级导航
后退键导航又称临时性导航,只能返回到上一次浏览过的页面
层级导航(hierarchical/ancestral navigation)可在应用内逐级向上导航
<activity android:name=".CrimePagerActivity"
android:label="@string/app_name"
android:parentActivityName=".CrimeListActivity">
</activity>
工作原理:
Intent intent=new Intent(this,CrimeListActivity.class);
intent.addFlags(Intent.Flag_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
这个Flag指示Android在回退栈中寻找指定activity实例,若存在则弹出栈内所有其他activity,让启动的目标activity位于栈顶
但很重要的一个问题是:导航回退到的目标activity会被完全重建,实例变量值以及保存的实例状态都彻底消失
这会导致工具栏被重置,比如原来是显示子标题的,退回去就不显示了
解决方案是启动CrimePagerActivity时,把子标题状态作为extra传过去,然后在CrimePagerActivity中覆盖getParentActivityIntent()方法,用附带信息的intent重建CrimeListActivity
注意为了解决旋转屏幕工具栏被重置,覆盖onSaveInstanceState方法保存以下mSubtitlVisible的值
一个细节:处理子标题中crime单复数的问题
原来用的string资源是
<string name="subtitle_format">%1$s crimes</string>
这会导致出现1crimes这样的错误语法
因此采用复数字符串资源
<plurals name="subtitle_plural">
<item quantity="one">%1$s crime</item>
<item quantity="other">%1$s crimes</item>
</plurals>
然后在代码中使用getQuantityString方法正确处理单复数问题
int crimeCount=crimeLab.getCrimes().size();
String subtitle=getResources().getQuantityString(R.plurals.subtitle_plural,crimeCount,crimeCount);