Маленькие EditText имеют setError с большим количеством строк

У меня есть маленький EditText, и я хочу отображать ошибки (используя editText.setError ()) в нем. В Android API 10 сообщение отображается в виде множества строк, и его невозможно прочитать. В Android 15 работает относительно хорошо. Я прилагаю скриншоты, чтобы проиллюстрировать проблему в конце вопроса.

Как я могу отображать сообщения об ошибках в соответствующем режиме?

Я написал небольшой пример, чтобы воспроизвести проблему:

Активность

<code>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.");
}
</code>

Расположение

<code><?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>
</code>

Устройство с Android API 10:

Таблица с Android API 15:

Связанный вопрос. Но ответ не работает для меня.

ОБНОВИТ

Я выполнил один и тот же код на двух равных симуляторах, кроме уровня API. Результаты можно увидеть на экранах. API 15 все еще не исправляет ошибку полностью. Текст читается, но всплывающее окно не в правильном положении.

 Brais Gabin21 мая 2012 г., 16:27
Да. Это не сработало.
 Paul D'Ambra23 мая 2012 г., 13:55
Мне приходит в голову мысль, что вы используете два эмулируемых устройства с разными размерами экрана ... Не два совпадающих эмулируемых устройства, работающих под управлением разных версий платформы. Так что это может повлиять на плотность пикселей между двумя устройствами. Проблема с дисплеем возникает одинаково, если у вас есть эмуляторы с одинаковым размером и плотностью экрана?
 Tamás Cseh21 мая 2012 г., 09:21
Вы пытались установитьlayout_width вwrap_content?

Ответы на вопрос(5)

источник 2.3.3 ширина текста ошибки немного меньше ширины TextView, с которым она связана.

Они подшучивали над этим для 4.0.3 так, чтобы в вашем примере ширина всплывающего окна была правильной - но природа вашего макета такова, что указатель находится в неправильном месте.

Я думаю, что у вас есть разумный пример для сообщения об ошибке в 4.0.3, так как я не думаю, что у вас есть такой необычный вариант использования.

Чтобы разобраться в этом, я бы порекомендовал использовать TextView, который вы скрываете и открываете при необходимости. Вы можете установить изображение ошибки в тексте редактирования, как показано ниже.

Drawable errorImage = getContext().getResources().getDrawable( R.drawable.your_error_image);
theEditTextInQuestion.setCompoundDrawableWithIntrinsicBounds(errorImage, null, null, null);”

что проблема может заключаться в том, что LinearLayout в вашем XML не имеет атрибут weightSum. Я не знаю, можно ли использовать layout_weight в дочерних представлениях, если LinearLayout не имеет объявленного weightSum. Кроме того, попробуйте изменить layout_widths на "wrap_content" и избавиться от layout_weights, если это не работает.

я думаю, что было бы целесообразно установить layout_widths и высоту, чтобы обернуть содержимое для всплывающего окна, и если ошибка все еще сохраняется, тогда определите конкретно ширину и высоту выскакиват

что вы должны установить ширину редактируемого текста в качестве родительских заливок, чтобы она заняла правильное место, в противном случае укажите ширину, например 200 или 250 dp, чтобы в этой конкретной ширине вам отображалось сообщение об ошибке.

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. Если вы можете это, может быть, его работа. Но я думаю, что это невозможно.

Ваш ответ на вопрос