Android对话框大小不正确

时间:2018-06-21 18:10:13

标签: android android-layout dialog android-dialog

我有一个对话框,用于在Android应用程序中设置用于登录的新密码。作为其一部分,它会根据新密码和确认的有效性在顶部显示一条错误消息。有两种可能的消息,它们都在屏幕上占用两行:

<string name="warning_minimum_password_length">New password must be at least %d characters long.</string>
<string name="warning_unmatched_passwords">The two passwords must be the same.</string>

当我将消息设置为warning_minimum_password_length时,对话框将适当地调整大小,以使消息的空间为两行。但是,当我将消息设置为warning_unmatched_passwords时,对话框仅允许为一行留出空间(除非先前已将其设置为另一条消息,在这种情况下,它将保持正确的高度)。

以下是用于设置消息的代码:

TextWatcher textWatcher = new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) { }
            @Override
            public void afterTextChanged(Editable s)
            {
                String newErr;
                // Check passwords meet rules
                if (txtNewPwd.length() < MINIMUM_PASSWORD_LENGTH)
                {
                    txtError.setText(String.format(Locale.getDefault(), a.getString(R.string.warning_minimum_password_length), MINIMUM_PASSWORD_LENGTH));
                    btChangePwd.setEnabled(false);
                }
                else if (!(txtNewPwd.getText().toString().startsWith(txtConfirmPwd.getText().toString())))
                {
                    txtError.setText(a.getString(R.string.warning_unmatched_passwords));
                    btChangePwd.setEnabled(false);
                }
                else
                {
                    txtError.setText(null);
                    btChangePwd.setEnabled(true);
                }
            }
        };
        txtNewPwd.addTextChangedListener(textWatcher);
        txtConfirmPwd.addTextChangedListener(textWatcher);

这是布局:

<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:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.baus_systems.inventorycount.MainActivity">

    <!-- Login progress -->
    <TextView
        android:id="@+id/txt_login_error"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#ff0000"
        tools:text="Login Errors" />

    <ProgressBar
        android:id="@+id/login_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:visibility="gone" />

    <ScrollView
        android:id="@+id/login_form"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/account_login_form"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <AutoCompleteTextView
                    android:id="@+id/txtNewPwd"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ems="8"
                    android:hint="@string/prompt_new_password"
                    android:inputType="text"
                    android:maxLines="1"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/txtConfirmPwd"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/prompt_confirm_password"
                    android:imeActionId="6"
                    android:imeActionLabel="@string/action_sign_in_short"
                    android:imeOptions="actionUnspecified"
                    android:inputType="textPassword"
                    android:maxLines="1"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <Button
                android:id="@+id/bt_change_pwd"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:enabled="false"
                android:text="@string/action_sign_in_short" />

        <Button
            android:id="@+id/bt_cancel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/txt_bt_cancel" />

    </LinearLayout>
</ScrollView>

我尝试了几种不同的方法来使其正常工作,包括:

  1. 设置错误消息后,将布局高度设置为WRAP_CONTENT
  2. 将消息设置为可以正确调整大小的消息,紧跟在不调整大小的消息之前,包括:

    a。在两个消息之间放置Thread.wait,这会使应用程序崩溃。

    b。在这两个消息之间放置一个Invalidate无效。

是否有任何理由应该适当调整一个错误消息的大小,而不调整另一个错误消息的大小?我该如何正确调整大小?

1 个答案:

答案 0 :(得分:0)

这可能只是对话框布局未刷新的问题。我也遇到类似的问题,仅致电invalidate并没有帮助。除了使文本视图无效(或者可能使文本视图无效),您可以尝试以下操作:

txtError.getParent().requestLayout();

至于“为什么”的原因,我不知道。这些文本的不同之处在于,第一个只是一个需要填充一些值的模板。由于该值一开始并不为人所知,并且可能会很大(因此可能占用多于两行),因此系统可能会自动在整个对话框中执行附加的布局遍历。由于其他文本的长度 是已知的,因此系统可能正在“优化”并且仅重绘了文本视​​图本身。