1

私のアプリでは、スワイプ ビュー レイアウトで 3 つのフラグメントを表示している ViewPager を取得しました。アクティビティが再作成された場合 (たとえば、ランドスケープ モードに移行した場合)、フラグメントへの参照を取得できなくなります。

これは私のアダプターです

public class TabsPagerAdapter extends FragmentStatePagerAdapter{
    public static final String FRAGMENT_MAP = "fragmentMap";
    private SparseArray<MyFragment> myFragmentMap = new SparseArray<MyFragment>();

    public TabsPagerAdapter(FragmentManager fm){
        super(fm);
    }

    @Override
    public Fragment getItem(int arg0) {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
            String nameOfTab = actionBar.getTabAt(arg0).getText().toString();
            ArrayList<VideoBookmark> listOfFragment = myBookmarkManager.getList(nameOfTab);
        args.putParcelableArrayList(MyFragment.ARG_LIST, listOfFragment);
        fragment.setArguments(args);
        myFragmentMap.put(arg0, fragment);

        return fragment;
    }

    @Override
    //return mytabs.size()???
    public int getCount() {
        return NUM_OF_TABS;
    }

    public void destroyItem (ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        myFragmentMap.remove(position);
    }

    public Fragment getFragment(int key) {
        return myFragmentMap.get(key);
    }

    public SparseArray<MyFragment> getFragmentMap(){
        return myFragmentMap;
    }

    public void setNewFragmentMap(SparseArray<MyFragment> newMap){
        myFragmentMap = newMap;
    }

}

この行でヌルポインタ例外が発生します

//get current fragment
    int index = myViewPager.getCurrentItem();
    Fragment fragment = myTabsPagerAdapter.getFragment(index);

    EditText title = (EditText) fragment.getView().findViewById(R.id.new_title);

これは、getItem メソッドが呼び出されていないために発生していることを確認したので、アダプターが何らかの方法で古いフラグメントを再利用していると思いますが、このフラグメント キャッシュにアクセスして古いフラグメントを取得し、findViewById メソッドを使用できるようにするにはどうすればよいですか? ありがとうございました!

4

2 に答える 2

0

getFragmentManager.findFragmentByTag() // <<-- フラグメントを動的に管理している場合 getFragmentManager.findFragmentById() // <<-- レイアウト ファイルで <fragment> を使用している場合。

于 2013-08-26T21:04:12.823 に答える
0

これについてはまだわかりませんがinstantiateItem(viewpager, position)、指定された位置でフラグメントを取得する呼び出しを解決しました。正しければ、このメソッドは指定された位置にフラグメントが存在する場合はフラグメントを返し、そうでない場合は別のフラグメントを作成します(呼び出していると思いますgetItem()

于 2013-08-27T09:17:59.673 に答える