2013-04-29 12 views
10

Jeśli edittext jest aktualnie skupiony i użytkownik kliknie poza DialogFragment; Chcę, żeby klawiatura na ekranie zniknęła. mogę zmusić go do pracy dla kiedy DialogFragment została zwolniona w ten sposób:Jak ukryć klawiaturę ekranową, gdy DialogFragment jest anulowany przez zdarzenie setCanceledOnTouchOutside

InputMethodManager imm; 
public View onCreateView(LayoutInflater inflator, ViewGroup container, 
     Bundle savedInstanceState) { 
imm = (InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); 
...} 

@Override 
public void dismiss(){ 
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); 
    super.dismiss(); 
} 

Jednakże jeśli próbuję samo dla kiedy to został odwołany przez dotknięcie zewnątrz dialogfragment, to nie będzie działać. Staram się to zrobić poprzez nadpisanie onCancel tak:

@Override 
public void onCancel(DialogInterface dialog){ 
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); 
    super.onCancel(dialog); 
} 

Funkcja jest wywoływana, gdy poza zdarzenie dotykowy dzieje, ale klawiatura nie jest usuwany.

+0

Trzeba zastąpić 'onDismiss()' 'w sposób DialogFragment' i ukryj klawiaturę. – Clans

Odpowiedz

0

Spróbuj dodać w ten sposób onDismissListener.

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 

     @Override 
     public void onDismiss(DialogInterface dialog) { 
      // TODO Auto-generated method stub 
      dismiss(); 
      } 
     }); 
+0

Podoba mi się pomysł, ale to nie działa. W rzeczywistości, jeśli DialogFragment zostanie odrzucony przez zewnętrzne wydarzenie dotykowe, OnDissmissListener jest ignorowany. Wiem, że onCancel jest wywoływany, gdy dzieje się zdarzenie zewnętrzne, ale hideSoftInputFromWindow nie robi nic w tej sytuacji. – JaRay

+0

Który widok wywołuje klawiaturę? Zamiast 'getView()' użyj rzeczywistego widgetu wywołującego klawiaturę, aby go odrzucić. –

+0

Nie korzystałem z rzeczywistego widżetu, ponieważ są to widżety wielokrotnego edytowania dostępne na ekranie. Jednak wybrałem jeden, aby wypróbować twoją sugestię i nadal nie działa. – JaRay

2

To, co zrobiłem, aby uzyskać to, by w końcu działa ... I potrzebne, aby nie używać widżet na klawiaturze ... ale używać currentfocus uzyskać windowtoken usunąć klawiaturę, gdy wybrany użytkownik coś poza okna ...

@Override 
public void onStop() { 
    // make sure the keyboard goes away when the user selects something outside the view (cancelled outside) 
    if(Utilities.isValidActivity(this.getActivity())) { 
     InputMethodManager imm = (InputMethodManager)this.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
     // not the search view but the current focus at this point 
     imm.hideSoftInputFromWindow(this.getActivity().getCurrentFocus().getWindowToken(), 0);       
    } 
    super.onStop(); 
} 
+0

Mam ten sam problem z IME, to nie działało dla mnie :( – Eduard

+0

To działało konsekwentnie dla mnie.Dziękuję.Chociaż nie wiem, co sprawdzasz z klasy Utilities? Co masz na myśli przez isValidActivity ? – Tariq

+0

co to jest isValidActivity? – 1911192110920

2

udało mi się rozwiązać ten sam problem sub-classing okno i ukrywa klawiaturę przed oznaczeniem anulować w oknie dialogowym został stracony.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = new Dialog(getActivity(), getTheme()) { 
     @Override public void cancel() { 
      if (getActivity() != null && getView() != null) { 
       InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); 
      } 
      super.cancel(); 
     } 

    }; 
    return dialog; 
} 

Próbowałem wiele alternatywnych rozwiązań w tym przy użyciu onCancel i onDimiss słuchaczom DialogFragment za bezskutecznie. Uważam, że problem polega na tym, że słuchacze są nazywani asynchronicznie, podczas gdy odwołanie/anulowanie jest obsługiwane synchronicznie; więc do czasu, gdy Twój słuchacz zostanie wezwany do ukrycia klawiatury, token okna już nie istnieje.

+1

Daje to ten sam problem, wywoływana jest funkcja cancel(), ale plik ime pozostaje otwarty. – Eduard

+0

Jest to jedyny, który pomógł. –

1

miałem ten sam problem i rozwiązać go poprzez umieszczenie tego w ramach działania AndroidManifest gdzie ikra DialogFragment:

android:windowSoftInputMode="stateHidden" 
Powiązane problemy