2016-12-29 7 views
1

私は断片を使って実装した3つのタブを持っています。私がTab2にスワイプするたびに、同じコードを実行したい、つまり、毎回Tab2のコンテンツを再読み込みしたいとしましょう。これの背後にある理由は、Tab1では、ユーザーはtab2に表示される内容を変更できるいくつかのオプションを持っているからです。したがって、彼がTab2からTab1に、そしてTab2に戻るたびに... Tab2のいくつかの変更が期待できます。 私はこのコードをonCreateView()に入れようとしました...しかし、それはonCreateView()が冒頭に一度だけ呼び出されており、決してもう一度呼び出されないことが私のアプリに表示されます。私は別の方法はonPageClickListenerを使用することであることを学びました。今、私の疑問を語る。 MainActivityでViewPagerクラスを実装してタブを作成しました。だから私のonPageListenerMainActivity.javaであり、Tab2.javaクラスではありません。 だから私はTab2.xml ....にtextViewを作ると仮定し、Tab2にスワイプするとには、を制御することを期待してコードを書く。しかし、このコードはonPageListenerのTab2のためのものだとアプリはどのように知っていますか? onPageListenerはすべてのタブ用ですので、このコードのタブの指定方法は?onPageChangeListener()はどのページのコードを知っていますか?

答えて

1

Interfaceを作成し、ViewPagerFragmentsのすべてを実装する方法があります。ような何か:

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

このようにして、アクティビティはどのフラグメントが何をしているかを知る必要はありません。また、フォーカスしたときに実行される各フラグメントに任意のコードを追加することもできます。

+0

したがって、onPageListenerにフラグメントの実際のコードが含まれていないと思われる場合、その主な目的は何ですか?どのような種類のコードが含まれているはずですか? – Nirvan

+0

実際には、あなたが望むコードを置くことができます。それは結局あなたのアプリです!私は、リスナーのコードは最小限に抑えられ、汎用/抽象化されていることをお勧めします。あなたはあなたのフラグメントの1つを変更するたびにリスナーコードを編集したくないです。これは、フラグメントの機能に関係なく機能し続けるだけです。 – Jahnold

+0

特定のフラグメントに固有のメインコードはどこにありますか? onCreateView()? onResume()? onPageListener()? – Nirvan

関連する問題