Search code examples
androidfragmenttransaction

android onClick change fragment


I want to change the Fragment when i click the button. The fragments are in the same adapter/viewpager.

FROM THIS FRAGMENT:

public class LoginFragment extends Fragment {

TextView linkToRegister;

public static final LoginFragment newInstance()
{
    LoginFragment mf = new LoginFragment();
    Bundle bd = new Bundle(1);
    mf.setArguments(bd);
    return mf;
}

public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState )
{
    View v = inflater.inflate(R.layout.fragment_login, container, false);

    linkToRegister = (TextView) v.findViewById(R.id.link_to_register);


    linkToRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Change Fragment
        }
    });


    return v;
}


}

TO THIS FRAGMENT:

public class RegisterFragment extends Fragment {

public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";

public static final RegisterFragment newInstance()
{
    RegisterFragment mf = new RegisterFragment();
    Bundle bd = new Bundle(1);
    mf.setArguments(bd);
    return mf;
}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )
{
    View v = inflater.inflate(R.layout.fragment_register, container, false);
    return v;
}
}

PagerAdapter:

public class WelcomePagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> Welcomefragments;

public WelcomePagerAdapter(FragmentManager fm, List<Fragment> Welcomefragments) {
    super(fm);
    this.Welcomefragments = Welcomefragments;
}

@Override
public Fragment getItem(int position) {
    return this.Welcomefragments.get(position);
}

@Override
public int getCount() {
    return this.Welcomefragments.size();
}
}

Activity:

public class WelcomeActivity extends AppCompatActivity {
ViewPager welcomeViewPager;
WelcomePagerAdapter welcomePagerAdapter;
List<Fragment> welcomeFragments;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_welcome);


    welcomeViewPager = (ViewPager) findViewById(R.id.viewPagerWelcome);
    welcomeFragments = getWelcomeFragments();
    welcomePagerAdapter = new WelcomePagerAdapter(getSupportFragmentManager(), welcomeFragments);

    welcomeViewPager.setAdapter(welcomePagerAdapter);

}

public List<Fragment> getWelcomeFragments() {
    List<Fragment> newFragment = new ArrayList<Fragment>();
    newFragment.add(LoginFragment.newInstance());
    newFragment.add(RegisterFragment.newInstance());
    return newFragment;

}


}

Solution

  • Step 1: Define a callback interface in the Fragment and hook in the Activity when the Fragment attaches to it.

    public class MyFragment extends Fragment {
    
        public interface OnInteractionListener {
            void doAction(); // Can include parameters here if needed
        }
    
        private OnInteractionListener listener;
    
        @Override
        public void onAttach(Context context) {
            if (context instanceof OnInteractionListener) {
                listener = (OnInteractionListener) context;
            } else {
                throw new ClassCastException(context + "must implement " + OnInteractionListener.class.getSimpleName());
            }
            super.onAttach(context);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_layout, container, false);
            // ...
            return v;
         }
    }
    

    Step 2: Make sure your Activity implements that Interface

    public class MyActivity extends AppCompatActivity implements MyFragment.OnInteractionListener {
    
        @Override
        public void doAction() {
            // TODO: Implement this... e.g. switch fragments
        }
    
        ...
    }
    

    Step 3: Inside the Fragment, you can invoke the callback whenever you want to perform some action

    if (listener != null) {
        listener.doAction();
    }