2013-03-13 17 views
11

Mam w mojej aplikacji Fragment, która pokazuje DialogFragment.
Mam w fragmencie przycisk zamykający okno dialogowe. Ale kiedy pokazuję dialogFragment, dotknięcia na zewnątrz z okna dialogowego nic nie robią i nie mogę kliknąć przycisków na zewnątrz z fragmentu okna dialogowego.Zezwalaj na dotyk zewnętrzny dla DialogFragment

Jak mogę zezwolić na zewnętrzne dotknięcia dla DialogFragment?

Odpowiedz

15

W tym celu, flagę Window który pozwala na zewnątrz dotyk powinien być włączony, a na dobry wygląd flaga przyciemnienia tła powinna zostać wyczyszczona.
Ponieważ musi to być zrobione po utworzeniu okna dialogowego, zaimplementowałem je za pomocą 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(); 
     } 
    }); 
} 

W tym momencie możliwy jest kontakt zewnętrzny.

W przypadku chcemy, aby to ładniejszy i bez ramy, następujący kod można dodać:

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

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

Musisz ustawić styl odpowiedni do swoich potrzeb. Możesz przeczytać więcej o stylach FragmentDialogs w official docs.

wierzę, można użyć poniższy styl:

  • STYLE_NO_FRAME
+0

Ja już pracuje z STYLE_NO_FRAME i jest jedynym, który dla mnie OK (od UI). – Yaniv

+1

@ yaniv to pora na pokazanie kodu :) – Warpzit

3

Jest to bardziej ogólne flag, aby umożliwić wszelkie działania nie tylko dotknąć działania

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

Znalazłem alternatywny sposób radzenia sobie z odrzuceniem na dotyk na zewnątrz. Proszę sprawdzić poniżej próbki kodu, który na pewno działa,

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

W moim przypadku był coraz getDialog(), a nie wartość null, ale getDialog(). Oddalenie() nie działa. Rozwiązanie, które jest oznaczone jako powyżej, również nie działa w moim przypadku. Tak więc podjąłem to podejście.

0

Cóż, bądźmy konkretni. Jeśli chcesz pracować z widokami zewnętrznymi, nie powinieneś używać fragmentu okna, użyj fragmentu zamiast tego.

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

i uczynić wrap_content układ, który będzie pozornie wygląda jak Dialog i domyślnie jest on umieszczony w górnej części ekranu.

Aby uzyskać więcej informacji prosimy odwiedzić here

Powiązane problemy