Android setError(), прокручивающееся над ActionBar
Моя проблема в том, что сообщение об ошибке в моих EditTexts прокручивается поверх панели действий. Это ошибка андроида, или я делаю что-то неправильно?
Также эта ошибка происходит даже тогда, когда клавиатура выключена, это просто происходит на снимках экрана.
Вот о чем я говорю: http://imgur.com/fG8bd3E,uFzhOXa#1 < - есть два изображения
Вот мой макет, я добавляю EditTexts в свой код к kiosk_form_table LinearLayout
<ScrollView
style="@style/DefaultBackground"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.6"
android:fadeScrollbars="false"
android:padding="20dp" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingRight="20dp" >
<LinearLayout
android:id="@+id/kiosk_form_table"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
<Button
android:id="@+id/kiosk_submit_large"
style="@style/LoginButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:onClick="submit"
android:text="@string/submit" />
</LinearLayout>
</ScrollView>
Как добавить EditTexts
kiosk_form.addView(getKioskRow(R.layout.kiosk_text_row, "First Name", true, null));
private View getKioskRow(int layout, String header, boolean required, String buttonName)
{
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(layout, null);
view.setTag(required);
addHeader((TextView) inflater.inflate(R.layout.field_header, null), header);
if (required)
((TextView) view.findViewById(R.id.kiosk_input)).setHint("Required");
if (buttonName != null)
((Button) view.findViewById(R.id.kiosk_input_button)).setText(buttonName);
return view;
}
private void addHeader(TextView view, String header)
{
view.setTag(false);
view.setText(header);
kiosk_form.addView(view);
}
Как установить ошибку
(TextView) view).setError(getString(R.string.error_field_required));
Ответы
Ответ 1
Где вы хотите увидеть сообщение об ошибке? Если вы хотите его на EditText, установите его на editText.
((EditText) findViewByID(R.id.my_edit_text)).setError ...... // and so on
Изменить: оригинальный ответ не помог.
Здесь одно из возможных решений: вы можете скрыть сообщение об ошибке, когда пользователь прокручивает представление. Когда свиток завершен, вы можете повторно установить сообщение об ошибке, и оно должно появиться в нужном месте! Здесь, как вы можете обнаружить, когда свиток закончен:
Android: как определить, когда закончился прокрутка
Ответ 2
Это ошибка ОС Android.
Вы можете отслеживать его прогресс здесь
Ответ 3
Я решаю аналогичную проблему, установив флаг
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Ответ 4
У меня такая же проблема. Решил это так:
private void processingErrorPopupsWhenScrolling(Rect scrollBounds, TextInputEditText... views) {
boolean isViewInFocus = false;
for (TextInputEditText textInputEditText : views) {
if (textInputEditText.getError() != null) {
if (textInputEditText.getLocalVisibleRect(scrollBounds)) {
textInputEditText.setVisibility(View.VISIBLE);
if (!isViewInFocus) {
textInputEditText.requestFocus();
isViewInFocus = true;
}
} else {
textInputEditText.setVisibility(View.INVISIBLE);
}
}
}
}
// in onCreate(){
Rect scrollBounds = new Rect();
mScrollView.getHitRect(scrollBounds);
mScrollView.getViewTreeObserver().addOnScrollChangedListener(() ->
processingErrorPopupsWhenScrolling(scrollBounds,
mLink,
mTitle,
mPrice)
);}