我有一个对话框,用于在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>
我尝试了几种不同的方法来使其正常工作,包括:
WRAP_CONTENT
将消息设置为可以正确调整大小的消息,紧跟在不调整大小的消息之前,包括:
a。在两个消息之间放置Thread.wait,这会使应用程序崩溃。
b。在这两个消息之间放置一个Invalidate无效。
是否有任何理由应该适当调整一个错误消息的大小,而不调整另一个错误消息的大小?我该如何正确调整大小?
答案 0 :(得分:0)
这可能只是对话框布局未刷新的问题。我也遇到类似的问题,仅致电invalidate
并没有帮助。除了使文本视图无效(或者可能使文本视图无效),您可以尝试以下操作:
txtError.getParent().requestLayout();
至于“为什么”的原因,我不知道。这些文本的不同之处在于,第一个只是一个需要填充一些值的模板。由于该值一开始并不为人所知,并且可能会很大(因此可能占用多于两行),因此系统可能会自动在整个对话框中执行附加的布局遍历。由于其他文本的长度 是已知的,因此系统可能正在“优化”并且仅重绘了文本视图本身。