Android DialogFragment内的Viewpager-对话框高度错误

Android DialogFragment内的Viewpager-对话框高度错误,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,我试图在对话片段(实际上是SherlockDialogFragment)中使用viewpager。每一页都由一个文本视图组成,该视图带有一个左可绘制视图。我面临的问题是对话框大小“错误”。宽度太小,高度太高(从上到下延伸)。对于宽度,我已经“解决”了这个问题,强制其最小宽度为屏幕宽度的70%(通过代码,在对话框片段的onCreateView()方法中)。至于高度,我不知道怎么修下面有一个按钮,但看不见它: viewpager正在工作(我可以滑动我设置的三个页面)。这是对话框片段布局: <

我试图在对话片段(实际上是SherlockDialogFragment)中使用viewpager。每一页都由一个文本视图组成,该视图带有一个左可绘制视图。我面临的问题是对话框大小“错误”。宽度太小,高度太高(从上到下延伸)。对于宽度,我已经“解决”了这个问题,强制其最小宽度为屏幕宽度的70%(通过代码,在对话框片段的onCreateView()方法中)。至于高度,我不知道怎么修下面有一个按钮,但看不见它

viewpager正在工作(我可以滑动我设置的三个页面)。这是对话框片段布局:

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


    <TextView        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:text="TITLE"
        android:textStyle="bold"
        android:maxLines="1"
        android:drawableLeft="@drawable/icon"
        android:drawablePadding="8dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="2px"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:background="@drawable/lineseparator"
        android:visibility="visible" />



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

    <View
        android:layout_width="fill_parent"
        android:layout_height="2px"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:background="@drawable/lineseparator"
        android:visibility="visible" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"

     >


        <Button
            android:id="@+id/close_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:background="?selectableItemBackground"
            android:minHeight="40dp"
            android:text="Close"
            android:textColor="@android:color/white" />



    </LinearLayout>

</LinearLayout>

这是页面布局示例:

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


    <TextView        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Page 1 - ekrjgwoirhfwiorht2iu3hr2984hr893rhg3hff2jif283hr29837rh283eh23r23r2r23rwrgioehrg803"
        android:drawableLeft="@drawable/img1"
        android:drawablePadding="8dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>


为什么对话框的高度太高?如何修复它?

如果拨号,您必须跳过onstart方法并设置高度和宽度,如

@Override
public void onStart(){
   super.onStart();

  if (getDialog() == null)
    return;

  int dialogWidth = ... // assign width here
  int dialogHeight = ... // assign height here

   getDialog().getWindow().setLayout(dialogWidth, dialogHeight);

}
请回答:


扩展ViewPager类并重写onMeasure()方法。

我也有同样的问题。我还希望高度与viewpager的当前项一致,因此我遵循以下步骤

首先,您需要覆盖viewpager的
onMeasure
方法。如前所述

之后,添加PageChangeListener,以便每次更改viewpager项时都可以重新测量viewpager的高度。我们将添加一个
initPageChangeListener()
方法,并在构造函数中调用它

public WrapContentViewPager(@NonNull Context context) {
    super(context);
    initPageChangeListener();
}

public WrapContentViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initPageChangeListener();
}

private void initPageChangeListener() {
    addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            requestLayout();
        }
    });
}
现在,当viewpager适配器有3个以上的项时,我遇到了问题,因此我在
onMeasure()
中添加了以下行。如本文所述


而且,一切都很完美。

我已经尝试过了,但是尽管窗口的宽度和高度都符合要求,但viewpager的高度仍然错误(并且按钮将不可见)。这是由于android:background=“@drawable/dlg_bkg”。尝试删除此项并再次检查。它是一个小的ninepatch png。不可能。谢谢你的回答。第一部分,即创建自定义视图寻呼机对我来说很好。但是当我们展示片段时,动画效果并不好。它正在调整从顶部到中心的高度。
public WrapContentViewPager(@NonNull Context context) {
    super(context);
    initPageChangeListener();
}

public WrapContentViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initPageChangeListener();
}

private void initPageChangeListener() {
    addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            requestLayout();
        }
    });
}
if (getAdapter() != null)
        setOffscreenPageLimit(getAdapter().getCount());