简体   繁体   中英

Android custom AlertDialog height not honoring layout parameters

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;
    }
}

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM