Моя проблема: начиная со второго раза клавиатура программного обеспечения отображается на экране, она полностью скрывает мой EditText.
Атрибут android: windowSoftInputMode = "adjustPan" указан в AndroidManifest.xml, но он работает только в первый раз.
У меня есть следующий макет:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="464dp" android:gravity="top" android:orientation="vertical" android:paddingLeft="16dp" android:paddingRight="16dp" > <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="10" android:background="#E3E3E2" android:gravity="top" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:id="@+id/addListText" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="10" android:contentDescription="@string/addItemContentDescription" android:gravity="bottom|center_horizontal" android:inputType="textLongMessage" android:textColor="#E3E3E2" android:visibility="gone" /> <ImageButton android:id="@+id/addTextListButton" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1" android:layout_gravity="right" android:background="@android:color/transparent" android:contentDescription="@string/addItemButton" android:scaleType="fitCenter" android:src="@drawable/plus_add" android:visibility="gone" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="fill_parent" android:gravity="bottom|center_horizontal" android:orientation="horizontal" android:paddingLeft="16dp" android:paddingRight="16dp" > <ImageButton android:id="@+id/syncListsButton" android:layout_width="64dp" android:layout_height="match_parent" android:src="@android:drawable/ic_popup_sync" /> <ImageButton android:id="@+id/showOrHide" android:layout_width="64dp" android:layout_height="match_parent" /> <ImageButton android:id="@+id/delListButton" android:layout_width="64dp" android:layout_height="match_parent" android:src="@android:drawable/ic_menu_delete" /> </LinearLayout> </LinearLayout>
Кнопка «showOrHide» показывает / скрывает комбо «addListText» / «addTextListButton».
Когда EditText отображается в первый раз, и я прикасаюсь к нему, на экране появляется мягкая клавиатура, и комбинация «addListText» / «addTextListButton» запускается правильно. Когда я скрываю клавиатуру, а затем снова показываю ее, клавиатура полностью закрывает окно редактирования addListText!
Любая идея о том, что происходит? Я тестирую его на Android 4.2.2.
Пожалуйста помоги! Благодаря 🙂
Edit: Я также попытался перенести первый LinearLayout внутри ScrollView, но он не работает!
Subclassed EditText и переопределить метод onKeyPreIme (int keyCode, событие KeyEvent) следующим образом:
@Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { clearFocus(); } return super.onKeyPreIme(keyCode, event); }
Теперь, когда нажата задняя клавиша, EditText потерял фокус. Затем, постукивая по нему, снова будет работать настройка.
Это может показаться немного глупым, но я столкнулся с этой проблемой, когда я установил силу тяжести моего EditText как «center_horizontal», так и «center». Эта же проблема возникает при использовании textAlignment 'center'. Удалите его, и вы не столкнетесь с проблемой клавиатуры, скрывающей EditText второй раз (и последующих), когда клавиатура выйдет.
Проблема, с которой вы столкнулись, теперь является известной ошибкой платформы, описанной здесь: https://code.google.com/p/android/issues/detail?id=182191
Исправление не будет передано обратно и поэтому не вступит в силу до Android N. Пока Android N не является минимальным SDK, следующее решение является обходным решением.
Вы можете создать собственный класс, расширяющий EditText и переопределить метод onKeyPreIme (int keyCode, событие KeyEvent) следующим образом:
@Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { clearFocus(); } return super.onKeyPreIme(keyCode, event); }
Вы также должны убедиться, что макет более высокого уровня имеет возможность фокусироваться, поэтому фокус EditText может быть успешно удален. Для вас могут работать следующие атрибуты:
android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"
Теперь, когда нажата задняя клавиша, EditText теряет фокус. Затем, когда вы снова нажимаете кнопку, настройка будет работать по назначению. (Проводка в качестве ответа с момента отказа от редактирования).
Вот код, который я изначально использовал, столкнулся с этой проблемой:
<EditText android:layout_width="250dp" android:layout_height="wrap_content" android:gravity="center" />
Когда я удалил центр гравитационной линии из EditText, панорамирование работало:
android:gravity="center"
Я работал над этим, обертывая EditText в FrameLayout и центрируя весь EditText в FrameLayout. Единственная проблема, которую он вызывает, заключается в том, что EditText будет по меньшей мере шириной hinttext, поэтому первые несколько символов / слов, набранных, не будут центрированы. Это было хорошо для меня, но ваш пробег может измениться 🙂
<FrameLayout android:layout_width="250dp" android:layout_height="wrap_content"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout>
EDIT: этот обход обрывается, если пользователь нажимает на самое последнее слово в edittext. Я использую обходное решение onKeyPreIme
Для меня переопределение onKeyPreIme
не работает. Поэтому вместо этого я переопределяю dispatchKeyEventPreIme
.
@Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){ clearFocus(); } return super.dispatchKeyEventPreIme(event); }
В EditText android:layout_gravity="center"
Создайте этот тип проблемы. Если вы хотите, чтобы текст стал центром, вы можете сделать это
Шаг 1: для макета
<LinearLayout android:id="@+id/linerPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageView2" android:gravity="center"> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="40dp" android:background="@null" android:hint="*****" android:layout_marginLeft="-40dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:inputType="textPassword" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="18sp" /> </LinearLayout>
Step2: Некоторые вещи программно
linerUser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mETUserName, 0); mETUserName.requestFocus(); } });
Наконец, работа очень хорошо. Я нашел это решение для настройки softKeyboard
Обычно панель настройки не работает после первого нажатия кнопки «назад», попробуйте сделать это следующим образом: – (может быть реализовано для EditText, AutoCompleteTextView или любого другого вида, в котором неверно работает)
@Override public void onBackPressed() { editText.clearFocus(); editText.setCursorVisible(false); }
Надежда Это помогает кому-то