对话框中的 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 放入对话框错误“getSupportFragmentManager()”
如何使用 TabLayout 在 ViewPager 中的 Google 地图片段中获取当前位置