错误对话框与Viewpager

问题描述:

我试图从回收站查看图片请点击打开一个对话框......对话框包含一个Viewpager使轻扫图库..错误对话框与Viewpager

代码打开对话框

holder.image.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       final Dialog dialog = new Dialog(holder.itemView.getContext()); 

       dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       dialog.setCanceledOnTouchOutside(false); 
       dialog.setCancelable(true); 
       dialog.setContentView(R.layout.activity_fullscreen_image); 

       ImageView back=(ImageView)dialog.findViewById(R.id.back); 
       ViewPager viewPagerPhotoSlideShow = (ViewPager) dialog.findViewById(R.id.pager); 

       ArrayList<String> pagerListItems=new ArrayList<String>(); 
       pagerListItems.add(0,"https://firebasestorage.googleapis.com/v0/b/zumi-60a8f.appspot.com/o/Chat_Images%2Fcropped-1222406361.png?alt=media&token=22b8673f-5602-48d4-980f-986d505d2d8f"); 
       pagerListItems.add(1,"https://firebasestorage.googleapis.com/v0/b/zumi-60a8f.appspot.com/o/Chat_Images%2Fcropped1611377016.png?alt=media&token=e7a40c6c-35ad-48ee-80ca-656384fcf68c"); 

       FullScreenImageAdapter adapterPhotoViewPager = new FullScreenImageAdapter(dialog.getOwnerActivity(), pagerListItems); 
       viewPagerPhotoSlideShow.setAdapter(adapterPhotoViewPager); 
       viewPagerPhotoSlideShow.setCurrentItem(0); 


       back.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialog.cancel(); 
        } 
       }); 


       WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 
       lp.copyFrom(dialog.getWindow().getAttributes()); 
       lp.width = WindowManager.LayoutParams.MATCH_PARENT; 
       lp.height = WindowManager.LayoutParams.MATCH_PARENT; 
       lp.gravity = Gravity.CENTER; 

       Window window = dialog.getWindow(); 
       window.setAttributes(lp); 
       window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
       dialog.show(); 

      } 
     }); 

适配器代码:

public class FullScreenImageAdapter extends PagerAdapter { 

    private Activity _activity; 
    private ArrayList<String> _imagePaths; 
    private LayoutInflater inflater; 

    // constructor 
    public FullScreenImageAdapter(Activity activity, 
            ArrayList<String> imagePaths) { 
     this._activity = activity; 
     this._imagePaths = imagePaths; 
    } 

    @Override 
    public int getCount() { 
     return this._imagePaths.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((RelativeLayout) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     ImageView imgDisplay; 
     // Button btnClose; 

     inflater = (LayoutInflater) _activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


     View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image_each, container, 
       false); 

     imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay); 

     Glide.with(container.getContext()).load(_imagePaths.get(0)) 
       .priority(Priority.HIGH).animate(android.R.anim.fade_in) 
       .override(120, 87).fitCenter().skipMemoryCache(false) 
       .diskCacheStrategy(DiskCacheStrategy.RESULT) 
       .into(imgDisplay); 

     ((ViewPager) container).addView(viewLayout); 

     return viewLayout; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     ((ViewPager) container).removeView((RelativeLayout) object); 

    } 

} 

XML >>

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ImageView 
     android:layout_width="30dp" 
     android:layout_height="30dp" 
     android:src="@drawable/arrow" 
     android:rotation="180" 
     android:id="@+id/back"/> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 


</LinearLayout> 

XML对于每个视图

<?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="match_parent" > 

    <ImageView 
     android:id="@+id/imgDisplay" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scaleType="fitCenter" /> 

</RelativeLayout> 

错误>>>

E/AndroidRuntime:致命异常:主 工艺:com.example.cosmic.zumi_test,PID:22289 java.lang中.NullPointerException:尝试在一个空 对象引用 调用虚拟方法 'java.lang.Object中 android.content.Context.getSystemService(java.lang.String中)' at android.view.LayoutInflater.from(LayoutInflater.java:219) at com.example.cosmic.zumi_test.FullScreenImageAdapter.instantiateItem(FullScreenImageAdapter.java:56) at android.support.v4.view.ViewPager.addNewItem( ViewPager.java:1034) at android.support.v4.view.ViewPager.populate(ViewPager.java:1182) at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) at android。在android.view.View.Group.measureChildWithMargins(ViewGroup.java:5604) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 在android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 在android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 在android.view.View.measure(View.java:17572) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5604) at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) at android。 view.View.measure(View.java:17572) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5604) at android.widget.F rameLayout.onMeasure(FrameLayout.java:436) at android.view.View.measure(View.java:17572) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5604) at android.widget.FrameLayout。 onMeasure(FrameLayout.java:436) at com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2632) at android.view.View.measure(View.java:17572) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173) at android.view.ViewRootImpl。performTraversals(ViewRootImpl.java:1379) 在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 在 android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5895) 在 android.view。编排$ CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:550) at android.view .Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5345) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit。 Java的:947) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

看来_activity是你FullScreenImageAdapter内空。这是因为dialog.getOwnerActivity()为空(正如@dipdipdip所述)。相反的实例为你做的视图寻呼机适配器,试试这个方法:

FullScreenImageAdapter adapterPhotoViewPager = new FullScreenImageAdapter(v.getContext(), pagerListItems); 

更新

要显示你的对话框上不同的图像,改变您的寻呼机转接器内的instantiateItem方法是这样的:

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    ImageView imgDisplay; 
    // Button btnClose; 

    inflater = (LayoutInflater) _activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image_each, container, 
      false); 

    imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay); 

    Glide.with(container.getContext()).load(_imagePaths.get(position)) 
      .priority(Priority.HIGH).animate(android.R.anim.fade_in) 
      .override(120, 87).fitCenter().skipMemoryCache(false) 
      .diskCacheStrategy(DiskCacheStrategy.RESULT) 
      .into(imgDisplay); 

    ((ViewPager) container).addView(viewLayout); 

    return viewLayout; 
} 
+0

在不同的幻灯片中显示不同的图像... –

+0

好的:在Glide调用的.load方法中,写下:“_imagePaths.get(position)”,你做总是“_imagePaths.get(0)” –

+0

看到我的更新的答案 –

之前的对话框创建它没有“所有者”。因此致电dialog.getOwnerActivity()返回null

只是一个提示:你不需要通过Activity到你的适配器。

在您instantiateItem只使用从容器中的上下文接收LayoutInflater:

LayoutInflater inflater = LayoutInflater.from(container.getContext()); 
+0

谢谢....这工作....但是,当我更改 imagePaths [0]此图像路径...它给出一个错误...当imagePaths [0]是滑块显示两个图像设置,但都是相同的图像...何w在不同的幻灯片中可以有不同的图像... –