1

我正在實現一個照片查看器,允許用戶以全屏模式從縮略圖查看照片。 我目前的做法是在WindowManager中添加充氣視圖。在充氣的視圖中,有一個允許用戶切換圖像的ViewPager。而我得到的錯誤「java.lang.IllegalArgumentException異常:沒有查看發現ID」ViewPager對WindowManager添加的視圖獲取「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{ 
/* 
.... 
*/ 


@Override 
public 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); 
     } 
    }); 
} 



@Override 
public int getSize() { 
    return listPhotos == null ? 0 : listPhotos.size(); 
} 

@Override 
public Photo getPhotoItem(int position) { 
    return listPhotos.get(position); 
} 
} 

,這裏是視圖的佈局contaning 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: main 
01-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) 

這個問題的任何解決方案?非常感謝你們!

+0

發佈有問題的logcat結果 –

+0

@ρяσѕρєяK您能否看看更新後的問題 –

回答

2

我認爲這是因爲您是通過WindowManager直接添加ViewPager。這樣做意味着它不會成爲普通活動視圖層次結構的一部分(即裝飾視圖的子項)。 Activity.findViewById(使用裝飾視圖遍歷視圖作爲根)將無法找到ViewPager。

ViewPager適配器創建碎片並使用ViewPager(id)作爲容器。在創建Fragment時,Android會通過Activity.findViewById查找此容器,但無法找到它並引發此異常。

這聽起來像你想要某種類型的視圖出現在縮略圖網格的頂部。你可以使用一個properly styled對話框(片段)來實現這一點。實施這一觀點的具體細節最好作爲一個單獨的問題提出。

+0

我也發現後,挖掘到Android的源。謝謝。 –

+0

嗨@antonyt,我只是改變了我的實現給你的建議,但我有一個非常有線的問題。你可以看看:http://stackoverflow.com/questions/27980543/viewpager-on-dialogfragment-java-lang-illegalstateexception-no-activity –

0

我想你只是想念一個小小的錯誤。而不是這個。

viewPager =(ViewPager)containerView.findViewById(R.id.photo_viewer_view_pager);

viewPager =(ViewPager)containerView.findViewById(R.id.photo_viewer_viewpager);

我認爲你使用viewpager的錯誤ID。希望它能解決你的問題。

+0

抱歉,這是我在StackOverFlow上的拼寫錯誤。你能看看更新的問題嗎? –

0

我認爲你在findviewById()之後在setParenActivity()中膨脹視圖,這就是它沒有得到視圖的原因。

+0

不,我根本沒有使用findViewById。 –

相關問題