Fragment的跳转小结
近来在学习过程中遇到关于fragment的跳转问题,特在此作小结
1.Activity启动Fragment并传递参数
就像Intent传值,我们依然将数据存放在Bundle中,然后利用Fragment.setArguments()将值传过去。例如:
DemoFragment demoFragment = new DemoFragment();
Bundle bundle = new Bundle();
bundle.putString("key", "value");
demoFragment.setArguments(bundle);
然后在fragment中用getArguments()将Bundle取出,读取数据
当然,如果要fragmment读取activity中的值,还有个懒方法,我们将activity中需要读取的值定义为static,那么就可以直接调用,不过此方法很不安全,还有一个此方法的衍生方法,如下:
public class MyActivity {
private String mValue;
public void getValue() {
return mValue;
}
}
我们在activity中写一个get方法,然后在fragment中通过((MyActivity)getActivity).getValue()来读取所需的值,同理我们也可以在activity中写一个set方法,然后在fragment中调用此方法来修改mValue值。
2.Fragment之间相互跳转
若是activity启动FragmentA之后,直接在FragmentA中点击按键或其它操作,然后跳转到FragmentB,有两种思路
1.直接在FragmentA中调用FragmentManager,但是Fragment中直接调用FragmentManager肯定是不行的,我们可以用getActivity()获取Activity,然后利用Activity.getFragmentManager()来进行Fragment操作。
2.利用回调函数,由Fragment告知Activity要进行跳转,然后Activity利用FragmentManager进行跳转,如下:
public class FragmentA extends Fragment{
private OnItemClick onItemClick;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
final View view= inflater.inflate(R.layout.fragment_get_cook_book, container, false);
Button mButton=(Button)view.findViewById(R.id.button);
mButton.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
onItemClick.OnClick();
}
});
return view;
}
public void setOnItemClick(OnItemClick onItemClick){
this.onItemClick=onItemClick;
}
public interface OnItemClick{
void OnClick();
}
}
然后在MyActivity中重写OnItemClick()
public class MyActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentA mFragmentA=new FragmentA();
FragmentA.setOnItemClick(new GetCookBookFragment.OnItemClick() {
@Override
public void OnClick() {
//当点击FragmentA中的button,回调此方法,跳转至FragmentB
FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, new FragmentB());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();} });
fragmentTransaction.replace(R.id.fragment_container, getCookBookFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
}
若我们从FragmentA跳转到FragmentB,又想当我们点击返回键时从FragmentB退回FragmentA,该如何做呢?只需要简单两步。
1.在跳转fragmentA时,在fragmentTrasaction.commit之前加上fragmentTransaction.addToBackStack(null)(在上面代码里可以找到)
2.重写Activity的onBackPressed(),如下
@Override public void onBackPressed() { if(getFragmentManager().getBackStackEntryCount()==0){ super.onBackPressed(); }else { getFragmentManager().popBackStack(); } }
这样,当我们点击back按键既可以返回上一Fragment