web-dev-qa-db-ja.com

DialogFragment内のViewPager + FragmentPagerAdapterが「IllegalArgumentException:No view found ...」を取得する

FragmentPagerAdapterによってコンテンツが指定されているViewPagerが存在する(イメージで構成されるフラグメントを提供する)FragmentDialog(ビュー階層のコンテンツとして追加されていないダイアログとして作成および表示)を表示しようとしています。

コードは、FragmentActivityからViewPager + FragmentPagerAdapterを表示するときに完璧に機能しますが、FragmentDialogから実行すると、次の例外が発生します。

「IllegalArgumentException:フラグメントSimpleFragmentのID 0x7f040077のビューが見つかりません...」

これが私のコードです:

ダイアログを作成して表示するためのボタンを備えたSherlockFragmentActivity。

public class BorrameActivity extends SherlockFragmentActivity{
    @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.one_act);

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View arg0) {
            showTheDialog();

        }});
   }

   private void showTheDialog(){
       AchGalleryDialog newFragment = AchGalleryDialog.newInstance(achs);
       newFragment.show(getSupportFragmentManager(), "dialog");
   }

FragmentDialog:

public class AchGalleryDialog extends DialogFragment{
    public AchGalleryDialog(){  
}

    public static AchGalleryDialog newInstance(){       
        AchGalleryDialog f = new AchGalleryDialog();
        return f;       
    }

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

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

        View view = inflater.inflate(R.layout.dialog_user_result, container);
        getDialog().setTitle("Hola tronco");

        //content to show in the fragments
        int[] images = new int[]{R.drawable.d1, R.drawable.d2, R.drawable.d3};

        ViewPager pager = (ViewPager) view.findViewById(R.id.pager);
        MyFragmentAdapter adapter = new MyFragmentAdapter(getFragmentManager(),images);  
        pager.setAdapter(adapter);

        return view;
    }
}

これは非常に単純なMyFragmentPagerAdapterであり、getItem()メソッドのみを配置し、nullPointerは次のチェックを行います。

@Override
public Fragment getItem(int position) {
    return MySimpleFragment.newInstance(images[position]); 

}

そして最後にSimpleFragment:

public class SimpleFragment extends Fragment{
    int id;
    public static SimpleAchFragment newInstance(int imgId){
        SimpleFragment f = new SimpleFragment();
        Bundle args = new Bundle();
        args.putLong(ID_BUNDLE, imgId);
        f.setArguments(args);

        return f;
    }

    public SimpleAchFragment(){
    }

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

        this.id = getArguments() != null ? getArguments().getInt(ID_BUNDLE) : 0;    
    }

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

    // Inflate the layout for this fragment
        View v =  inflater.inflate(R.layout.simple_fragment, container, false);
        FragmentActivity mAct = getActivity();

        ImageView img = (ImageView) v.findViewById(R.id.image);
        img.setImageDrawable(mAct.getResources().getDrawable(id));

        return v;
    }

}

詳細については、アダプターに渡されるコンテンツ(3つの整数を持つint配列)の長さがゼロの場合、アダプターはフラグメントを作成しようとしないため、ダイアログは正しく表示されますが(期待どおり)空です。例外は、インフレート時にSimpleFragment.onCreateView()でスローされます。例外で参照されている(見つからない)IDはViewPagerのIDに対応し、R.layout.simple_fragmentで適切に定義されています。

AlertDialog.builderを使用して、またDialog()コンストラクタを使用して直接Dialogを構築することも試みましたが、同じ動作が得られます。

36
juanmeanwhile

これを試して:

クラス内AchGalleryDialog

MyFragmentAdapter adapter = new MyFragmentAdapter(getChildFragmentManager(),images);

の代わりに

MyFragmentAdapter adapter = new MyFragmentAdapter(getFragmentManager(),images); 

このため:

http://developer.Android.com/about/versions/Android-4.2.html#NestedFragments

これが役立つことを願っています!

82
70sCommander