Fragment的使用与通信方式小结

主要对fragment做一个小结,不涉及太多细节,关于生命周期和常用API就不谈了,浓缩才是精华大笑


一.两种加载Fragment到Activity的方式

1.静态的方式:在xml里使用<fragment>,相当于普通组件一样使用,需要指定android:name="com.xx.xxframent"

2.动态的方式:在代码里动态使用fragment,主要是通过getFragmentManager.beginTranstaction.replace(替换的id, xxfragment).commit()

replace()包含add()和remove()两种操作,还有比较重要的hide和show用于相互切换的情况


.Fragment与Activity的通信

actvitity获取fragment

因为FragmentManager管理着fragment,所以activity里可以getFragmentManager.findFragmentById()获取到指定的fragment

fragment获取actvitity

在fragment里直接getActivity()


三.Fragment与Activity的传值

actvitity向fragment传值:new Bundle(), xxfragment.setArguments(bundle)

fragment向actvitity传值:定义内部回调接口


模拟回退栈使用transaction.addToBackStack(null);,在事务中加到栈就可以了,这样back键可以实现回退效果


下面来一个简单的Fragment与Fragment的交互demo


效果图,一个activity包含两个fragment,通过点击左边fragment的标题,右边的fragment刷新对应得数据显示



主activity布局



主activity代码



左边fragment就包含一个listview,右边fragment包含一个textview

左边fragment代码

public class LeftFragment extends android.app.Fragment {

    private ListView listView;
    private String []data = new String[] {"习近平访韩", "奥巴马访中", "我是歌手内幕", "牛奶的好处"};
    private MyCallback myCallback;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        //判断
        if (!(activity instanceof MyCallback)) {
            throw new IllegalStateException("没有实现MyCallback接口");
        }
        myCallback = (MyCallback) activity;//activity当成MyCallback
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_left, null);
        listView = (ListView) view.findViewById(R.id.left_lv);
        listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data));

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                myCallback.onSuccess(i);//回调给activity
            }
        });
        return view;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        myCallback = null;//解除引用
    }

    public interface MyCallback {
        void onSuccess(int which);
    }
}


右边fragment代码

public class RightFragment extends android.app.Fragment {

    private TextView textView;
    private String []data = new String[] {"习近平访韩,达成xx协议", "奥巴马访中,好开心", "我是歌手内幕,真的有内幕吗", "牛奶的好处,牛奶可以美容,牛奶可以"};

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_right, null);
        textView = (TextView) view.findViewById(R.id.right_tv);
        return view;
    }

    //处理相互
    public void refresh(int which) {
        textView.setText(data[which]);
    }
}

虽然Fragment和Activity可以通过getActivity与findFragmentByTag或者findFragmentById,进行任何操作,甚至在Fragment里面操作另外的Fragment,但是这种方式不推荐,推荐把事情交给activity分配去处理,而不是Fragment直接操作另一个Fragment






猜你喜欢

转载自blog.csdn.net/PK0071/article/details/51112642
今日推荐