2013-03-13 29 views
11

Tôi có một số Fragment trong ứng dụng hiển thị số DialogFragment.
Tôi có trong đoạn một nút đóng hộp thoại. Nhưng khi tôi hiển thị hộp thoạiFragment, các chạm bên ngoài từ hộp thoại không làm gì cả và tôi không thể nhấp vào các nút bên ngoài từ đoạn hộp thoại.Cho phép liên lạc bên ngoài cho DialogFragment

Tôi làm cách nào để có thể cho phép chạm vào bên ngoài cho DialogFragment?

Trả lời

15

Để làm điều đó, một lá cờ của Window cho phép các liên lạc bên ngoài nên được bật và cho sự xuất hiện tốt cờ mờ nền phải được xóa.
Vì nó phải được thực hiện sau khi hộp thoại được tạo, tôi đã thực hiện nó qua Handler.

@Override 
public void onViewCreated(final View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // This is done in a post() since the dialog must be drawn before locating. 
    getView().post(new Runnable() { 

     @Override 
     public void run() { 

      Window dialogWindow = getDialog().getWindow(); 

      // Make the dialog possible to be outside touch 
      dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
      dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 

      getView().invalidate(); 
     } 
    }); 
} 

Tại thời điểm này, bạn có thể chạm vào bên ngoài.

Trong trường hợp chúng tôi muốn làm cho nó đẹp hơn và không có khung, mã sau đây có thể được thêm vào:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Hide title of the dialog 
    setStyle(STYLE_NO_FRAME, 0); 
} 
0

Bạn cần đặt phong cách phù hợp cho nhu cầu của mình. Bạn có thể đọc thêm về các kiểu cho FragmentDialogs trong official docs.

Tôi tin rằng bạn có thể sử dụng phong cách sau:

  • STYLE_NO_FRAME
+0

Tôi đã làm việc với STYLE_NO_FRAME, và nó là người duy nhất mà OK cho tôi (từ giao diện người dùng). – Yaniv

+1

@yaniv sau đó là lúc để hiển thị mã :) – Warpzit

3

Đây là lá cờ chung chung hơn để cho phép bất kỳ hành động không chỉ chạm vào hành động

window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
     WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 
1

Tôi đã tìm cách thay thế để xử lý việc loại bỏ liên lạc bên ngoài. Vui lòng kiểm tra dưới đây mẫu mã, mà chắc chắn sẽ làm việc,

@Override 
public void onStart() { 
    // mDialogView is member variable 
    mDialogView = getView(); 
    mDialogView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      float eventX = event.getRawX(); 
      float eventY = event.getRawY(); 

      int location[] = new int[2]; 
      mDialogView.getLocationOnScreen(location); 

      if (eventX < location[0] || eventX > (location[0] + mDialogView.getWidth()) || eventY < location[1] 
        || eventY > location[1] + mDialogView.getHeight()) { 
       dismiss(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

Trong trường hợp của tôi, tôi đã nhận được getDialog() là không giá trị null, nhưng getDialog(). Sa thải() đã không làm việc. Ngoài ra, giải pháp được đánh dấu là đúng ở trên, cũng không hoạt động trong trường hợp của tôi. Vì vậy, tôi đã sử dụng phương pháp này.

0

Vâng, chúng ta hãy cụ thể. Nếu bạn muốn làm việc với chế độ xem bên ngoài thì bạn không nên sử dụng phân đoạn hộp thoại, sử dụng phân đoạn thay thế như thế này.

FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    // For a little polish, specify a transition animation 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    // To make it fullscreen, use the 'content' root view as the container 
    // for the fragment, which is always the root view for the activity 
    transaction.add(android.R.id.content, newFragment) 
       .addToBackStack(null).commit(); 

Và bố cục wrap_content, trông sẽ giống như Hộp thoại và theo mặc định nó được đặt ở đầu màn hình.

Để biết thêm chi tiết vui lòng truy cập here

Các vấn đề liên quan