Android - программно скрыть / показать программную клавиатуру

Возможный дубликат:
Как закрыть / скрыть программную клавиатуру 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. Фактически, он связан с другим потоком SOF, которого я раньше не видел. Но самое забавное, что это решение дано в ветке, на которую я ссылался в начале. И я не пробовал его, потому что у него было нулевое количество голосов в ветке, где за все другие сообщения было много голосов. Высота глупости.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Для меня второе решение выглядело изящным, поэтому я решил придерживаться его .. Но первое, безусловно, работает. Кроме того, ответ @Dyarish содержит умный способ использования ScrollView под EditText, чтобы дать EditText фокус. Но я не пробовал, но должно работать. Хотя не изящно.

2. Чтобы скрыть клавиатуру в начале действия

У меня сработал только один ответ, который предоставил @Dyarish. И решение состоит в том, чтобы использовать настройки focusableInTouchMode в XML для макета, содержащего EditTexts. Это помогло

<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> 

В любом случае, в обоих случаях я использую ответ Дьяриша. Итак, я вручаю ему награду. Спасибо всем моим друзьям, которые пытались мне помочь.


person Krishnabhadra    schedule 26.08.2011    source источник
comment
@ user7777777777 Я отредактировал свой вопрос ... но не работает ... Я тоже пробовал с разными флагами вместо 0 ..   -  person Krishnabhadra    schedule 26.08.2011
comment
см. мой ответ новое обновление, он работает на моей стороне ...   -  person Niranj Patel    schedule 30.08.2011
comment
Макет app_login.xml не является полным файлом макета. Выложите, пожалуйста, полный макет.   -  person Ronnie    schedule 30.08.2011
comment
Макет app_login.xml не является файлом полного макета Имеет ли это значение?   -  person Krishnabhadra    schedule 30.08.2011
comment
Спасибо! Рад, что это сработало для вас. = D   -  person Dave    schedule 02.09.2011
comment
@krishnabhadra: работает! но я не понимаю, что означает focusableintouchmode = true?   -  person Ashwin    schedule 22.06.2012
comment
возможно ваш ответ: stackoverflow.com/a/1109108/779408   -  person Bobs    schedule 26.01.2013
comment
postDelayed отлично работает со мной   -  person Mohamd Ali    schedule 06.01.2016
comment
Его можно легко показать и скрыть с помощью удобных методов, но не существует реализованного способа отлова, когда пользователь решает скрыть его. Из-за этих ограничений я написал простой фрагмент кода, который, надеюсь, будет полезен. Он доступен здесь. Пользоваться им довольно просто.   -  person Iman Marashi    schedule 27.11.2016
comment
Необходимо поиграть с InputMethodManager с INPUT_METHOD_SERVICE для работы с такой мягкой клавиатурой, как readyandroid.wordpress. ru / show-hide-android-soft-keyboard   -  person Ready Android    schedule 08.08.2018


Ответы (4)


Добавление этого к вашему коду android:focusableInTouchMode="true" гарантирует, что ваша клавиатура не появится при запуске для вашего поля редактирования. Вы хотите добавить эту строку в свой линейный макет, содержащий EditTextBox. Вы должны иметь возможность поиграть с этим, чтобы решить обе свои проблемы. Я это проверил. Простое решение.

то есть: в вашем файле 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> 

------------------ РЕДАКТИРОВАТЬ: чтобы клавиатура отображалась при запуске ----------------- ------

Это сделано для того, чтобы клавиатура отображалась в поле редактирования имени пользователя при запуске. Все, что я сделал, - это добавил пустой Scrollview в конец файла .xml, это помещает первый текст редактирования в фокус и открывает клавиатуру. Я признаю, что это взлом, но я предполагаю, что вы просто хотите, чтобы это работало. Я протестировал его, и он отлично работает.

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

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

Надеюсь, это то, что вы ищете.

Ваше здоровье!

person Dave    schedule 01.09.2011
comment
Ну Дьяриш, Ваши решения наверняка прячут клавиатуру. Теперь позвольте мне поиграть, чтобы показать клавиатуру при запуске - person Krishnabhadra; 01.09.2011
comment
Привет, Кришнабхадра, у меня есть два возможных решения, которые должны сработать. Первый - своего рода взлом, но я протестировал его с вашим кодом, и он работает. (Признаюсь, я не знаю почему, но это, вероятно, связано со свойствами этого представления) Я отредактировал свой ответ, чтобы отразить эти решения. Сообщите мне, работает ли это для вас. Ваше здоровье. - person Dave; 02.09.2011
comment
Как ни странно, сработало только решение ScrollView, я пробовал другие, более красноречивые решения, но они не работали. - person EpicPandaForce; 19.03.2015
comment
Однако в режиме прокрутки клавиатура появляется только при первом запуске, а это означает, что если вы заблокируете экран, а затем вернетесь, он больше не будет запускаться. Поэтому я использовал следующий stackoverflow.com/a/29229865/2413303, чтобы программно вызывать клавиатуру (с задержкой , потому что иначе это не сработало). - person EpicPandaForce; 24.03.2015

ОБНОВЛЕНИЕ 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); 

для шоу клавиатуры

 imm.showSoftInput(ed, 0);

для фокусировки на EditText

 ed.requestFocus();

где ed - EditText

