您的位置:首页 > 其它

Fragment的使用与通信方式小结

2016-04-10 15:32 405 查看
主要对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: