Fragment和Activity交互之actionbar

通常fragment和activity之间的交互一般是通过在Fragment中定义回调函数来实现
今天说说google已经定义好了回调接口的actionBar交互
看图:
主要图片
上面的actionbar是运行是activity的布局,中间的图片部分是一个FragmentLayout布局
但是我想点击“TIMELINE”希望能控制FragmentLayout中显示的Fragment中的某些数据或布局。
而且通过以下方法可以实现不同的fragment在activity中显示,可以显示不用的actionbar,且能自动响应各个fragment自己的事件,适合多tab包含多个fragment功能布局
实现方法:
先看Fragment中的code及说明
第一步,setHasOptionsMenu(true);


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        MyLog.d(TAG, "timeline onCreate");

        //设置fragment可以响应actionbar事件和添加本fragment专有的item进去,
        //其在activity中的点击会回调到fragment
        //然后重写onCreateOptionMenu()和onOptionsItemSelected()
        //onCreateOptionMenu添加的item会叠加到activity上去,onOptionsItemSelected可以响应非自己专有的的item事件
        setHasOptionsMenu(true);
        super.onCreate(savedInstanceState);
    }

第二部,这里和activity中设置actionbar是很相似的,布局你的actionbar,唯一的不同是函数的返回值

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        super.onCreateOptionsMenu(menu, inflater);
         menu.add(0, 1, 0, "Timeline").setShowAsAction(
                  MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }

当然你也可以通过xml文件的方式布局你的actionbar,像这样(用上方的下面两段代码片可忽略)

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.singleview_actionbar, menu);
        return true;
    }

xml很简单如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/singleview_delete"
        android:icon="@drawable/delete"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:title="delete"/>
    <item
        android:id="@+id/singleview_send"
        android:icon="@drawable/send"
        android:orderInCategory="101"
        android:showAsAction="always"
        android:title="send"/>
    <item
        android:id="@+id/singleview_liked"
        android:icon="@drawable/star"
        android:orderInCategory="102"
        android:showAsAction="always"
        android:title="liked"/>

</menu>

第三步,编写item的响应事件
这里不用你担心回调的问题,会自动响应你这里实现的itme点击事件,不管是不是此fragment自己布局的item,还可以响应activity中的item


    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
        case 0://这个0是上图中“操作”字样的ItmeId
            //这里可以回调activity全部item的事件
            Toast.makeText(getActivity(), "点击了在timeline fragment定义的点击事件",
                    Toast.LENGTH_SHORT).show();
            break;
        case ITEM_ID:
            if (mActionMode != null)
            {
                return false;
            }
            mActionMode = getActivity().startActionMode(this);

            // 现在是多选
            mMultipleSeleteTag = true;
            break;

        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值