person Niranj Patel    schedule 26.08.2011
comment
@sHaH ну это тот же ответ из темы, на которую я ссылался в вопросе, верно? Единственная разница в том, что вы пробовали Service.INPUT_METHOD_SERVICE вместо Context.INPUT_METHOD_SERVICE, который я пробовал .. - person Krishnabhadra; 26.08.2011
comment
Также я попробовал, как ваше предложение, и добавил requestFocus (), но безрезультатно .. В любом случае спасибо за предложение .. :) - person Krishnabhadra; 26.08.2011
comment
см. мой обновленный ответ ... - person Niranj Patel; 29.08.2011
comment
неа .. Не работает .. Расстраиваюсь .. :( - person Krishnabhadra; 30.08.2011
comment
Сообщалось об этом? - person Krishnabhadra; 30.08.2011
comment
Я также пробую ваш код ... и я был шокирован ... клавиатура не открыта ни при каких действиях ни в логине, ни в списке .. - person Niranj Patel; 30.08.2011
comment
Ооо, человек, я нашел решение, проверьте мой ответ на новое обновление, и он будет работать нормально .... :) - person Niranj Patel; 30.08.2011
comment
Что ж, ваше решение, безусловно, работает, но можете ли вы понять, почему оно не сработало без этого сообщения с задержкой? - person Krishnabhadra; 31.08.2011
comment
Я не уверен, но, возможно, мы не можем открыть клавиатуру в методе onCreate () в средстве запуска ... - person Niranj Patel; 31.08.2011
comment
Чувак твоя проблема решена или нет? - person Niranj Patel; 01.09.2011
comment
@CapDroid: +1 и спасибо, ваш код полезен и помог мне при просмотре .. - person Pattabi Raman; 02.04.2012
comment
@ Raman-Mystry спасибо и добро пожаловать - person Niranj Patel; 02.04.2012
comment
добавьте это в свой activity в manifest файле: android:windowSoftInputMode="stateVisible" - person Alex; 13.03.2013
comment
вы можете попробовать ‹public void onWindowFocusChanged (boolean hasFocus)›, чтобы отобразить клавиатуру, но не забудьте проверить, получили ли вы фокус в первый раз - person Mario; 17.03.2013
comment
Чтобы скрыть клавиатуру позже, используйте тот же код, что и выше, но измените одну строку на keyboard.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); - person Nikola M.; 30.06.2013
comment
Решение postDelayed у меня тоже работает. +1 - person Sandra; 24.02.2014
comment
НЕ устанавливайте никаких флагов, когда показать / скрыть мягкую клавиатуру - это решение моей проблемы. Благодарность! - person xialin; 17.12.2014
comment
Вам нужно 300 мс задержки, чтобы он всегда срабатывал при возврате с экрана блокировки, потому что 250, например, было недостаточно, как я пробовал. Но хороший ответ, это то, что в конечном итоге сработало для меня, хотя я увидел это только после того, как написал этот ответ stackoverflow.com/a/29229865/ 2413303 - person EpicPandaForce; 24.03.2015
comment
Для Samsung Galaxy S9 вы должны использовать 400 мс. И несколько секунд для будущих устройств. Это не похоже на хорошее решение. - person Dmitry; 07.09.2018

Попробуйте этот код.

Для отображения экранной клавиатуры:

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);
    }
person Lalit Poptani    schedule 26.08.2011
comment
Вы уверены, что аргументы toggleSoftInput для отображения клавиатуры верны? - person Krishnabhadra; 26.08.2011
comment
Я спросил, потому что в документации toggleSoftInput сказано, что первый аргумент - это флаг для отображения, а второй аргумент - это флаг для скрытия .. Вы указали InputMethodManger.SHOW_IMPLICIT в качестве второго аргумента .. Почему я спросил? - person Krishnabhadra; 26.08.2011
comment
В любом случае я попробовал оба способа .. ничего не помогло .. - person Krishnabhadra; 26.08.2011
comment
Вы можете увидеть ответ, который я дал по этому поводу в моем профиле, он работает таким же образом stackoverflow.com/questions/7187137/ - person Lalit Poptani; 26.08.2011
comment
Я попробовал оба варианта .. но ничего не вышло .. - person Krishnabhadra; 26.08.2011
comment
Это должно быть [imm.toggleSoftInput (InputMethodManager.SHOW_IMPLICIT, 0);], чтобы отображалось, чтобы [imm.toggleSoftInput (0, InputMethodManager.HIDE_IMPLICIT_ONLY);] работал для скрытия. - person Aung Pyae; 05.09.2014
comment
Спасибо, работает. Как сказал Аунг Пяэ - убедитесь, что при открытии клавиатуры используется toggleSoftInput, чтобы вы могли закрыть ее, используя тот же метод. Если вы откроете клавиатуру с помощью showSoftInput, то закрыть ее с помощью toggleSoftInput не получится. - person Marko Niciforovic; 09.09.2014
comment
Эти коды работали во всех случаях. Полностью сработало. Совершенно хорошо. - person Huy Tower; 09.09.2014
comment
если вы покажете клавиатуру со своим кодом, а затем скроете ее, нажав назад, ваш код больше не будет работать правильно. - person lenooh; 11.01.2018

Вы пробовали 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);
}
person Ronnie    schedule 26.08.2011
comment
да, друг .. Я пробовал использовать InputMethodManager.SHOW_FORCED, InputMethodManager.SHOW_IMPLICIT и т. д. Также я просто передал 0 вместо этих констант .. Ничего не сработало .. - person Krishnabhadra; 26.08.2011
comment
Я попробовал ваше первое редактирование (showSoftInputFromInputMethod), которое не сработало .. Кстати, как использовать второй метод (showSoftInput)? - person Krishnabhadra; 29.08.2011
comment
onFinishInflate () класса активности .. Я не могу найти это в документации .. Фактически onFinishInflate - это метод в классе View .. Как я могу использовать его здесь .. - person Krishnabhadra; 30.08.2011
comment
В порядке. Попробуйте в onStart() или onWindowFocusChanged() - person Ronnie; 30.08.2011
comment
извини, друг, тоже пробовал .. Но не сработало .. - person Krishnabhadra; 30.08.2011