2016-06-03 4 views
-3

Я хочу изменить фрагмент, когда я нажимаю кнопку. Фрагменты находятся в одном и том же адаптере/viewpager.android onClick change фрагмент

Из этого фрагмента:

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; 
} 


} 

К этому фрагменту:

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(); 
} 
} 

активность:

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; 

} 


} 
+2

Вы необходимо использовать обратный вызов Activity из фрагмента, чтобы изменить страницу адаптера. Пожалуйста, ознакомьтесь с этим руководством о том, как это сделать. https://developer.android.com/training/basics/fragments/communicating.html –

+0

Привет, спасибо за ваш ответ. все еще не понимаю, как это сделать, можете ли вы объяснить мне это? –

+0

Фрагмент определяет интерфейс, затем Activity реализует этот интерфейс и соответствующие методы, Фрагмент привязан к этому Activity/interface и может вызывать его методы. –

ответ

0

Шаг 1: Определение интерфейса обратного вызова в фрагменте и крюк в деятельности, когда фрагмент прикрепляется к нему.

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; 
    } 
} 

Шаг 2: Убедитесь, что активность реализует этот интерфейс

public class MyActivity extends AppCompatActivity implements MyFragment.OnInteractionListener { 

    @Override 
    public void doAction() { 
     // TODO: Implement this... e.g. switch fragments 
    } 

    ... 
} 

Шаг 3: Внутри фрагмента, вы можете вызвать функцию обратного вызова, когда вы хотите, чтобы выполнить какое-либо действие

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

Спасибо, это мне очень помогло! :) –