Fragment Menu and Navigate

Fragment 中使用菜单

在 Activity 中我们可以通过调用 onCreateOptionsMenu() 创建菜单,通过 onOptionsItemSelected() 方法响应用户的点击事件。当然,在 Fragment 也是这两个回调方法的,所以我们就可以通过覆盖这两个方法为自己的 Fragmrnt 创建菜单栏。

首先,创建一个自定义Fragment,命名为 MainFragment.java,在类中实现两个方法,如下示

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu,menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.test:
                Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

当然,仅仅是这样菜单栏是无法显示出来的,这也是和在 Activity 中使用不同的地方,我们还需要在 Fragment 的 onCreate() 方法中调用 setHasOptionsMenu(boolean hasMenu) 方法,如下

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

这样,我们就可以在Fragment 中定义的菜单栏就可以显示出来了。

层级式导航

有的时候,我们希望在 ActionBar 中提供一个左指向的图标,用于提供回退上一级的功能,当然这在 Fragment 中也是可以轻易实现的,当然如果 NavUtils 和 manifest 配置文件中的元数据配合使用是最完美的。下面就来就来介绍一下这种使用方法。

首先,在 Manifest 中配置元数据

    <activity android:name=".SecondActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity">
        </meta-data>
    </activity>

正如以上代码所示,为 Activity 设置 父 Activity,用于 NavUtils 的判断和实现回返功能。

下面需要在 Fragment 中进行两次判断,一次是在创建视图的时候,一次是在用户点击菜单之后

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            if (NavUtils.getParentActivityName(getActivity()) != null) {
                ((AppCompatActivity) getActivity()).getSupportActionBar()
                        .setDisplayHomeAsUpEnabled(true);
            }
  }

因为 setDisplayHomeAsUpEnabled() 方法来自于 API 11 级,所以使用前首先对当前Android 版本进行检测,如果是低于 HONEYCOME 的版本,则不创建层级视图。其次是利用 NavUtils 类的 getParentActivityName() 方法去获取托管当前 Fragment 的 Activity 是否有父 Activity,这个值就是上面我们设定的值。

当用户点击了当前设置的返回菜单时,会触发 onOptionsItemSelected() 方法,下面我们就要进行响应

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                if (NavUtils.getParentActivityName(getActivity()) != null) {
                    NavUtils.navigateUpFromSameTask(getActivity());
                }
        }
        return super.onOptionsItemSelected(item);
    }
}

正如以上代码所示,利用 NavUtils 的 navigateUpFromSameTask() 方法就可以导航至父 Activity。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值