6

私は自分の でインスタンス化するViewPagerwith twoを持っています。FragmentsonCreateFragmentActivity

private List<Fragment> fragments = new Vector<Fragment>();

fragments.add(Fragment.instantiate(this,Frag_1.class.getName()));
fragments.add(Fragment.instantiate(this,Frag_2.class.getName()));
    this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments);
    vPager = (ViewPager) super.findViewById(R.id.pager);
    vPager.setAdapter(vPagerAdapter);

私の 2 番目には、 -Fragmentを更新するために呼び出すメソッドが内部にあります。ListViewrefreshList()

public class Frag_2 extends Fragment {

    private ListView list;
    private ArrayList<data> data;
    private boolean firstCreation=true;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setRetainInstance(false);
    }   

    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
    }

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

        View view = inflater.inflate(R.layout.layout, container, false);
        list = (ListView) view.findViewById(R.id.lst);
        //this.setRetainInstance(true);
        return view;
    }


    public void refreshList(ArrayList <data> data){
        if(data!=null){
            ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data);
            list.setAdapter(adapter);}
    }
}

私から呼び出されたFragmentActivity

//Something
Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1);
if (fr.getView() != null) {
    fr.refreshList(data);
}

画面の向きを変えるまでは問題なく動作します。私が間違っている場合は修正してください。しかし、何時間も探していたのですが、解決策や適切な説明が見つかりませんFragmentActivityでしFragmentsFragments。今、向きが変わると取得できないため、View取得onCreateしようとするとViewnullFragmentが返され、refreshList()メソッドが呼び出されません。どうすればこれを修正できますか?

4

3 に答える 3

1

私はこの方法で問題を修正しました: FragmentActivity の onCreate で

if(savedInstanceState!=null){
            frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName());
            frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName());
        }
        else{
            frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName());
            frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName());
        }
        fragments.add(frag1);
        fragments.add(frag2);


protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1);
        getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2);
    }

宇宙で最高の解決策ではないかもしれませんが、うまくいくようです...

于 2012-09-12T07:08:22.453 に答える
0

リストを更新したい場合は、次のようにします。

public void setView() {
    Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1);
    fragmentManager.beginTransaction().detach(fr).commit();
    fragmentManager.beginTransaction().attach(fr).commit();
}
于 2012-09-18T13:45:24.283 に答える
-1

動的フラグメントを使用している場合は、最初にテストして、フラグメントの 2 番目のインスタンスが作成されないようにする必要があります。

onCreate()システムがアクティビティを再作成しているかどうかをテストするには、アクティビティに渡された Bundle 引数が であるかどうかを確認します null

以外の場合null、システムはアクティビティを再作成しています。この場合、アクティビティは既存のフラグメントを自動的に再インスタンス化します。

その場合nullは、動的フラグメントを安全にインスタンス化できます。例えば:

public void onCreate(Bundle savedInstanceState) {
  // ...
  if (savedInstanceState != null) {
  FragmentManager fragmentManager = getFragmentManager()
  // Or: FragmentManager fragmentManager = getSupportFragmentManager()
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  ExampleFragment fragment = new ExampleFragment();
  fragmentTransaction.add(R.id.fragment_container, fragment);
  fragmentTransaction.commit();
  }
}

このFragmentクラスは、Activity クラスとほぼ同じ方法でメソッドをサポートしますonSaveInstanceState(Bundle)(メソッドはサポートしません)。onRestoreInstanceState()

  • デフォルトの実装では、ID を持つすべてのフラグメントのビューの状態が保存されます。
  • このメソッドをオーバーライドして、追加のフラグメント状態情報を保存できます。
  • システムが以前に保存された状態からフラグメントを再作成している場合、Bundleその状態を含むへの参照をonCreate()onCreateView()、およびonActivityCreated()メソッドに提供します。それ以外の場合、引数は に設定されnullます。

詳細な情報が必要な場合は、Marakana の Ken Jones による優れたトークをご覧ください。

于 2012-09-12T01:34:49.563 に答える