在做一个登录注册页面时,遇到的一个问题:

预计做出如下效果:

点击“还没有账号”切换到注册页面

但是在一开始写代码的时候,只想着使用两个fragment之间跳转,然后出现了两个fragment布局重叠,和事件泄露的问题,并且上方的TabLayout也不会跟随切换:

于是乎突然想到应该从viewPager方面来解决问题,只要在点击“还没有账号”的时候,将此时viewPager的Item改为我想要切换的页面,就行了。

因为这俩个fragment我放在同一个Activity下,所以我们对该Activity进行操作:

    //1.定义一个内部接口,用于实现俩个fragment之间的跳转
    public interface FgToFg {
        public void gotoFg(ViewPager viewPager);
    }

    private FgToFg fgToFg;//2.定义跳转接口的成员变量

    //3.为跳转接口的成员变量设置setter方法。
    public void setGotoFg(FgToFg fgToFg) {
        this.fgToFg = fgToFg;
    }

    //4.最后再给该Activity设置一个调用此接口中定义此方法的方法
    public void skipToFg() {
        if (fgToFg != null) {
            fgToFg.gotoFg(viewPager);
        }
    }

最后在点击事件中写:

    tvNoAccount.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //同一个LoginActivity下的LoginFragment跳转到RegisterFragment
            /*会出现fragment布局重叠,和事件泄露,并且TabLayout也不会跟随切换
            getActivity().getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.login_fragment_layout,new RegisterFragment(),null)
                    .addToBackStack(null)
                    .commit();
            */
            //通过设置ViewPager的setCurrentItem来切换页面
            ((LoginActivity) getActivity()).setGotoFg(new LoginActivity.FgToFg() {
                @Override
                public void gotoFg(ViewPager viewPager) {
                    viewPager.setCurrentItem(1);
                }
            });
            ((LoginActivity) getActivity()).skipToFg();
        }
    });

即可完成预计效果

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