在实际开发中,我们经常会用到Fragment来进行开发,那也许就会用到这个,当然使用Activity来进行跳转也是可以达到相同的目的的,只是用Fragment更加的灵活,好了,差不多就来开始实现了,主要分为带参数和不带参数两种情况.
Fragment跳转不带参数
这里主要写了两个Fragment来进行操作,Fragment1和Fragment2,首先在MainActivity中将Fragment1加进来,代码如下:
public class MainActivity extends AppCompatActivity {
private TextView tv_title;
private Button button;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_title=findViewById(R.id.tv_title);
button=findViewById(R.id.button);
fragmentManager=getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
Fragment1 fragment1=new Fragment1();
fragmentTransaction.add(R.id.fy_content,fragment1);
fragmentTransaction.commit();
}
}
这样一开始就处于Fragment1了,如果想要实现点击Fragment1中的按钮来实现跳转到Fragment2,当然我一开始想的可以利用handler从Fragment1传递消息到MainActivity进行replace,当然这种方法也可以实现,但增加了耦合,所以我们这里使用另一种方法,如下看Fragment1的实现代码:
public class Fragment1 extends Fragment{
private OnMyClick onMyClick;
public Fragment1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fg1,null,false);
TextView tv_msg=v.findViewById(R.id.fg1_msg);
TextView tv_title=getActivity().findViewById(R.id.tv_title);
tv_title.setText("第1个Fragment");
Button tofg2_bt=v.findViewById(R.id.tofg2_bt);
tv_msg.setText("这里是Fragment1");
ImageView back=getActivity().findViewById(R.id.iv_back);
back.setVisibility(View.GONE);
tofg2_bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onMyClick.onClick();
}
});
return v;
}
public OnMyClick getOnMyClick() {
return onMyClick;
}
public void setOnMyClick(OnMyClick onMyClick) {
this.onMyClick = onMyClick;
}
public interface OnMyClick{
public void onClick();
}
}
这里我们自定义了一个接口,同时定义了相应的变量,通过在MainActivity中设置onMyClick变量,实现其方法即可实现跳转.
fragment1.setOnMyClick(new Fragment1.OnMyClick() {
@Override
public void onClick() {
FragmentTransaction fragmentTransaction1=fragmentManager.beginTransaction();
Fragment2 fragment2=new Fragment2();
fragmentTransaction1.addToBackStack(null).replace(R.id.fy_content,fragment2);
fragmentTransaction1.commit();
}
});
这里addToBackStack是为了在进入到Fragment2中可以回退到Fragment1.好了,这样就可以简单实现两个Fragment之间的跳转了.这里是没有带参数的,但实际过程很多时候是需要带参数的,接下来看如何实现带参数跳转.
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getFragmentManager().popBackStack();
}
});
带参数Fragment进行跳转
带参数跳转需要在第二个Fragment中写一个函数newInstance,通过这个函数来获取Fragment对象,并传递参数,代码如下:
public static Fragment2 newInstance(String message) {
Bundle args = new Bundle();
Fragment2 fragment = new Fragment2();
args.putString("message", message);
fragment.setArguments(args);
return fragment;
}
此时在Fragment1中需要在myOnClick方法中加入参数,如下
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fg1,null,false);
TextView tv_msg=v.findViewById(R.id.fg1_msg);
TextView tv_title=getActivity().findViewById(R.id.tv_title);
tv_title.setText("第1个Fragment");
Button tofg2_bt=v.findViewById(R.id.tofg2_bt);
tv_msg.setText("这里是Fragment1");
ImageView back=getActivity().findViewById(R.id.iv_back);
back.setVisibility(View.GONE);
tofg2_bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onMyClick.onClick("哈哈哈,参数有了");
}
});
return v;
}
public OnMyClick getOnMyClick() {
return onMyClick;
}
public void setOnMyClick(OnMyClick onMyClick) {
this.onMyClick = onMyClick;
}
public interface OnMyClick{
public void onClick(String message);
}
通过在MainActivity中获取Fragment2对象,然后在onCreateView中获取参数,进行相应的操作.
fragment1.setOnMyClick(new Fragment1.OnMyClick() {
@Override
public void onClick(String message) {
FragmentTransaction fragmentTransaction1=fragmentManager.beginTransaction();
Fragment2 fragment2=Fragment2.newInstance(message);
fragmentTransaction1.addToBackStack(null).replace(R.id.fy_content,fragment2);
fragmentTransaction1.commit();
}
});
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fg2,null,false);
TextView tv_msg=v.findViewById(R.id.tv_message);
TextView tv_title=getActivity().findViewById(R.id.tv_title);
tv_title.setText("第2个Fragment");
if(getArguments()!=null) {
String message = getArguments().getString("message");
tv_msg.setText(message);
}
ImageView back=getActivity().findViewById(R.id.iv_back);
back.setVisibility(View.VISIBLE);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getFragmentManager().popBackStack();
}
});
return v;
}
实现结果
不带参数时:
带参数时
总结
在实现Fragment跳转时,主要通过添加了一个接口对象,并在对应的Activity中对其进行实现,也就是我们的跳转Fragment操作,将其放入后退栈中,方便第二个Fragment进行回退,其余的操作都是为普通的实现Fragment;需要带参数的跳转时,主要通过newInstance方法进行创建,在其中setArguments方法进行设置参数,在onCreateView方法中进行获取到参数.