1

ViewPager+FragmentStatePagerAdapter を使用したホスト アクティビティがあり、これにより一連のフラグメント (同じ ItemFragment クラスの異なるインスタンス) をスワイプし、各フラグメントを設定するためのデータをネットワークから取得します。

ここで、スワイプしながら、現在のフラグメントからのプロパティでアクション バーのタイトルを更新したいので、OnPageChangeListener/onPageSelected を使用してその作業を行います。

...
@Override
public void onPageSelected(int position) {
    MyFragment currentFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.view_pager);
    getSupportActionBar().setTitle(currentFragment.propertyIWantToUseAsTitle);
}
...

ここでいくつかの疑問があります:

  • 実際の現在のフラグメントを取得していますか? FragmentStatePageAdapter は各フラグメントにタグを設定しないため、ViewGroup コンテナを使用する以外に現在のフラグメントを取得する方法がわかりません
  • onPageSelected が呼び出されると、追加されたフラグメントは、npe を引き起こすアクション バーのタイトルを設定するために必要なデータを取得している可能性があります。

上記のシナリオでアクション バーのタイトルを更新するロジックを維持するのに最適な場所はどこですか?

ps。必要なデータが利用可能になったときに ab を更新するコードを MyFragment に追加する混合アプローチを試しました。問題は、フラグメントの読み込みが完了すると、アクション バーのタイトルが変化する前に読み込まれるフラグメントがほとんどないことです。その結果、ab タイトルは数ページ先のフラグメントからのランダムなタイトルになります。

助けてくれてありがとう!

4

2 に答える 2

3

ActionBarタイトルは自分で設定しましたFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle extras = getActivity().getIntent().getExtras();
    type = (String) extras.getString("type");
}// end method

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {
        Activity activity =  getActivity();
        ActionBar actionBar = activity.getActionBar();

        if (type.equals("one")) {
            actionBar.setTitle(R.string.one);
        }
        if (type.equals("two")) {
            actionBar.setTitle(R.string.two);
        }
        if (type.equals("three")) {
            actionBar.setTitle(R.string.three);
        }
    } 
}//end method   
于 2013-05-09T11:53:33.360 に答える
0

AFAICT、新しいページが「現在」に設定されているときPagerAdapterに呼び出される必要があります。setPrimaryItem()そのメソッドをオーバーライドし、スーパークラスにチェーンしてから、Object(最初のパラメーターを にsetPrimaryItem()) を適切なFragmentクラスにキャストして、それで何かを行うことができます。その「何か」は、データ メンバPagerAdapter(例: currentPage) に格納し、後で取得できるように getter を追加することができます。

于 2013-05-09T11:31:05.700 に答える