我有一个小的EditText,我想在其中显示错误(使用editText.setError())。在Android API 10中,消息以很多行显示,并且无法读取。在Android 15中工作相对较好。我附上截图以说明问题末尾的问题。
如何以适当的模式显示错误消息?
我写了一个小例子来重现这个问题:
活动:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((EditText) findViewById(R.id.b)).setError("A error description and bla bla bla bla bla.");
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<EditText
android:id="@+id/a"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:id="@+id/b"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:id="@+id/c"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:id="@+id/d"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:id="@+id/e"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:id="@+id/f"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
使用Android API 10的设备:
使用Android API 15的平板电脑:
Related question.但答案对我不起作用。
我在除了API级别之外的两个等于模拟器上执行了相同的代码。结果可以在屏幕上看到。 API 15仍然无法完全修复错误。该文字清晰易读,但弹出窗口位置不正确。
答案 0 :(得分:2)
因此,查看the source for 2.3.3错误文本的宽度设置为略小于与其相关的TextView的宽度。
They've jimmied around with that for 4.0.3因此,在您的示例中,弹出窗口的宽度是正确的 - 但布局的性质使得指针位于错误的位置。
我认为你有一个合理的例子来反对4.0.3的错误报告,因为我不认为你有这个不寻常的用例。
为了对此进行排序,我建议您使用隐藏和显示的TextView。您可以在编辑文本上设置错误图像,如下所示。
Drawable errorImage = getContext().getResources().getDrawable( R.drawable.your_error_image);
theEditTextInQuestion.setCompoundDrawableWithIntrinsicBounds(errorImage, null, null, null);”
答案 1 :(得分:1)
在api 14上,TextView使用这个类;
private static class ErrorPopup extends PopupWindow {
private boolean mAbove = false;
private final TextView mView;
private int mPopupInlineErrorBackgroundId = 0;
private int mPopupInlineErrorAboveBackgroundId = 0;
ErrorPopup(TextView v, int width, int height) {
super(v, width, height);
mView = v;
// Make sure the TextView has a background set as it will be used the first time it is
// shown and positionned. Initialized with below background, which should have
// dimensions identical to the above version for this to work (and is more likely).
mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId,
com.android.internal.R.styleable.Theme_errorMessageBackground);
mView.setBackgroundResource(mPopupInlineErrorBackgroundId);
}
void fixDirection(boolean above) {
mAbove = above;
if (above) {
mPopupInlineErrorAboveBackgroundId =
getResourceId(mPopupInlineErrorAboveBackgroundId,
com.android.internal.R.styleable.Theme_errorMessageAboveBackground);
} else {
mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId,
com.android.internal.R.styleable.Theme_errorMessageBackground);
}
mView.setBackgroundResource(above ? mPopupInlineErrorAboveBackgroundId :
mPopupInlineErrorBackgroundId);
}
private int getResourceId(int currentId, int index) {
if (currentId == 0) {
TypedArray styledAttributes = mView.getContext().obtainStyledAttributes(
R.styleable.Theme);
currentId = styledAttributes.getResourceId(index, 0);
styledAttributes.recycle();
}
return currentId;
}
@Override
public void update(int x, int y, int w, int h, boolean force) {
super.update(x, y, w, h, force);
boolean above = isAboveAnchor();
if (above != mAbove) {
fixDirection(above);
}
}
}
并且这样打电话;
final float scale = getResources().getDisplayMetrics().density;
mPopup = new ErrorPopup(err, (int) (200 * scale + 0.5f), (int) (50 * scale + 0.5f));
mPopup.setFocusable(false);
因此Android TextView会使用您的手机密度。我尝试改变密度,但我无法工作,因为它需要root。如果你能这样,也许是它的工作。但我想这是不可能的。
答案 2 :(得分:0)
我认为您应该将编辑文本的宽度设置为填充父级,以便它占据正确的位置,否则将宽度设置为200或250 dp,以便在该特定宽度中向您显示错误消息。
答案 3 :(得分:0)
那两个模拟器是否具有相同的屏幕尺寸?如果是这样,我认为设置layout_widths和高度以包装弹出窗口的内容是合适的,如果错误仍然存在,那么具体定义宽度和高度弹出窗口
答案 4 :(得分:0)
我认为问题可能是XML中的LinearLayout没有weightSum属性。如果LinearLayout没有声明weightSum,我不知道你是否可以在子视图中使用layout_weight。另外,尝试将layout_widths更改为“wrap_content”,如果不起作用,请删除layout_weights。