DialogFragment中的Viewpager - 错误的对话框高度

时间:2014-08-06 15:37:02

标签: android android-layout android-fragments

我正在尝试在对话框片段(实际上是SherlockDialogFragment)中使用viewpager。每个页面都包含一个左侧可绘制的文本视图。我面临的问题是对话框大小是“错误的”。宽度太小,高度太高(从上到下延伸)。对于宽度,我已经“解决”了这个问题,迫使其最小宽度为屏幕宽度的70%(通过代码,在对话框片段的onCreateView()方法中)。对于高度,我不知道如何解决它。 那里有一个按钮,但无法看到

enter image description here

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>

为什么对话框高度过高?我该如何解决?

3 个答案:

答案 0 :(得分:2)

我也有同样的问题。我还想要根据Viewpager当前项目的高度,因此我遵循以下步骤。

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

public class WrapContentViewPager extends ViewPager {

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

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        View child = getChildAt(getCurrentItem());
        if (child != null) {
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    }
}

此后,添加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()中添加了以下几行。如answer中所述。

if (getAdapter() != null)
        setOffscreenPageLimit(getAdapter().getCount());

而且,一切正常。

答案 1 :(得分:0)

你必须覆盖onstart方法并设置dialogfragment的高度和宽度,如

@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);

}

答案 2 :(得分:0)

在这里回答:

stackoverflow answer

扩展ViewPager类并覆盖onMeasure()方法。