工具栏


此处的工具栏依然基于支持库,所以得添加支持库AppCompat

工具栏相当于一种特殊的布局资源,添加类似布局的东西(然后在Acitvity或fragment调用实例化)

在项目工具窗口中,右键单击res目录,选择NewAndroid resource file菜单项。在弹出的窗口界面, 选择Menu资源类型,并命名资源文件,点击OK按钮确认 .其会文件会放在menu文件夹里,没有文件夹则新建。


注意问题:

fragment需要在onCreate()里通知fragmentManager才能实现让fragmentManager知道fragment需要接受的菜单方法回调。

横竖界面屏切换要在onResume()更新菜单项才能保持菜单项的切换前效果

不同界面切换后切回需要在切换前保存资源,切换后在onCreateView()提取资源才能保持切换效果

(不同界面切换会消除原来界面而只把一些资源进栈,所以切回相当于半新建界面得保存提取资源设置才能保存状态)

例子:(基于fragment)

1.1 基本

创建

XML:(其中item项为菜单项,一个对应一个菜单项)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item_new_crime"
        android:icon="@drawable/ic_menu_add"
        android:title="@string/new_crime"
        app:showAsAction="ifRoom|withText"/>

    <item
        android:id="@+id/menu_item_show_subtitle"
        android:title="@string/show_subtitle"
        app:showAsAction="ifRoom"/>

</menu>

Activity:AppCompatActivity继承于FragmentActivity,只是增加了工具栏效果和方法

public class CrimePagerActivity extends  AppCompatActivity {
...
}

1.2 fragmnet中,启动menu方法

    //启动menu的方法
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.fragment_crime_list_menu, menu);

   }

1.3 fragmnet中

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //让fragmentManager知道fragment需接受的菜单方法的回调
        setHasOptionsMenu(true);
    }

1.4 fragment中,菜单项响应事件,每个case对应一个菜单项

 //相应点击menu菜单项的方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            //菜单项一,创建CrimeFragment界面来生成新Crime数据类
            case R.id.menu_item_new_crime:
                //新建数据类
                Crime crime = new Crime();
                //添加数据类到模型里
                CrimeListLab.getyCrimeLab(getActivity()).addCrime(crime);
                Intent intent = CrimePagerActivity
                        .newIntent(getActivity(), crime.getyID());
                startActivity(intent);
                return true;
          
            default:
                return super.onOptionsItemSelected(item);
        }
    }



2.1 多项菜单(新增的菜单为统计功能)

首先menu文件必须要,前面已经添加

fargment中,自定义统计方法

    //自定义方法,统计模型里数据类的数目并显示(菜单项二的功能)
    private void updateSubtitle() {
        CrimeListLab crimeLab = CrimeListLab.getyCrimeLab(getActivity());
        int crimeCount = crimeLab.getyCrime().size();
        String subtitle = getString(R.string.subtitle_format,crimeCount);

        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.getSupportActionBar().setSubtitle(subtitle);
    }
2.2 fragment中,前面的菜单相应事件方法中新增的case

case R.id.menu_item_show_subtitle:
updateSubtitle();
return true;



3.1 fragmnet中,更新菜单项,即按下菜单项后菜单项有所变化

    //bool,每次按下菜单反转,辅助记录按下改变菜单项的值
    private boolean mSubtitleVisible;
3.2 fragment的启动menu方法中,上述有
        //获取菜单项二的资源,并且根据bool来判断显示什么
        MenuItem subtitleItem = menu.findItem(R.id.menu_item_show_subtitle);
        if (mSubtitleVisible) {
            subtitleItem.setTitle(R.string.hide_subtitle);
        } else {
            subtitleItem.setTitle(R.string.show_subtitle);
        }
3.3 fragment中,菜单相应事件的case2里,因为是菜单项2的按下后变化

                //每次按下反转bool
                mSubtitleVisible = !mSubtitleVisible;
                getActivity().invalidateOptionsMenu();
3.4 fragment中,上述的自定义统计方法
        //实现菜单项和子标题的联动变化
        if (!mSubtitleVisible) {
            subtitle = null;
        }


4. 两个问题:

横竖界面切换后菜单项变化,只要在onResume()更新UI即可

不同界面切换后菜单项变化,用静态记录切换前状态,切换后更新(因为不同界面切换相当于Activity半新建,当然所有东西更新,所以要保持)








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值