Программно скрыть/показать 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);
   }
}

Упростить

  1. На странице входа (первая страница) я хочу, чтобы моя клавиатура была видна при запуске.
  2. На 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);
}