Contextthemewrapper no se puede transmitir a la actividad
En mi pequeña aplicación tengo un PageAdapter-> Fragment-> ListView-> ImageView. En onImageClick quiero mostrar mi imagen en otro fragmento (Fragmento3), pero cuando carga una imagen en mi Fragmento3 obtener una excepción
public class Fragment3 extends DialogFragment { ImageLoader imageLoader; ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = (ViewGroup) inflater.inflate(R.layout.fragment3_layout, container, false); imageView = (ImageView) view.findViewById(R.id.imageViewFrag3); detail = (TextView) view.findViewById(R.id.textViewFrag3); imageUrl = getArguments().getString("URL"); imageView.setTag(imageUrl); activity=this; imageLoader = new ImageLoader(activity.getActivity().getApplicationContext()); imageLoader.DisplayImage(imageUrl, (Activity) activity.getActivity(), imageView); return view; } ... }
Y el código que crea una excepción. Cuando creo un fragmento y agrego el ListView todo aprobado bien, pero cuando creo otro fragmento (niño) y quiero cargar la foto falla.
- Android - No se puede usar popup en Fragmento
- Cuándo utilizar los métodos attach and detach de FragmentTransaction
- Guardar / Restaurar fragmentos de estado android
- Sustitución de fragmentos en una actividad que no llama aAttach, onCreate, onCreateView, etc.
- Cómo obtener el onWindowFocusChanged en Fragment?
Código, cómo crear un fragmento secundario, sin PageAdapter
holder.imgViewImage = (ImageView) vi.findViewById(R.id.imageView01); holder.imgViewImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { android.support.v4.app.FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); Fragment3 newFragment = Fragment3.newInstance(); Bundle bundle=new Bundle(); bundle.putString("URL", holder.imgViewImage.getTag().toString()); newFragment.setArguments(bundle); newFragment.show( ft, "dialog"); Log.i("!!!", "Click on image"); } })
Aquí está Photo Loader Thread,
class PhotosLoader extends Thread { public void run() { try { while(true) { if(photosQueue.photosToLoad.size()==0) synchronized(photosQueue.photosToLoad){ photosQueue.photosToLoad.wait(); } if(photosQueue.photosToLoad.size()!=0) { PhotoToLoad photoToLoad; synchronized(photosQueue.photosToLoad){ photoToLoad=photosQueue.photosToLoad.pop(); } Bitmap bmp=getBitmap(photoToLoad.url); cache.put(photoToLoad.url, bmp); if(((String)photoToLoad.imageView.getTag()).equals(photoToLoad.url)){ BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView); //Exception contextthemewrapper cannot be cast to activity !!! Activity a= (Activity)(photoToLoad.imageView.getContext()); a.runOnUiThread(bd); } } if(Thread.interrupted()) break; } } catch (InterruptedException e) { } } }
Y Excepción
02-09 08:22:57.510: E/AndroidRuntime(1449): FATAL EXCEPTION: Thread-114 02-09 08:22:57.510: E/AndroidRuntime(1449): java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity 02-09 08:22:57.510: E/AndroidRuntime(1449): at com.example.ids.ImageLoader$PhotosLoader.run(ImageLoader.java:171)
- Mis fragmentos en la pestaña viewpager no se actualizan
- Android Master / Detalle de flujo dentro de ViewPager
- Google google maps con marcador dentro del fragmento
- Onclicklistner no funciona en el listview de fragmentos
- Barra de Acción Sherlock SearchView no se expande al hacer clic
- ¿Cuándo se debe llamar a RemoveStickyEvent (...)?
- Fragmento reemplazado aún visible
- Añadir pestaña dentro de Fragmento ¿En Android?
Activity a= (Activity)(photoToLoad.imageView.getContext());
No puede asumir que un Context
pueda convertir en una Activity
. De ahí la excepción: estás intentando emitir un Context
que sea de hecho un ContextThemeWrapper
a una Activity
.
Puedes reemplazar
Activity a= (Activity)(photoToLoad.imageView.getContext()); a.runOnUiThread(bd);
Con, por ejemplo
photoToLoad.imageView.post(bd);
Para publicar una cola de mensajes Runnable
to UI thread, similar a Activity
runOnUiThread()
.
Caso similar que tengo. Puede ser una pregunta relacionada> Acceder a la actividad desde el botón personalizado
Resuelvo mi caso con este fragmento.
private static Activity scanForActivity(Context cont) { if (cont == null) return null; else if (cont instanceof Activity) return (Activity)cont; else if (cont instanceof ContextWrapper) return scanForActivity(((ContextWrapper)cont).getBaseContext()); return null; }
Por lo que sé, si una vista que se muestra en un cuadro de diálogo, su contexto (acceso de view.getContext ()) es en realidad una instancia ThemeContextWrapper, que probablemente no es una actividad. Para obtener la actividad desde el cuadro de diálogo, puede utilizar getOwnerActivity (), que devuelve la actividad a la que pertenece el cuadro de diálogo.
- NoSuchMethodError cuando uso android.widget.RelativeLayout.setBackground
- Utilizar two pendingIntent en una vista en Appwidget