1

사용자가 미리보기에서 전체 화면 모드로 사진을 볼 수있는 사진 뷰어를 구현 중입니다. 현재 내 접근 방식은 WindowManager에 비정상적인보기를 추가하고 있습니다. 팽창 된보기에는 사용자 전환 이미지를 허용하는 ViewPager이 있습니다. 그리고 오류 "java.lang.IllegalArgumentException가를 : 없음보기가 id를 찾을 수 없습니다"가지고 여기ViewManager가 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; 
    } 

} 


} 

뷰의 레이아웃이 contaning 여기에 viewPager

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

과 : 여기 PhotoViewer의 메소드가 호출되는 경우입니다

<?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> 
,691,363

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) 

이 문제에 대한 모든 솔루션 : 여기에210

는 로그 캣입니까? 정말 고마워요!

+0

게시자 : –

+0

@ ρяσѕρєяK 업데이트 된 질문 –

답변

2

이것은 WindowManager를 통해 직접 ViewPager를 추가하기 때문입니다. 이렇게하면 일반 활동보기 계층 구조 (즉, 데코보기의 하위)에 속하지 않습니다. Activity.findViewById (장식보기를 루트로 사용하여보기를 탐색 함)는 ViewPager를 찾을 수 없습니다.

ViewPager 어댑터는 Fragments를 만들고 ViewPager (ID)를 컨테이너로 사용합니다. Fragment를 만들 때 Android는 Activity.findViewById을 통해이 컨테이너를 찾고 있지만 찾을 수 없으므로이 예외가 throw됩니다.

섬네일 그리드 상단에 어떤 종류의보기가 나타나길 원하는 것 같습니다. 이를 달성하기 위해 properly styled Dialog (Fragment)를 사용할 수 있습니다. 이 관점을 구현하는 구체적인 사항은 별개의 질문으로 생각하는 것이 가장 좋습니다.

+0

나는 또한 안드로이드 소스를 파헤친 후에 발견했다. 고맙습니다. –

+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를 전혀 사용하지 않았습니다. –