2014-02-09 19 views
11

In meiner kleinen App habe ich ein PageAdapter-> Fragment-> ListView-> ImageView. Auf onImageClick ich will mein Bild in einem anderen Fragmente (Fragment3) angezeigt werden, aber wenn ich ein Bild in meinem Fragment3 lade eine Ausnahmecontextthemewrapper kann nicht in Aktivität umgewandelt werden

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

und Code erhalten, die eine Ausnahme erzeugt. Wenn ich ein Fragment anlege und die ListView hinzufüge alles passierte ok, aber wenn ich ein anderes Fragment (Kind) erstelle und Foto laden möchte, scheitert es.

Code, wie ich ein Kind Fragment erstellen, ohne 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");     
      } 
     }) 

hier ist Photo Loader Thema,

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) { 
     } 
    } 
} 

und Exception

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) 
+0

wo ist dieser Code Aktivität a = (Aktivität) photoToLoad.imageView.getContext(); ? – keshav

Antwort

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

Sie können‘ t nehme eineankann zu einem Activity gegossen werden. Daher die Ausnahme: Sie versuchen, eine Context zu werfen, die tatsächlich eine ContextThemeWrapper zu einer Activity ist.

können Sie ersetzen

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

mit z.B.

photoToLoad.imageView.post(bd); 

eine Runnable auf UI-Thread-Nachrichtenwarteschlange, ähnlich wie ActivityrunOnUiThread() zu schreiben.

+0

Vielen Dank für Ihre Hilfe. – zond

55

Ähnliche Fälle, die ich habe. Kann verwandte Frage sein>Accessing activity from custom button

Ich löse meinen Fall mit diesem Schnipsel.

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

Brilliant. Alles was ich brauchte, um einen ContextThemeWrapper zu Activity zu "casten". –

+0

Großartig! Sollte als Antwort akzeptiert werden. – MHogge

+0

Danke !!! Funktioniert auch mit AppCompatActivity! – Herman

1

Von dem, was ich weiß, wenn eine Ansicht, die in einem Dialog angezeigt wird, ihr Kontext (Zugang von view.getContext()) ist eigentlich eine ThemeContextWrapper Instanz, die wahrscheinlich nicht eine Aktivität ist. Um die Aktivität vom Dialog abzurufen, können Sie getOwnerActivity() verwenden, die die Aktivität zurückgibt, zu der der Dialog gehört.

Verwandte Themen