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> 

Както и да е, в крайна сметка използвам отговора на Dyarish и в двата случая. Така че присъждам наградата на него. Благодаря на всички други мои приятели, които се опитаха да ми помогнат.


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. com/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
Добре Dyarish, Вашите решения със сигурност крият клавиатурата. Сега нека си поиграя с това, за да покажа клавиатурата при стартиране - 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
Е, вашето решение със сигурност работи, но можете ли да разберете защо не работи без този postDelayed? - 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 ms закъснение, за да го накарате винаги да се задейства при връщане от заключен екран, защото 250 например не бяха достатъчни, както пробвах. Но хубав отговор, това е, което в крайна сметка проработи за мен, въпреки че видях това едва след като написах този отговор stackoverflow.com/a/29229865/ 2413303 - person EpicPandaForce; 24.03.2015
comment
За Samsung Galaxy S9 трябва да използвате 400ms. И няколко секунди за бъдещи устройства. Това не изглежда като добро решение. - 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
Благодаря, работи. Както каза Aung Pyae - уверете се, че когато отваряте клавиатурата, използвате 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), която не проработи..BTW как да използвам втория метод (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