2012-01-05 5 views
12

Mam FragmentActivity, który początkowo wyświetla fragment z kilkoma przyciskami na nim. Po kliknięciu jednego z przycisków FragmentActivity wyświetla nowy fragment z niektórymi polami editText. Nie wydaje mi się, aby klawiatura z miękkim wejściem była wyświetlana po wyświetleniu mojego nowego fragmentu z polami editText.SoftKeyboard nie wyświetla się dla nowo wyświetlanego fragmentu

Korzystanie z trybu windowSoftInput w manifeście jest obecnie wyświetlane natychmiast po wyświetleniu klawiatury.

android:windowSoftInputMode="stateUnchanged" 

Próbowałem, używając

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

bezskutecznie. Oto jak wyświetlić nowy fragment z mojej działalności:

public void clickHandler(View view) { 
     switch (view.getId()) { 
     case R.id.login: 
      loginFragment = new LoginFragment(); 
      FragmentTransaction transaction = getSupportFragmentManager() 
        .beginTransaction(); 

      transaction.replace(R.id.fragment_container, loginFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
      break; 

...

Próbowałem również nazywając setSoftInputMode od wewnątrz fragmentu w onCreate i że nie pracował, jak również. Myśląc, że to był problem z timingiem, spróbowałem go z handler.postDelayed i to też nie działa. Wyglądało to tak:

onResume...  
Handler handler = new Handler(); 
      Runnable runnable = new Runnable() { 

       @Override 
       public void run() { 
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);     
       } 
      }; 

      handler.postDelayed(runnable, 1000); 

Każda pomoc zostanie doceniona. Dzięki.

+0

Wiem, że to stary, ale na przyszłość : Wierzę, że Window.setSoftInputMode musi zostać wykonany jeden raz w działaniu onCreate, ponieważ później wydaje się nie działać. Podczas działania, InputMethodManager musi być użyty do zmian. – ProjectJourneyman

Odpowiedz

19

na własną onResume można to zrobić:

EditText someEditText = (EditText)getActivity().findViewById(R.id.someEditText); 
someEditText.requestFocus(); 
InputMethodManager mgr =  (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
mgr.showSoftInput(someEditText, InputMethodManager.SHOW_IMPLICIT); 
+0

Dziękujemy! to zadziałało –

+0

Nie ma za co Nelson: D – jegumi

+4

nie działa dla mnie. – feresr

4

miałem bardzo podobny problem. Fragment A wywołuje fragment B, w którym fragment B (Układ z TABS) zawiera EditText. Klawiatura nie wyświetliłaby się w polu EditText, chyba że kliknę coś innego.

Próbowałem rozwiązania tutaj i na wiele innych rozwiązań stackoverflow. WIELE. Jedynym, który pracował dla mnie, było skupienie się na EditText po kliknięciu EditText. W OnFocusChangeListener byłem w stanie zmusić klawiaturę do otwarcia i zamknięcia.

Ten problem wystąpił tylko w przypadku urządzeń z Androidem 2.34, a nie 2.2 lub 3.0. Emulator również nie miał problemów. Manifest miał tylko adjustResize w nim.

Więc oto rozwiązanie, które pracował dla mnie (mam nadzieję, że ktoś znajdzie to przydatne):

W onCreateView (...)

// 
    //Inflate Your Layout Here 
    // 

    //set on focus to force keyboard 
    editText.setOnFocusChangeListener(new OnFocusChangeListener() 
    { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) 
     { 
      Log.d(TAG,"On Foucs. Has Focus = " + hasFocus); 

      if (hasFocus) 
      { 
       //open keyboard 
       ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(v, 
         InputMethodManager.SHOW_FORCED); 
      } 
      else 
      { 
       //close keyboard 
       ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(
         v.getWindowToken(), 0); 
      }        
     } 
    }); 

    //Set on click listener to clear focus 
    editText.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View clickedView) 
     {       
      clickedView.clearFocus(); 
      clickedView.requestFocus();        
     }  
    });  
+0

Wiedziałem o tym małym dziwactwie, ale o tym zapomniałem. Dziękujemy za przesłanie wiadomości. Pomógł mi kilka :-) – George

+0

Wielkie dzięki, próbowałem również na wiele sposobów, to jedyne rozwiązanie. – thanhbinh84