web-dev-qa-db-fra.com

ViewPager + FragmentPagerAdapter à l'intérieur d'un DialogFragment obtient "IllegalArgumentException: Aucune vue trouvée ..."

J'essaie d'afficher un FragmentDialog (créé et affiché comme une boîte de dialogue NON ajoutée en tant que contenu dans une hiérarchie de vues) où il y a un ViewPager dont le contenu est donné par un FragmentPagerAdapter (fournit des fragments constitués d'une image).

Le code fonctionne parfaitement lors de l'affichage de ViewPager + FragmentPagerAdapter à partir d'un FragmentActivity, mais obtenez l'exception suivante lorsque vous le faites à partir d'un FragmentDialog:

"IllegalArgumentException: aucune vue trouvée pour l'ID 0x7f040077 pour le fragment SimpleFragment ..."

Voici mon code:

Une SherlockFragmentActivity avec un bouton pour créer et afficher la boîte de dialogue.

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

Le 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;
    }
}

Ceci est le très simple MyFragmentPagerAdapter, je mets uniquement la méthode getItem () et vérifie nullPointer:

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

}

Et enfin 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;
    }

}

Plus d'informations, si le contenu transmis à l'adaptateur (un tableau int de 3 pouces) a une longueur nulle, l'adaptateur n'essaie pas de créer de fragment afin que les boîtes de dialogue apparaissent correctement mais vides (comme prévu). L'exception est levée sur SimpleFragment.onCreateView () au moment du gonflage. L'ID référencé dans l'exception (comme introuvable) correspond à l'ID de ViewPager, avec est correctement défini dans R.layout.simple_fragment.

J'ai aussi essayé de construire la boîte de dialogue avec un AlertDialog.builder et aussi directement avec le constructeur Dialog (), mais j'obtiens le même comportement.

36
juanmeanwhile

Essaye ça:

En classe AchGalleryDialog

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

au lieu de

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

À cause de ce:

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

J'espère que cela vous aidera!

82
70sCommander