Viewpager 对话框中的错误

Posted

技术标签:

【中文标题】Viewpager 对话框中的错误【英文标题】:error in Dialog Box with Viewpager 【发布时间】:2017-02-09 13:26:30 【问题描述】:

我正在尝试从 Recycler View Image Click 打开一个对话框...该对话框包含一个 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_
    android:layout_
    android:orientation="vertical" >

    <ImageView
        android:layout_
        android:layout_
        android:src="@drawable/arrow"
        android:rotation="180"
        android:id="@+id/back"/>

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


</LinearLayout>

每个视图的 XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >

    <ImageView
        android:id="@+id/imgDisplay"
        android:layout_
        android:layout_
        android:scaleType="fitCenter" />

</RelativeLayout>

错误>>>

E/AndroidRuntime: 致命异常: main 进程:com.example.cosmic.zumi_test,PID:22289 java.lang.NullPointerException:尝试调用虚拟方法 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' 为空 对象引用 在 android.view.LayoutInflater.from(LayoutInflater.java:219) 在 com.example.cosmic.zumi_test.FullScreenImageAdapter.instantiateItem(FullScreenImageAdapter.java:56) 在 android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1182) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 在 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) 在 android.view.View.measure(View.java:17572) 在 android.view.ViewGroup.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) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5604) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 在 android.view.View.measure(View.java:17572) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5604) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 在 android.view.View.measure(View.java:17572) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5604) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2632) 在 android.view.View.measure(View.java:17572) 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015) 在 android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5895) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 在 android.view.Choreographer.doCallbacks(Choreographer.java:580) 在 android.view.Choreographer.doFrame(Choreographer.java:550) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5345) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:947) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

【问题讨论】:

【参考方案1】:

您的FullScreenImageAdapter 中的_activity 似乎为空。那是因为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;

【讨论】:

好的:在 Glide 调用的 .load 方法中,这样写:“_imagePaths.get(position)”,你总是在做“_imagePaths.get(0)”【参考方案2】:

在创建对话框之前,它没有“所有者”。因此调用dialog.getOwnerActivity() 返回null

提示:您无需将Activity 传递到您的适配器。

在您的 instantiateItem 中,只需使用容器中的 Context 即可接收 LayoutInflater:

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

【讨论】:

谢谢 ....这行得通....但是当我将 imagePaths[0] 更改为此图像路径...它给出一个错误...当 imagePaths[0] 时滑块显示两个图像] 已设置但两者都是相同的图像...如何在不同的幻灯片上有不同的图像...

以上是关于Viewpager 对话框中的错误的主要内容,如果未能解决你的问题,请参考以下文章

将 viewpager 放入对话框错误“getSupportFragmentManager()”

对话框中的 Viewpager?

android中在弹出的对话框中如何加viewpager

如何使用 TabLayout 在 ViewPager 中的 Google 地图片段中获取当前位置

如何确定 Fragment 何时在 ViewPager 中可见

在tablayout viewpager中运行调整选项卡片段