android - fragments - ViewPager+FragmentPagerAdapter dentro de un DialogFragment obtiene "IllegalArgumentException: No se encontrĂ³ vista..."
fragments viewpager example (1)
Estoy intentando 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 está dado por un FragmentPagerAdapter (proporciona Fragmentos que consisten en una imagen).
El código funciona perfectamente al mostrar ViewPager + FragmentPagerAdapter desde una FragmentActivity, pero obtiene la siguiente excepción cuando lo hace desde un FragmentDialog:
"IllegalArgumentException: no se ha encontrado la vista para id 0x7f040077 para el fragmento SimpleFragment ..."
Aquí está mi código:
Un 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, puse solo el método getItem () y las comprobaciones nullPointer:
@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 ints) tiene longitud cero, entonces el adaptador no intenta crear ningún Fragmento para que los cuadros de diálogo aparezcan correctamente pero vacíos (como se esperaba). La excepción se produce en SimpleFragment.onCreateView () en el momento de inflar. La ID a la que se hace referencia en la excepción (como no encontrada) corresponde a la id de ViewPager, con está definida correctamente en R.layout.simple_fragment.
También intenté construir el Diálogo con AlertDialog.builder y también directamente con el contructor Dialog (), pero obtuve el mismo comportamiento.
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!