对话框中的 Viewpager?

Posted

技术标签:

【中文标题】对话框中的 Viewpager?【英文标题】:Viewpager in Dialog? 【发布时间】:2017-05-10 14:54:34 【问题描述】:

我正在尝试创建一个对话框,您可以在其中单击“下一步”按钮向右滑动到下一个屏幕。我正在使用 ViewPager 和适配器:

  final Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.voicedialog);
        dialog.setCanceledOnTouchOutside(false);

        MyPageAdapter adapter = new MyPageAdapter();
        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(adapter);

但是,我得到一个 NullPointerException 说 pager 为空。为什么会这样?这是页面适配器类:

public class MyPageAdapter extends PagerAdapter 
    public Object instantiateItem(ViewGroup collection, int position) 

        int resId = 0;
        switch (position) 
            case 0:
                resId = R.id.voice1;
                break;
            case 1:
                resId = R.id.voice2;
                break;
        
        return collection.findViewById(resId);
    

    @Override
    public int getCount() 
        return 2;
    

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) 
        return arg0 == arg1;
    

这是我的 DIALOG 布局:

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    />

让我知道如何避免这种情况。

PS:应该在视图分页器中的每个布局看起来像这样,只是不同。文字:

<RelativeLayout android:layout_
    android:layout_
    android:id="@+id/voice2"
    xmlns:android="http://schemas.android.com/apk/res/android">

        <TextView
            android:text="Slide 1!"
            android:layout_
            android:layout_
            android:id="@+id/textView2"
            android:layout_gravity="center"
            android:textSize="50sp" />

    </RelativeLayout>

【问题讨论】:

发布您的布局 xml @GurwinderSingh 完成,我已经编辑了问题 您应该在对话框中调用findViewById。不在当前活动中。 我认为您正在尝试在创建对话框之前绑定您的 ViewPager。你应该在对话框的 onCreate() 方法之后绑定它。 【参考方案1】:

不使用枚举类

您应该在对话框中调用 findViewById。因此,您必须在 findViewById 之前添加对话框。

这样,

ViewPager pager = (ViewPager) dialog.findViewById(R.id.viewpager);

在解决你的空指针异常后,这里的其他问题的解决方案,如果你不使用枚举类,你可以使用下面的代码......

MainActivity.java

package demo.com.pager;

import android.app.Dialog;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;

public class MainActivity extends AppCompatActivity 


    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn= (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                final Dialog dialog = new Dialog(MainActivity.this);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setContentView(R.layout.voicedialog);
                dialog.setCanceledOnTouchOutside(false);

                MyPageAdapter adapter = new MyPageAdapter(MainActivity.this);
                ViewPager pager = (ViewPager) dialog.findViewById(R.id.viewpager);
                pager.setAdapter(adapter);
                dialog.show();
            
        );


    

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_
    android:layout_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="demo.com.pager.MainActivity">

    <Button
        android:id="@+id/btn"
        android:layout_
        android:layout_
        android:text="Hello World!" />
</RelativeLayout>

MyPageAdapter.java

package demo.com.pager;

import android.app.FragmentManager;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by rucha on 26/12/16.
 */

public class MyPageAdapter extends PagerAdapter 

    Context mContext;
    int resId = 0;

    public MyPageAdapter(Context context) 
        mContext = context;
    


    public Object instantiateItem(ViewGroup collection, int position) 

      /*  int resId = 0;
        switch (position) 
            case 0:
                resId = R.id.voice1;
                break;
            case 1:
                resId = R.id.voice2;
                break;
        

        return collection.findViewById(resId);*/

        LayoutInflater inflater = LayoutInflater.from(mContext);
        switch (position) 
            case 0:
                resId = R.layout.fragment_blue;
                break;
            case 1:
                resId = R.layout.fragment_pink;
                break;
        
        ViewGroup layout = (ViewGroup) inflater.inflate(resId, collection, false);
        collection.addView(layout);
        return layout;
    

    @Override
    public int getCount() 
        return 2;
    

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) 
        return arg0 == arg1;
    

FragmentBlue.java

package demo.com.pager;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import android.support.v4.app.Fragment;

public class FragmentBlue extends Fragment  

    private static final String TAG = FragmentBlue.class.getSimpleName();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

        View view = inflater.inflate(R.layout.fragment_blue, container, false);
        return view;
    



fragment_blue.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="#4ECDC4">

</RelativeLayout>

voicedialog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

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

</RelativeLayout>

