工具栏与层级导航(搬运完毕)

工具栏被移植到了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);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容