Android AlertDialog没有包装KK中的内容

时间:2014-07-25 08:03:06

标签: android alertdialog android-alertdialog

我创建了一个多用途AlertDialog,其中包含一个WebView。在我测试的所有设备中,对话框大小都没问题,它的高度总是包含在内容中。不幸的是,在带有4.4.2的Nexus 5上,它没有正确显示。有时它会包装,其他则不会。

以下是我在模拟Nexus 5上的含义截图。

enter image description here

以下是xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:background="@color/white"
              android:orientation="vertical">
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:orientation="horizontal"
        tools:ignore="DisableBaselineAlignment"
        android:id="@+id/alertdialog_title"
        android:weightSum="4">

    <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="horizontal"
            android:layout_weight="1"
            android:gravity="center">
        <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/app_name"
                android:fitsSystemWindows="true"
                android:id="@+id/alertdialog_icon"
                android:layout_margin="12dp"
                android:layout_gravity="center"
                android:background="@drawable/info"/>
    </LinearLayout>
    <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="3"
            android:gravity="center"
            android:orientation="horizontal"
            >
        <TextView
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:textColor="@color/white"
                android:textStyle="bold"
                tools:ignore="HardcodedText"
                android:layout_gravity="center"
                android:id="@+id/alertdialog_titletext"
                android:layout_marginTop="12dp"
                android:layout_marginRight="12dp"
                android:layout_marginBottom="12dp"
                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large"
                style="@android:style/TextAppearance.Large"/>
    </LinearLayout>
    </LinearLayout>
    <View
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:background="@color/orange"
            android:orientation="vertical"/>
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:gravity="center"
            android:orientation="vertical"
            tools:ignore="DisableBaselineAlignment"
            android:id="@+id/alertdialog_content">
    </LinearLayout>
</LinearLayout>

创建AlertDialog

的代码
void showAlertDialog(String title, String message, final int messageType) {
    int padding = (int) getResources().getDimension(R.dimen.all_margins);
    LayoutInflater inflater = getLayoutInflater();

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
    View layout = inflater.inflate(R.layout.alertdialog, null);

    LinearLayout alertDialogContent = (LinearLayout) layout.findViewById(R.id.alertdialog_content);
    ImageView alertDialogIcon = (ImageView) layout.findViewById(R.id.alertdialog_icon);
    TextView alertDialogTitle = (TextView) layout.findViewById(R.id.alertdialog_titletext);
    alertDialogTitle.setTypeface(fontBold);

    alertDialogIcon.setBackgroundDrawable(getResources().getDrawable(R.drawable.info));
    alertDialogTitle.setText(title);
    alertDialogTitle.setTextColor(getResources().getColor(R.color.orange));

    WebView webview = new WebView(this);

    ScrollView scrollPane = new ScrollView(this);

    webview.loadDataWithBaseURL(null, message, "text/html", "utf-8", null);

    scrollPane.setPadding(padding, padding, padding, padding);
    scrollPane.addView(webview);
    alertDialogContent.addView(scrollPane);

    alertDialog.setView(layout);
    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            // Do something
        }
    });

    if (messageType == 0 || messageType == 3) {
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Do something
            }
        });
    }

    AlertDialog alert = alertDialog.create();
    alert.show();
    boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
    if (tabletSize) {
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        alert.getWindow().setLayout((int) (metrics.widthPixels * 0.8), ViewGroup.LayoutParams.WRAP_CONTENT);
    }
}

我应该更改AlertDialog总是包含它的内容??

1 个答案:

答案 0 :(得分:0)

获取所有可用空间是ScrollView的默认行为(这是我的直接体验)。几天前我遇到了这个问题,我的解决方案是测量ScrollView的内容,并强制它的高度。类似的东西(我的情况是LinearLayout as direct child of the ScrollView that contains TextView`s - 伪代码)

 int height = 0;
 for (view I am going to add in the LL) {
    view.measure(0, 0);
    height += view.getMeasuredHeight();
 }  

在此度量操作之后,我检索视图层次结构的根布局(在我的情况下为FrameLayout),并将其params.height强制为计算