请查看并回复。

【讨论】:

好的,我做到了,但现在对话框只是一个没有内容或滑动的空屏幕...甚至没有显示任何布局(voice1 或 voice2)。 你在哪里扩展你的布局? @RuchirBaronia 我更新了答案,检查答案并根据您的代码进行修改,如果有任何疑问,请再次询问,如果您喜欢我的回答,请点赞并接受。谢谢。 @RuchaBhatt 而不是发布另一个答案。你必须编辑你的第一个答案!否则版主或其他用户将不赞成您的回答! 我不得不将 MyPageAdapter(MainActivity.this); 替换为 MyPageAdapter(getSupportFragmentManager());【参考方案2】:

使用枚举类

试试这个代码,如果有任何疑问再次询问,这是有效的。乐于助人。

MainActivity.java

package demo.com.dialogdemo;

import android.app.Dialog; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.Window; import android.widget.Button;

public class MainActivity extends AppCompatActivity 

    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setupUIComponents();
        setupListeners();
    

    private void setupUIComponents() 
        button = (Button) findViewById(R.id.button);
    

    private void setupListeners() 
        button.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                final Dialog dialogItemDetails = new Dialog(MainActivity.this);
                dialogItemDetails.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialogItemDetails.setContentView(R.layout.dialoglayout);
                dialogItemDetails.getWindow().setBackgroundDrawable(
                        new ColorDrawable(Color.TRANSPARENT));

                ViewPager viewPager = (ViewPager) dialogItemDetails.findViewById(R.id.viewPagerItemImages);
                viewPager.setAdapter(new CustomPagerAdapter(MainActivity.this));
                dialogItemDetails.show();

            
        );
    


activity_main.xml

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

    <Button
        android:id="@+id/button"
        android:layout_
        android:layout_
        android:text="dialog" />

</RelativeLayout>

ModelObject1.java

public enum ModelObject1 

    RED(R.string.red, R.layout.fragment_one),
    BLUE(R.string.blue, R.layout.fragment_two);

    private int mTitleResId;
    private int mLayoutResId;

    ModelObject1(int titleResId, int layoutResId) 
        mTitleResId = titleResId;
        mLayoutResId = layoutResId;
    

    public int getTitleResId() 
        return mTitleResId;
    

    public int getLayoutResId() 
        return mLayoutResId;
    


CustomPagerAdapter.java

package demo.com.dialogdemo;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by rucha on 26/12/16.
 */

public class CustomPagerAdapter  extends PagerAdapter 

    private Context mContext;

    public CustomPagerAdapter(Context context) 
        mContext = context;
    

    @Override
    public Object instantiateItem(ViewGroup collection, int position) 
        ModelObject1 modelObject = ModelObject1.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getLayoutResId(), collection, false);
        collection.addView(layout);
        return layout;
    

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) 
        collection.removeView((View) view);
    

    @Override
    public int getCount() 
        return ModelObject1.values().length;
    

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

    @Override
    public CharSequence getPageTitle(int position) 
        ModelObject1 customPagerEnum = ModelObject1.values()[position];
        return mContext.getString(customPagerEnum.getTitleResId());
    


dailoglayout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <TextView
        android:id="@+id/txtHeaderTitle"
        android:layout_
        android:layout_
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="ITEM IMAGES"
        android:textStyle="bold" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPagerItemImages"
        android:layout_
        android:layout_
        android:background="@android:color/white" />

</RelativeLayout>

fragmentone.xml

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

    <TextView
        android:layout_
        android:layout_
        android:text="one"/>

</LinearLayout>

【讨论】:

@RuchirBaronia 这段代码你遇到了什么问题? @Piyush 与其让代码麻烦,我想找到一种方法来修复我自己的,而不是仅仅复制另一个。我也认为没有必要使用 Enum。除了使用 Enum 之外,这与我在问题中提供的几乎完全相同。我只是想弄清楚如何在MyPageAdapter 中引用我在instantiateItem 中的布局,因为我认为我的问题是我没有调用collection.addView(layout);,但我不知道如何获取那个layout 对象。你或@Rucha 知道吗? @RuchirBaronia enum 根本没有必要,我告诉过你更新你的问题并向我们展示你到目前为止所做的事情......好吧,我明白你想要在不使用 enum 的情况下膨胀布局是你的问题? 那么它就像你可以检查this@RuchirBaronia 一样简单

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

viewpager 中的片段,未找到视图错误

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

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

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

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

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