Изменение фрагмента viewpager нажатием кнопки
Я пытаюсь изменить фрагмент viewpager, нажав на кнопку. У меня есть 5 фрагментов, каждый фрагмент имеет свой собственный xml-файл (frag1.XML-файле, frag2.XML и так далее). Каждый фрагмент имеет 5 кнопок, которые должны перейти на другие страницы viewpager. Но проблема в том, как проверить в FragmentPageAdapter, какая кнопка нажата и как туда попасть?
Я покажу код, который у меня есть, тогда должно быть ясно, я думаю. Думайте об этом как рабочий стол, который имеет точки внизу и я нажимаю на определенную точку, вы перейдете к соответствующему экрану.
FragmentPagerAdapter
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
final int PAGE_COUNT = 6;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
switch(arg0){
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
case 3:
return new Fragment4();
case 4:
return new Fragment5();
default:
return null;
}
}
/** Returns the number of pages */
@Override
public int getCount() {
return PAGE_COUNT;
}
}
Frag1.java
public class Frag1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_one, container, false);
OnClickListener changeFrag = new OnClickListener() {
@Override
public void onClick(View v) {
/*When I click this button in my fragment, I'd like it to go to fragment 3 for example*/
}
};
ImageButton btnT = (ImageButton) v.findViewById(R.id.frag3);
btnT.setOnClickListener(changeFrag);
return v;
}
}
MainActivity
public class MainActivity расширяет FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);/** Getting a reference to the ViewPager defined the layout file */
ViewPager pager = (ViewPager) findViewById(R.id.pager);
/** Getting fragment manager */
FragmentManager fm = getSupportFragmentManager();
/** Instantiating FragmentPagerAdapter */
MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);
/** Setting the pagerAdapter to the pager object */
pager.setAdapter(pagerAdapter);
//pager.setPageTransformer(true, new ZoomOutPageTransformer());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
возможно ли что-то подобное? Может кто-нибудь помочь мне в правильном направлении, пожалуйста?
3 ответов
Я не уверен, что именно вы сказали о "изменении".
Если вы спрашиваете об изменении индекса отображения страницы, вы можете попробовать
ViewPager.setCurrentItem(int pageIndex, boolean isSmoothScroll);
или, если вы спрашиваете об изменении контента, вот что я сделал
public class MyPagerAdapter extends FragmentStatePagerAdapter
{
private FragmentManager fragMan;
private ArrayList<Fragment> fragments=new ArrayList<Fragment>();
public void clearAll() //You can clear any specified page if you want...
{
for(int i=0; i<fragments.size(); i++)
fragMan.beginTransaction().remove(fragments.get(i)).commit();
fragments.clear();
fragments=new ArrayList<Fragment>();
notifyDataSetChanged();
}
public void addList() //Add some new fragment...
{
listFrag=new ListFragment();
fragments.add(list);
}
}
надеюсь, это поможет~
Я публикую новый ответ, потому что-из того, что я вижу - реальный ответ находится на комментарии принятого ответа:
"У вас есть 2 способа сделать. 1)поместите объект ViewPager как общедоступный статический, чтобы вы могли получить доступ к любому фрагменту. 2) Оставайтесь своим ViewPager в качестве члена вашей FragmentActivity, отправьте намерение трансляции из вашего фрагмента в FragmentActivity и получите доступ к объекту ViewPager. - RRTW май 28 '13 в 2: 18"
Так что спасибо RRTW за это ответ, но я хотел бы улучшить его.
1) не является вариантом. Цель фрагментов-быть многоразовыми, поэтому они должны быть независимыми от активности. Я думаю, что связывать их с деятельностью-плохая практика, даже если-пока-вы не используете ее для другой деятельности.
2) звучит очень хорошо, но я думаю, что ему нужно больше объяснений. Цель getAcitivty ().sendBroadcast () - это отправка события во все приложения системы пользователя. Это определенно не то, что вы хотите достичь. Поэтому хорошим ответом, с моей точки зрения, является использование LoacalBroadcastManager, и вы можете посмотреть на этот пост чтобы понять, как использовать его.
в основном просто позвоните, чтобы ваш Viewpager стал общедоступным, поэтому его можно получить из других файлов java( например. из frag1.java)
MainActivity.Java:
public static ViewPager pager;
Теперь, в функции Onclick () внутри frag1.java просто позвоните mViewPager
и установите элемент (фрагмент) на любой фрагмент, который вы хотите загрузить. Бывший. Если вы хотите загрузить следующий фрагмент, установите для него значение 2.
frag1.java
public void onClick(View v) {
ViewPager.setCurrentItem(2);
}