7

Próbuję zmienić fragment strony podglądu, klikając przycisk. Mam 5 fragmentów, każdy fragment ma swój własny plik xml (frag1.xml, frag2.xml i tak dalej). Każdy fragment ma 5 przycisków, które powinny przejść na inne strony przeglądarki. Ale problem polega na tym, jak sprawdzić FragmentPageAdapter, który przycisk jest kliknięty i jak się tam dostać?Zmień fragment strony podglądu za pomocą przyciskuKliknij

Pokażę kod, który mam, wtedy powinno być jasne, myślę. Pomyśl o tym jak o ekranie głównym, który ma kropki na dole, a ja klikniesz pewną kropkę, przejdziesz do odpowiedniego ekranu.

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

główną działalność

public class główną działalność rozciąga 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; 
    } 
} 

Czy coś takiego jest możliwe? Czy ktoś może mi pomóc we właściwym kierunku, proszę?

+0

tak? https://stackoverflow.com/questions/39500413/change-viewpager-fragment-from-child-fragment –

Odpowiedz

21

Nie jestem pewien, co dokładnie powiedziałeś na temat "Zmiany".

Jeśli pytasz o widoku zmiana indeksu wyświetlacza, można spróbować

ViewPager.setCurrentItem(int pageIndex, boolean isSmoothScroll); 

Lub, jeśli pytasz o treści zmian, oto co zrobiłem

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

Nadzieja pomaga ~

+0

Rzeczywiście mówiąc o zmianie indeksu wyświetlania strony. Gdzie powinienem umieścić 'ViewPager.setCurrentItem (int pageIndex, boolean isSmoothScroll);' – mXX

+3

Masz 2 sposoby. 1) Umieść obiekt ViewPager jako publiczny statyczny, aby uzyskać dostęp do dowolnego fragmentu. 2) Zostaw swój ViewPager jako członka FragmentActivity, wyślij zamiar transmisji z Fragmentu do FragmentActivity i uzyskaj dostęp do obiektu ViewPager. – RRTW

+0

OK, to zadziałało dla mnie dzięki! – mXX

5

Zamieszczam nową odpowiedź, ponieważ - z tego, co widzę - prawdziwa odpowiedź znajduje się w komentarzu zaakceptowanej odpowiedzi:

"Masz 2 sposoby. 1) Umieść obiekt ViewPager jako publiczny statyczny, aby uzyskać dostęp do dowolnego fragmentu. 2) Zostaw swój ViewPager jako członka FragmentActivity, wyślij zamiar transmisji z Fragmentu do FragmentActivity i uzyskaj dostęp do obiektu ViewPager. - RRTW 28 maja '13 w 2:18 "

Więc Dzięki RRTW za tę odpowiedź, ale chciałbym go poprawić

1) nie jest rozwiązaniem Celem fragmentów ma być wielokrotnego użytku.. , więc muszą być niezależne od działania. Łączenie ich z aktywnością jest uważam za złą praktykę, nawet jeśli - na razie - nie używasz jej ponownie do innej aktywności

2) Brzmi bardzo dobrze, ale Myślę, że potrzebuje więcej wyjaśnień.Celem funkcji getAcitivty(). SendBroadcast() jest wysłanie zdarzenia do wszystkich aplikacji systemu użytkownika, to na pewno nie jest to, co chcesz osiągnąć.Tak dobra odpowiedź z mojego punktu widzenia jest użycie LoacalBroadcastManager, a możesz mieć spójrz na that post, aby zrozumieć, jak z niego korzystać.

+0

plus jeden dla statycznego publicznego pager'a –

+0

Dziękuję za wyjaśnienie, # 1 to zły projekt, który znam (tylko dla projektu, który kończy się czas. I około 2, jak powiedziałeś, to LocalBroadcast (tylko we własnej aplikacji), używam go również w moim projekcie APP. Moim błędem jest nazwać to transmisją. Jeszcze raz dziękuję :-) – RRTW

0

W głównym zadzwoń dokonać publicznej Viewpager więc jego accessable od innych plików Java (ex. Z frag1.java)

główną działalność.Java:

public static ViewPager pager;

Teraz w funkcji Onclick() wewnątrz frag1.java prostu zadzwonić do mViewPager i ustawić element (fragment) na cokolwiek fragment chcesz załadować. Dawny. Jeśli chcesz, aby załadować następny fragment następnie ustawić go do 2.

frag1.java

public void onClick(View v) { 

    ViewPager.setCurrentItem(2); 

} 
Powiązane problemy