
我正在实现一个照片查看器,允许用户从缩略图以全屏模式查看照片.
我目前的方法是向WindowManager添加膨胀的视图.在充气视图中,有一个允许用户切换图像的VIEwPager.我收到错误“java.lang.IllegalArgumentException:找不到ID的视图”
以下是详细信息(视图在setActivity方法中为openPhoto方法中的vIEwPager设置适配器):
public class PhotoVIEwer {private static final String TAG = "PhotoVIEwer";private Activity parentActivity;private FrameLayouttouchListener windowVIEw;private relativeLayout containerVIEw;private WindowManager.LayoutParams windowLayoutParams;private PhotoVIEwerAdapter photoAdapter;private VIEwPager vIEwPager;public PhotoVIEwer() { super();}private static volatile PhotoVIEwer Instance = null;/*inflate vIEw here*/public voID setParentActivity(Activity activity) { if (parentActivity == activity) { return; } parentActivity = activity; windowVIEw = new FrameLayout(activity); containerVIEw = (relativeLayout) LayoutInflater.from(activity) .inflate(R.layout.fragment_photo_vIEwer, null); containerVIEw.setFocusable(false); windowVIEw.addVIEw(containerVIEw); windowLayoutParams = new WindowManager.LayoutParams(); windowLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; windowLayoutParams.format = PixelFormat.TRANSLUCENT; windowLayoutParams.wIDth = WindowManager.LayoutParams.MATCH_PARENT; windowLayoutParams.gravity = Gravity.top; windowLayoutParams.type = WindowManager.LayoutParams.LAST_APPliCATION_WINDOW; windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; vIEwPager = (VIEwPager) containerVIEw.findVIEwByID(R.ID.photo_vIEwer_vIEw_pager);}/*set data and adapter for vIEwPager here*/public voID openPhoto (PhotoSupporter photoSupporter, int position){ try { if (windowVIEw.getParent() != null) { WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); wm.removeVIEw(windowVIEw); } } catch (Exception e) { Log.v(TAG, e.getMessage()); } WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); wm.addVIEw(windowVIEw, windowLayoutParams); this.photoSupporter = photoSupporter; photoAdapter = new PhotoVIEwerAdapter(((FragmentActivity) parentActivity).getSupportFragmentManager(), photoSupporter); vIEwPager.storeAdapter(photoAdapter); vIEwPager.setCurrentItem(position);}/** * Larger PhotoVIEw * * * **/public static class PhotoVIEwerAdapter extends FragmentStatePagerAdapter { private PhotoSupporter photoSupporter; public PhotoVIEwerAdapter(FragmentManager fm, PhotoSupporter photoSupporter) { super(fm); this.photoSupporter = photoSupporter; } @OverrIDe public Fragment getItem(int position) { String src = null; // get photo src return PhotoVIEwFragment.newInstance(src); } @OverrIDe public int getCount() { Log.w(TAG, "size in adapter: " + photoSupporter.getSize()); return photoSupporter.getSize(); }}public static class PhotoVIEwFragment extends Fragment { private String imagePath; public PhotoVIEwFragment() { } public static PhotoVIEwFragment newInstance(String imagePath) { PhotoVIEwFragment prevIEwFragment = new PhotoVIEwFragment(); // put data Bundle bundle = new Bundle(); bundle.putString("IMAGE_PATH", imagePath); prevIEwFragment.setArguments(bundle); return prevIEwFragment; } /** * When creating, retrIEve this instance's number from its arguments. */ @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imagePath = getArguments() != null ? getArguments().getString( "IMAGE_PATH") : ""; Log.d("onCreate", imagePath); } /** * The Fragment's UI is just a simple text vIEw showing its instance * number. */ @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { ImageVIEw imageVIEw = new ImageVIEw(getActivity()); linearLayout.LayoutParams lp = new linearLayout.LayoutParams (linearLayout.LayoutParams.MATCH_PARENT, linearLayout.LayoutParams.MATCH_PARENT); imageVIEw.setLayoutParams(lp); // set image by Picasso Picasso picassoInstance = Picasso.with(getActivity()); picassoInstance.setIndicatorsEnabled(true); picassoInstance.load(new file(imagePath)) .error(R.drawable.ic_picture_placeholder_light2) .fit() .centerInsIDe() .into(imageVIEw); return imageVIEw; }}}这里是调用PhotoVIEwer方法的地方:
public class PhotosFragment extends Fragment implements PhotoSupporter{/*....*/@OverrIDepublic voID onVIEwCreated(VIEw vIEw, Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); showLoading(); photosGrIDvIEw = (GrIDVIEw) findVIEwByID(R.ID.group_photos_grIDvIEw); if (ListPhotos == null) { ListPhotos = new ArrayList<Photo>(); } photolistadapter = new Photolistadapter(ListPhotos, getActivity()); photosGrIDvIEw.setAdapter(photolistadapter); photosGrIDvIEw.setonItemClickListener(new OnItemClickListener() { @OverrIDe public voID onItemClick(AdapterVIEw<?> parent, VIEw vIEw, int position, long ID) { PhotoVIEwer.getInstance().setParentActivity(getActivity()); PhotoVIEwer.getInstance().openPhoto(PhotosFragment.this, position); } });}@OverrIDepublic int getSize() { return ListPhotos == null ? 0 : ListPhotos.size();}@OverrIDepublic Photo getPhotoItem(int position) { return ListPhotos.get(position);}}这里是vIEwPager视图的布局:
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"androID:layout_wIDth="match_parent"androID:layout_height="wrap_content"androID:orIEntation="vertical" ><androID.support.v4.vIEw.VIEwPager androID:ID="@+ID/photo_vIEwer_vIEw_pager" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:background="@color/dark_background" ></androID.support.v4.vIEw.VIEwPager>这是logcat:
01-14 14:12:55.271: E/AndroIDRuntime(11435): FATAL EXCEPTION: main01-14 14:12:55.271: E/AndroIDRuntime(11435): java.lang.IllegalArgumentException: No vIEw found for ID 0x7f0b00df (com.newsFeed.androID:ID/photo_vIEwer_vIEw_pager) for fragment PhotoVIEwFragment{537b5ec4 #8 ID=0x7f0b00df}01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:903)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.ja va:1088)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentSta tePagerAdapter.java:163)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.vIEw.VIEwPager.populate(VIEwPager.java:1064)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.vIEw.VIEwPager.populate(VIEwPager.java:911)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.support.v4.vIEw.VIEwPager.onMeasure(VIEwPager.java:1432)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEw.measure(VIEw.java:15172)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.Widget.relativeLayout.measureChildHorizontal(relativeLayout.java:617)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.Widget.relativeLayout.onMeasure(relativeLayout.java:399)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEw.measure(VIEw.java:15172)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEwGroup.measureChilDWithmargins(VIEwGroup.java:4814)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.Widget.FrameLayout.onMeasure(FrameLayout.java:310)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEw.measure(VIEw.java:15172)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEwRootImpl.performMeasure(VIEwRootImpl.java:1848)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEwRootImpl.measureHIErarchy(VIEwRootImpl.java:1100)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEwRootImpl.performTraversals(VIEwRootImpl.java:1273)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEwRootImpl.doTraversal(VIEwRootImpl.java:998)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.VIEwRootImpl$TraversalRunnable.run(VIEwRootImpl.java:4212)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.Choreographer$CallbackRecord.run(Choreographer.java:725)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.Choreographer.doCallbacks(Choreographer.java:555)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.Choreographer.doFrame(Choreographer.java:525)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.vIEw.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:711)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.os.Handler.handleCallback(Handler.java:615)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.os.Handler.dispatchMessage(Handler.java:92)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.os.Looper.loop(Looper.java:137)01-14 14:12:55.271: E/AndroIDRuntime(11435): at androID.app.ActivityThread.main(ActivityThread.java:4745)01-14 14:12:55.271: E/AndroIDRuntime(11435): at java.lang.reflect.Method.invokeNative(Native Method)01-14 14:12:55.271: E/AndroIDRuntime(11435): at java.lang.reflect.Method.invoke(Method.java:511)01-14 14:12:55.271: E/AndroIDRuntime(11435): at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)01-14 14:12:55.271: E/AndroIDRuntime(11435): at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:553)01-14 14:12:55.271: E/AndroIDRuntime(11435): at dalvik.system.NativeStart.main(Native Method)解决这个问题的任何方法?非常感谢你们!
解决方法:
我想这是因为你是通过WindowManager直接添加你的VIEwPager.这样做意味着它不会成为正常的Activity视图层次结构的一部分(即装饰视图的子级). Activity.findVIEwByID(使用装饰视图作为根遍历视图)将无法找到您的VIEwPager.
VIEwPager适配器创建Fragments并使用VIEwPager(ID)作为容器.在创建Fragment时,AndroID会通过Activity.findVIEwByID查找此容器,但无法找到它,因此抛出此异常.
听起来你想要一些出现在缩略图网格顶部的视图.您可以使用properly styled对话框(片段)来实现此目的.实施该观点的具体细节最好作为一个单独的问题提出.
总结以上是内存溢出为你收集整理的android – ViewPager在WindowManager添加的视图中获取“java.lang.IllegalArgumentException:找不到id的视图”全部内容,希望文章能够帮你解决android – ViewPager在WindowManager添加的视图中获取“java.lang.IllegalArgumentException:找不到id的视图”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)