ViewPager + FragmentPagerAdapter dentro de un DialogFragment obtiene " IllegalArgumentException: No se encontró ninguna vista…"


Estoy tratando de mostrar un FragmentDialog ( creado y mostrado como un diálogo NO agregado como contenido en una jerarquía de vistas) donde hay un ViewPager cuyo contenido es dado por un FragmentPagerAdapter (proporciona Fragmentos que consisten en una imagen).

El código funciona perfectamente cuando se muestra ViewPager + FragmentPagerAdapter desde una FragmentActivity, pero se obtiene la siguiente excepción cuando se hace desde un FragmentDialog:

" IllegalArgumentException: No se ha encontrado ninguna vista para id 0x7f040077 para fragment SimpleFragment..."

Aquí está mi código:

Una SherlockFragmentActivity con un botón para crear y mostrar el diálogo.

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

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

Este es el muy simple MyFragmentPagerAdapter, Pongo solo el método getItem (), y NullPointer comprueba:

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

}

Y finalmente 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;
    }

}

Más información, si el contenido pasado al adaptador ( una matriz int con 3 int) tiene longitud cero, entonces el adaptador no intenta crear ninguna Fragment so dialogs appears correctly but empty (as expected). La excepción se lanza a SimpleFragment.onCreateView() en el momento de inflar. El id al que se hace referencia en la excepción (como no encontrado) corresponde al id de ViewPager, con está definido correctamente en R. layout.simple_fragment.

También he intentado construir el Diálogo con un AlertDialog.constructor y también directamente con Dialog() contructor, pero obtener el mismo comportamiento.

Author: Fllo, 2012-11-11

1 answers

Prueba esto:

En la clase AchGalleryDialog

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

En lugar de

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

Debido a esto:

Http://developer.android.com/about/versions/android-4.2.html#NestedFragments

Espero que esto ayude!

 72
Author: 70sCommander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-03 13:21:12