2013-04-29 34 views
10

Nếu edittext hiện được tập trung và người dùng nhấp vào bên ngoài DialogFragment; Tôi muốn bàn phím trên màn hình biến mất. Tôi có thể lấy nó để làm việc cho khi DialogFragment đang đuổi theo cách này:Cách ẩn bàn phím ảo khi DialogFragment bị hủy bởi sự kiện 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(); 
} 

Tuy nhiên, nếu tôi cố gắng điều tương tự cho khi nó bị hủy bằng cách chạm bên ngoài của dialogfragment, nó sẽ không làm việc. Tôi đang cố gắng thực hiện điều này bằng cách ghi đè lênHủy như vậy:

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

Chức năng này được gọi khi sự kiện cảm ứng bên ngoài xảy ra, nhưng bàn phím không bị xóa.

+0

Bạn cần phải ghi đè 'onDismiss() 'phương pháp trong' bạn DialogFragment' và ẩn bàn phím từ đó. – Clans

Trả lời

0

Thử thêm onDismissListener như thế này.

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 

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

Tôi thích ý tưởng này, nhưng nó không hoạt động. Trong thực tế, nếu DialogFragment bị loại bỏ bởi sự kiện bên ngoài touch, OnDissmissListener bị bỏ qua. Tôi biết onCancel được gọi khi chạm vào sự kiện bên ngoài xảy ra, nhưng hideSoftInputFromWindow không làm bất cứ điều gì trong tình huống này. – JaRay

+0

Chế độ xem nào sẽ gọi bàn phím? Thay vì 'getView()' sử dụng tiện ích thực tế, hãy gọi bàn phím để loại bỏ nó. –

+0

Tôi đã không sử dụng tiện ích thực tế vì chúng là nhiều tiện ích văn bản có sẵn trên màn hình. Tuy nhiên, tôi đã chọn một để thử đề xuất của bạn, và nó vẫn không hoạt động. – JaRay

2

Đây là những gì tôi đã làm để có được điều này cuối cùng làm việc ... Tôi không cần sử dụng tiện ích con cho bàn phím ... nhưng sử dụng currentfocus để lấy cửa sổ để xóa bàn phím khi người dùng đã chọn bên ngoài hộp thoại ...

@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

Tôi có cùng một vấn đề với ime, điều này đã không làm việc cho tôi: ( – Eduard

+0

Điều này làm việc liên tục cho tôi.Cảm ơn.Tuy nhiên, tôi không biết bạn đang làm gì với lớp Utilities của bạn? Ý bạn là gì bởi isValidActivity ? – Tariq

+0

Điều gì làValidActivity? – 1911192110920

2

Tôi đã có thể giải quyết vấn đề tương tự bằng cách phân lớp hộp thoại và ẩn bàn phím trước khi mã hủy trên hộp thoại được thực hiện.

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

Tôi đã thử nhiều cách tiếp cận thay thế bao gồm sử dụng onCancel của DialogFragment và onDimiss nghe không có kết quả. Tôi tin rằng vấn đề là người nghe được gọi là không đồng bộ trong khi việc bỏ/hủy được xử lý đồng bộ; vì vậy vào thời gian người nghe của bạn được gọi là ẩn bàn phím, mã thông báo cửa sổ không còn tồn tại nữa.

+1

Điều này cho cùng một vấn đề, hủy() được gọi, nhưng ime vẫn mở. – Eduard

+0

Đây là ứng dụng duy nhất hữu ích. –

1

tôi đã cùng một vấn đề và giải quyết nó bằng cách đặt này trong AndroidManifest dưới hoạt động nơi tôi sinh ra các DialogFragment:

android:windowSoftInputMode="stateHidden" 
Các vấn đề liên quan