2016-12-29 109 views
1

我有3個使用片段實現的選項卡。比方說,每次滑動到Tab2時,我都希望執行相同的代碼,也就是說,我希望每次都重新加載Tab2內容。這背後的原因是,在Tab1中,用戶有一些選項可以用來更改要在tab2中顯示的內容。因此,每當他從Tab2到Tab1,然後回到Tab2時... Tab2中的一些變化是可以預期的。 我試着把這段代碼放到onCreateView() ......但是它出現在我的應用程序中,onCreateView()只在開始時被調用一次,永遠不會再被調用。我瞭解到另一種方式是使用onPageClickListener。現在我懷疑了。我在MainActivity中實現了ViewPager類來創建我的選項卡。所以我的onPageListener也出現在MainActivity.java而不是在Tab2.java類。 因此,假設我在Tab2.xml ....中編寫了textView ....我在onPageListener中編寫代碼,期望它在Tab2中控制textView,當我滑動到Tab2時。但是,該應用程序如何知道onPageListener中的代碼是用於Tab2的? onPageListener適用於所有選項卡,因此如何指定此代碼適用於哪個選項卡?onPageChangeListener()如何知道代碼的用途?

回答

1

執行此操作的一種方法是創建一個Interface,其中ViewPager中的所有Fragments均實現。喜歡的東西:

public interface TabSelectedListener { 

    void onSelected(); 
} 

那麼你有每個片的實現:

public class TabTwoFragment extends Fragment implements TabSelectedListener { 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 

     // instantiate any member classes 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

     // inflate the view and bind any View items (TextViews, etc) 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 

     // do any setup of your view to get it into it's initial state 
    } 

    @Override 
    void onSelected() { 

     // any code which you want to run when the Fragment is selected in the ViewPager 
     // note that this is the method we created in the TabSelectedListener interface 
    } 
} 

然後在你的pageChangeListener你需要從適配器獲得所選擇的片段,並將其投放到您的界面讓你可以調用該方法:

pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

    @Override 
    public void onPageSelected(int position) { 

     TabSelectedListener listener = (TabSelectedListener) adapter.getItem(position); 
     listener.onSelected(); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) {} 
}); 

這樣你的Activity不必知道哪個片段做了什麼。你也可以添加你想要的任何代碼給每個片段,當它們被聚焦時它們將被運行。

+0

因此,如果onPageListener不應該包含片段的實際代碼,那麼它的主要用途是什麼?它應該包含什麼類型的代碼? – Nirvan

+0

實際上,您可以在其中放入任何代碼 - 畢竟它是您的應用程序!我建議儘管聽衆中的代碼保持在最低限度,並且是通用的/抽象的。每次對某個片段進行更改時,您不希望編輯偵聽器代碼。無論片段的功能如何,它都應該繼續工作。 – Jahnold

+0

那麼特定片段的主代碼應該在哪裏去? onCreateView()?的onResume()? onPageListener()? – Nirvan

相關問題