Programowo Ukryj / Pokaż miękką klawiaturę Androida [duplikat]

Możliwy duplikat:
Zamknij / Ukryj miękką klawiaturę Androida

Pierwsza rzecz, którą widziałem już ten wątek. Próbowałem przyjętych metod..Ale dla mnie nic nie działało..

Mam dwa ekrany w mojej aplikacji.

  • pierwszy ma 2 EditText - jeden dla nazwy użytkownika i jeden dla hasła
  • drugi ma jeden ListView i EditText - do filtrowania listView

W moim pierwszym screen, I want username EditText to have focus on startup and Keyboard should be visible ..To jest moja implementacja (uproszczona przez usunięcie zbędnych / niepowiązanych kodów)..

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>

Aplogin.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()
}

Cóż, klawiatura nie wyświetla się przy starcie. A mój projekt źle wymaga klawiatury..

Przejdźmy teraz do drugiej strony..Już powiedziałem, że mam tam listView i EditText..chcę, żeby moja klawiatura była ukryta przy uruchomieniu pojawia się tylko wtedy, gdy użytkownik dotknie editText ..Dasz wiarę? cokolwiek próbowałem miękka klawiatura pokazuje, gdy Ładuję aktywność ..Nie jestem w stanie tego ukryć..

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);
   }
}

Aby uprościć

  1. na stronie logowania (pierwsza strona) chcę, aby moja klawiatura była widoczna na start..
  2. na SecondPage chcę aby klawiatura była najpierw ukryta, tylko żeby się pojawiła gdy użytkownik dotyka editText

A mój problem polega na tym, że w obu przypadkach mam dokładnie odwrotnie ...Mam nadzieję, że ktoś stanął przed tym problemem..BTW testuję na simulatorze i telefonie HTC Desire..

KOŃCOWY WYNIK

Cóż, udało mi się, z pomocą wszystkich przyjaciół tutaj.

1. Aby wyświetlić klawiaturę przy starcie

Dwie odpowiedzi mi pomogły. jeden dostarczony przez @ CapDroid, który polega na użyciu Handlera i wysłaniu go z opóźnieniem..
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);

Drugi odpowiedzi udziela @Dyarish, w rzeczywistości linkował do innego wątku SO, którego wcześniej nie widziałem. Ale zabawne jest to, że to rozwiązanie jest podane w wątku, do którego odwołałem się na początku. I nie próbowałem to dlatego, że miał zero głosów w wątku, w którym wszystkie inne posty mają mnóstwo głosów..Szczyt głupoty..

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

Dla mnie drugie rozwiązanie wyglądało schludnie, więc zdecydowałem się go trzymać..Ale pierwszy z pewnością działa. Również odpowiedź @Dyarish zawiera sprytny hack użyj widoku przewijania poniżej EditText, aby nadać edittextowi fokus..Ale nie próbowałem, ale powinno zadziałać. Ale nie schludnie..

2. Aby ukryć klawiaturę na początku aktywności

Tylko jedna odpowiedź zadziałała dla mnie, która jest dostarczana przez @Dyarish. A rozwiązaniem jest użycie focusableInTouchMode settings w xml dla układu zawierającego editText. this did the trick

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

W każdym razie używam odpowiedzi Dyarisha w obu przypadkach. Więc przyznam nagrodę dla on.Dzięki wszystkim znajomym który próbował mi pomóc..

Author: Cœur, 2011-08-26

4 answers

Dodanie tego do kodu android:focusableInTouchMode="true" sprawi, że klawiatura nie pojawi się podczas uruchamiania dla Twojego pola edittext. Chcesz dodać tę linię do układu liniowego, który zawiera EditTextBox. Powinieneś być w stanie grać z tym, aby rozwiązać oba swoje problemy. Przetestowałem to. Proste rozwiązanie.

Ie: w app_list_view.plik 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> 

------------------ EDIT: aby klawiatura pojawiała się przy starcie -----------------------

To jest po to, aby Klawiatura pojawia się na nazwie użytkownika edittextbox przy starcie. Wszystko, co zrobiłem, to dodanie pustego widoku przewijania na dole .plik xml, to stawia pierwszy edittext w centrum uwagi i wyskakuje klawiatura. Przyznaję, że to włamanie, ale zakładam, że chcesz, żeby to zadziałało. Przetestowałem go i działa dobrze.

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

Jeśli szukasz bardziej wymownego rozwiązania, znalazłem to pytanie, które może Ci pomóc, nie jest tak proste jak rozwiązanie powyżej, ale prawdopodobnie lepsze rozwiązanie. Nie testowałem go, ale najwyraźniej działa. Myślę, że jest to podobne do rozwiązania, które wypróbowałeś, które nie działało dla Ciebie.

Mam nadzieję, że tego właśnie szukasz. Zdrówko!
 124
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:11

UPDATE 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
    }
Bardzo się starałem i znalazłem rozwiązanie ... kiedy zaczyna się nowa aktywność, klawiatura nie może się otworzyć, ale możemy użyć Runnable in onResume i działa dobrze, więc proszę spróbować tego kodu i sprawdzić...

UPDATE 1

Dodaj ten wiersz w swoim AppLogin.java

mUserNameEdit.requestFocus();

I ten wiersz w Twoim AppList.java

listview.requestFocus()'

Po tym Sprawdź swoją aplikację, jeśli nie działa to dodaj tę linię w swoim AndroidManifest.xml Plik

<activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity>
<activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity>

ORYGINALNA ODPOWIEDŹ

 InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);

Do ukrycia klawiatury

 imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); 

Do wyświetlania klawiatury

 imm.showSoftInput(ed, 0);

For focus on EditText

 ed.requestFocus();

Gdzie ed to EditText

 158
Author: Niranj Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 10:33:00

Spróbuj tego kodu.

Za pokazanie Softkeyboard:

InputMethodManager imm = (InputMethodManager)
                                 getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }

Do Ukrywania SoftKeyboard -

InputMethodManager imm = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }
 52
Author: Lalit Poptani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-04 22:20:06

Czy próbowałeś InputMethodManager.SHOW_IMPLICIT w pierwszym oknie.

I do ukrycia w drugim oknie użyj InputMethodManager.HIDE_IMPLICIT_ONLY

EDIT:

jeśli nadal nie działa, prawdopodobnie umieszczasz go w niewłaściwym miejscu. Obejdź onFinishInflate() i pokaż / ukryj tam.

@override
public void onFinishInflate() {
     /* code to show keyboard on startup */
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}
 8
Author: Ronnie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-30 04:29:12