Intereting Posts
API Android Places: службы Google Play устарели на эмуляторе In-app, сделайте пользовательский интерфейс Google Play прозрачным Как изменение ориентации обрабатывается в очереди сообщений? Как определить, когда приложение Android переходит на задний план и возвращается на передний план … вы объявили эту активность в своем AndroidManifest.xml Предупреждение на EditText Android OpenCV Drawing Hough Lines IabResult: услуга выставления счетов недоступна на устройстве. (Ответ: 3: выставление счетов недоступно) Создание контроллера кнопки «middleman» для гарнитуры на Android Есть ли какие-либо тесты на J2MEPolish, конвертирующие приложение J2ME в Android? Аннотации и приложения AndroidIdSuffix Не удалось установить apk с помощью adb на устройстве, обновленном до Android Lollipop База данных Android заблокирована Удалите приложение Android Wear с реального устройства Android TextureView задает цвет фона и покажет видео позже

Contextthemewrapper не может быть передан в действие

В моем маленьком приложении у меня есть PageAdapter-> Fragment-> ListView-> ImageView. В onImageClick я хочу отображать свое изображение в другом фрагменте (Fragment3), но когда я загружаю изображение в своем Fragment3, получаю исключение

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

И код, который создает исключение. Когда я создаю фрагмент и добавляю ListView, все переданные ok, но когда я создаю другой фрагмент (дочерний элемент) и хочу загрузить Photo, он терпит неудачу.

Код, как я создаю дочерний фрагмент, без 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"); } }) 

Здесь есть фотография 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) { } } } в 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) { } } } 

И исключение

 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) 

Solutions Collecting From Web of "Contextthemewrapper не может быть передан в действие"

 Activity a= (Activity)(photoToLoad.imageView.getContext()); 

Вы не можете предположить, что Context может быть передан в действие. Следовательно, исключение: вы пытаетесь создать Context который на самом деле является ContextThemeWrapper для Activity .

Вы можете заменить

 Activity a= (Activity)(photoToLoad.imageView.getContext()); a.runOnUiThread(bd); 

Например

 photoToLoad.imageView.post(bd); 

Для публикации очереди сообщений с потоком Runnable to UI, аналогично Activity runOnUiThread() .

Аналогичный случай у меня есть. Может быть связанный вопрос> Доступ к активности с помощью настраиваемой кнопки

Я решу свое дело с этим фрагментом.

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

Из того, что я знаю, если вид, который показан в диалоговом окне, его контекст (доступ из view.getContext ()) фактически является экземпляром ThemeContextWrapper, который, вероятно, не является активностью. Чтобы получить активность из диалогового окна, вы можете использовать getOwnerActivity (), который возвращает Activity, к которому принадлежит Dialog.