2013-05-26 40 views
7

我試圖通過單擊按鈕來更改viewpager片段。我有5個片段,每個片段都有它自己的xml文件(frag1.xml,frag2.xml等)。每個片段都有5個按鈕,應該放到viewpager的其他頁面。但問題是我如何檢查FragmentPageAdapter哪個按鈕被點擊以及如何到達那裏?通過按鈕更改viewpager片段點擊

我將顯示我的代碼,然後應該清楚我的想法。把它想象成一個底部有點的主屏幕,我點擊某個點,你會進入相應的屏幕。

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

公共類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; 
    } 
} 

是這樣的可能嗎?有人能幫助我在正確的方向嗎?

+0

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

回答

21

我不確定你說的「變更」究竟是什麼。

如果你問改變頁面顯示的索引,你可以嘗試

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

希望它可以幫助〜

+0

事實上,談論改變頁面顯示索引。我應該在哪裏放置ViewPager.setCurrentItem(int pageIndex,boolean isSmoothScroll);' – mXX

+3

你有2種方法可以做。 1)將ViewPager對象設置爲公共靜態,以便您可以訪問任何Fragment。 2)保持你的ViewPager成爲你的FragmentActivity的成員,從你的Fragment發送一個廣播意圖到FragmentActivity,並訪問你的ViewPager對象。 – RRTW

+0

好的,這對我工作感謝! – mXX

5

我發佈了一個新答案,因爲 - 從我所能看到的 - 真正的答案是對已接受答案的評論:

「你有2種方法可以做。 1)將ViewPager對象設置爲公共靜態,以便您可以訪問任何Fragment。 2)保持你的ViewPager成爲你的FragmentActivity的成員,從你的Fragment發送一個廣播意圖到FragmentActivity,並訪問你的ViewPager對象。 - RRTW 5月28日在'13 2:18「

所以感謝RRTW爲答案,但我想提高它

1)是不是一種選擇片段的目的是爲了重複使用。 ,所以他們需要獨立於活動,將他們與活動聯繫起來,我認爲這是一種不好的做法,即使 - 現在 - 你不會在其他活動中重複使用它。我認爲它需要更多的解釋,getAcitivty()。sendBroadcast()的目的是向用戶系統的所有應用程序發送一個事件,這並不是你想達到的目的,所以從我的角度來看,是使用LoacalBroadcastManager,你可以有一個看看that post瞭解如何使用它。

+0

加上一個用於靜態公共傳呼 –

+0

感謝您的解釋,#1是我認識的一個糟糕的設計(僅適用於耗盡開發時間的項目)。關於#2,正如你所說,它是LocalBroadcast(只在你自己的APP中),我也在我的APP項目中使用它。把它稱爲廣播是我的錯誤。再次感謝你 :-) – RRTW

0

在主只是叫讓你Viewpager公共所以它accessable從其他Java文件(例如,從frag1.java)

MainActivity。Java的:

public static ViewPager pager;

現在,在裏面frag1.java的onclick()函數只是打電話給你mViewPager並設置項目(片段)到要加載任何片段。防爆。如果要加載的下一個片段,然後將其設置爲2

frag1.java

public void onClick(View v) { 

    ViewPager.setCurrentItem(2); 

}