Программно скрыть/показать Android Soft Keyboard
Возможный дубликат:
Закрыть/скрыть программную клавиатуру Android
Первым делом первым я уже видел эту ветку. Я попробовал принятые методы, данные там.. Но у меня ничего не получалось..
У меня есть два экрана в моем приложении.
- Первый из них имеет 2 EditText - один для имени пользователя и один для пароля
- Второй имеет один ListView, а EditText - для фильтрации listView
На моем первом экране я хочу, чтобы имя пользователя EditText было сосредоточено на запуске, и клавиатура должна быть видимой. Это моя реализация (упрощенная за счет удаления ненужных/не связанных кодов)..
app_login.xml
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip">
<EditText android:id="@+id/username"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:hint="Username"
android:imeOptions="actionDone" android:inputType="text"
android:maxLines="1"/>
<EditText android:id="@+id/password"
android:password="true"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Password" />
</LinearLayout>
AppLogin.java
class AppLogin extends Activity{
private EditText mUserNameEdit = null;
private EditText mPasswordEdit = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.app_login);
mUserNameEdit = (EditText) findViewById(R.id.username);
mPasswordEdit = (EditText) findViewById(R.id.password);
/* code to show keyboard on startup.this code is not working.*/
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}//End of onCreate()
}
Ну, клавиатура не отображается при запуске. И мой дизайн сильно требует клавиатуры там.
Теперь на второй странице... Я уже сказал, что у меня есть listView и EditText там.. Я хочу, чтобы моя клавиатура была скрыта при запуске только для того, чтобы она появлялась, когда пользователь касается editText... Вы можете в это поверить? Все, что я пробовал , показывает мягкую клавиатуру, когда я загружаю активность... Я не могу ее скрыть.
app_list_view.xml
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
AppList.java
public class MyListActivity extends ListActivity{
private EditText mfilterEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_list_view);
mFilterEditText = (EditText) findViewById(R.id.filter_edittext);
InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0);
}
}
Упростить
- На странице входа (первая страница) я хочу, чтобы моя клавиатура была видна при запуске.
- На SecondPage я хочу, чтобы клавиатура была спрятана первой, только чтобы она появлялась, когда пользователь касается editText
И моя проблема в том, что в обоих случаях я получаю совершенно противоположное... Надеюсь, кто-то сталкивался с этой проблемой раньше. Кстати, я тестирую на симуляторе и телефоне HTC Desire.
ЗАКЛЮЧИТЕЛЬНЫЙ ИТОГ
Ну, я получил это с помощью всех друзей здесь.
1. Показать клавиатуру при запуске
Два ответа спомогли мне. Один предоставлен @CapDroid, который должен использовать обработчик и публиковать его с задержкой.
mUserNameEdit.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(mUserNameEdit, 0);
}
},50);
Вторые ответы дает @Dyarish. На самом деле он связался с другой SO-темой, которую я раньше не видел. Но забавно то, что это решение дано в теме, на которую я ссылался в начале. И я не пробовал, потому что у него было ноль голосов в ветке, где все остальные посты имеют много голосов.. Высота глупости..
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Для меня второе решение выглядело опрятно, поэтому я решил придерживаться его... Но первое, безусловно, работает. Кроме того, ответ @Dyarish содержит хитрый способ использования ScrollView под EditText, чтобы придать EditText фокус... Но я не пробовал, но он должен работать. Не аккуратно, хотя..
2. Спрятать клавиатуру при запуске активности
У меня работал только один ответ, предоставленный @Dyarish. И решение состоит в том, чтобы использовать настройки focusableInTouchMode в xml для макета, содержащего тексты редактирования. Это сделал трюк
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:focusableInTouchMode="true">
<EditText android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
В любом случае, я заканчиваю тем, что использую ответ Дьяриша в обоих случаях. Так что я присуждаю ему награду.. Спасибо всем другим друзьям, которые пытались мне помочь..
Ответы
Ответ 1
Добавление этого кода в ваш код android:focusableInTouchMode="true"
гарантирует, что ваша клавиатура не появится при запуске для вашего окна edittext. Вы хотите добавить эту строку в свой линейный макет, который содержит EditTextBox. Вы должны быть в состоянии играть с этим, чтобы решить ваши проблемы. Я проверил это. Простое решение.
ie: В файле app_list_view.xml
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:focusableInTouchMode="true">
<EditText
android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search"
android:inputType="text"
android:maxLines="1"/>
<ListView
android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
------------------ РЕДАКТИРОВАТЬ: Сделать клавиатуру при запуске -------------- ---------
Это нужно сделать, чтобы клавиатура отображалась в имени пользователя edittextbox при запуске. Все, что я сделал, добавлено пустой Scrollview в конец файла .xml, это ставит первый edittext в фокус и всплывает клавиатура. Я признаю, что это взломать, но я предполагаю, что вы просто хотите, чтобы это работало. Я тестировал его, и он отлично работает.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip">
<EditText
android:id="@+id/userName"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Username"
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="1"
/>
<EditText
android:id="@+id/password"
android:password="true"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Password" />
<ScrollView
android:id="@+id/ScrollView01"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
</ScrollView>
</LinearLayout>
Если вы ищете более красноречивое решение, я нашел этот вопрос, который может вам помочь, это не так просто, как решение выше, но, вероятно, лучшее решение. Я не тестировал его, но он, по-видимому, работает. Я думаю, что это похоже на решение, которое вы пробовали, но не работали для вас.
Надеюсь, это то, что вы ищете.
Ура!
Ответ 2
ОБНОВЛЕНИЕ 2
@Override
protected void onResume() {
super.onResume();
mUserNameEdit.requestFocus();
mUserNameEdit.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
InputMethodManager keyboard = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(mUserNameEdit, 0);
}
},200); //use 300 to make it run when coming back from lock screen
}
Я очень старался и обнаружил решение... всякий раз, когда начинается новое действие, клавиатура не открывается, но мы можем использовать Runnable в onResume, и он отлично работает поэтому, пожалуйста, попробуйте этот код и проверьте...
ОБНОВЛЕНИЕ 1
добавьте эту строку в свой AppLogin.java
mUserNameEdit.requestFocus();
и эта строка в вашем AppList.java
listview.requestFocus()'
после проверки вашей заявки, если она не работает, добавьте эту строку в свой AndroidManifest.xml
файл
<activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity>
<activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity>
ОРИГИНАЛЬНЫЙ ОТВЕТ
InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
для скрытия клавиатуры
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);
для show keyboard
imm.showSoftInput(ed, 0);
для фокусировки на EditText
ed.requestFocus();
где ed - EditText
Ответ 3
Попробуйте этот код.
Для показа Softkeyboard:
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}
Для скрытия SoftKeyboard -
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
Ответ 4
Вы пробовали InputMethodManager.SHOW_IMPLICIT
в первом окне.
и для скрытия во втором окне используйте InputMethodManager.HIDE_IMPLICIT_ONLY
РЕДАКТИРОВАТЬ:
Если его все еще не работает, возможно, вы помещаете его в неправильное место. Переопределите onFinishInflate()
и покажите/скройте там.
@override
public void onFinishInflate() {
/* code to show keyboard on startup */
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}