在我的小应用程序中,我有一个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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
和创建异常的代码.当我创建一个片段并添加ListView时,所有传递确定,但是当我创建另一个片段(子)并想要加载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");
}
})
Run Code Online (Sandbox Code Playgroud)
这是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) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
和例外
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)
Run Code Online (Sandbox Code Playgroud)
kik*_*kea 80
我有类似的情况.可能是相关问题> 从自定义按钮访问活动
我用这个片段解决了我的问题.
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;
}
Run Code Online (Sandbox Code Playgroud)
laa*_*lto 14
Activity a= (Activity)(photoToLoad.imageView.getContext());
Run Code Online (Sandbox Code Playgroud)
你不能假设一个Context可以被铸造成一个Activity.因此,异常:您正在尝试蒙上了Context那其实是一个ContextThemeWrapper到Activity.
你可以替换
Activity a= (Activity)(photoToLoad.imageView.getContext());
a.runOnUiThread(bd);
Run Code Online (Sandbox Code Playgroud)
用例如
photoToLoad.imageView.post(bd);
Run Code Online (Sandbox Code Playgroud)
发布一个Runnable到UI线程消息队列,类似于Activity runOnUiThread().
据我所知,如果一个View显示在Dialog中,它的上下文(从view.getContext()访问)实际上是一个ThemeContextWrapper实例,它可能不是一个Activity。要从 Dialog 获取 Activity,可以使用 getOwnerActivity(),它返回 Dialog 所属的 Activity。
| 归档时间: |
|
| 查看次数: |
16616 次 |
| 最近记录: |