我正在尝试在对话框片段(实际上是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>
为什么对话框高度过高?我该如何解决?
答案 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)