Android custom AlertDialog height not honoring layout parameters

走远了吗. 提交于 2020-01-17 04:11:29

问题


So I am creating a custom AlertDialog using the Builder. I have a custom view I am inflating in the dialog with the following layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" >

    <EditText android:id="@+id/edit_username" 
        style="@style/EditPassword"
        android:hint="@string/login_username_hint" />

    <EditText android:id="@+id/edit_password" 
        style="@style/EditPassword"
        android:hint="@string/login_password_hint" />

</LinearLayout>

The android:layout_height style for the EditText controls is set to "wrap_content". When I show the dialog with this custom view the dialog is stretched to fill the height of the entire screen. No matter what I set the layout_height on the LinearLayout to (including hardcoded pixel values), it still fills the entire screen on my emulator.

I'm hoping there's something simple that I'm missing here?

EDIT: I looked in the Hierarchy Viewer and the layout I included in this question is correctly defined, but it is wrapped within a FrameLayout within a FrameLayout, and the outermost FrameLayout is set to "wrap_content" but is rendering in the Viewer with a bunch of empty space below it.

EDIT 2: As requested, the code that inflates the layout.

protected Dialog onCreateDialog(int id) {
    switch(id) {
    case AUTHENTICATION_DIALOG:
        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
        final View loginView = inflater.inflate(R.layout.login_dialog, null);
        return new AlertDialog.Builder(HomeActivity.this)
            .setTitle("Upload profile data")
            .setView(loginView)
            .setPositiveButton("Upload", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    EditText userName = (EditText)loginView.findViewById(R.id.edit_username);
                    EditText password = (EditText)loginView.findViewById(R.id.edit_password);
                    String userNameStr = StringUtils.convertToTrimmedString(userName.getText());
                    String passwordStr = StringUtils.convertToTrimmedString(password.getText());

                    if (userNameStr.equals("") || passwordStr.equals("")) {
                        new AlertDialog.Builder(HomeActivity.this)
                            .setTitle("Required fields missing")
                            .setMessage("You must enter a username and password")
                            .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    HomeActivity.this.showDialog(AUTHENTICATION_DIALOG);
                                    dialog.dismiss();
                                }
                            }).show();
                    } else {
                        dialog.dismiss();
                    } // end if user entered username and password
                } // end "Upload" onClick
            }) // end setPositiveButton DialogInterface.OnClickListener()
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                } // end "Cancel" onClick
            }).create();
    default:
        return null;
    }
}

回答1:


So I switched to using a RelativeLayout like so:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" >

    <EditText android:id="@+id/edit_username" 
        style="@style/EditPassword"
        android:hint="@string/login_username_hint" />

    <EditText android:id="@+id/edit_password" 
        style="@style/EditPassword"
        android:layout_below="@+id/edit_username"
        android:hint="@string/login_password_hint" />

</RelativeLayout>

and it works fine. I switched back to Linear to test and it exhibited the old broken behavior when I switched back to the LinearLayout. I'm going to leave this answer unmarked in the hopes that someone can tell me why it's freaking out over LinearLayout vs Relative.



来源:https://stackoverflow.com/questions/6117189/android-custom-alertdialog-height-not-honoring-layout-parameters

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!