在同一个Activity中,两个Fragment之间进行跳转实例

  在实际开发中,我们经常会用到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方法中进行获取到参数.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值