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