2013-03-13 71 views
11

我有一個Fragment在我的應用程序顯示DialogFragment
我在片段中有一個關閉對話框的按鈕。但是,當我顯示dialogFragment時,對話框外的觸摸什麼也不做,我不能單擊對話框片段之外的按鈕。允許外部觸摸對話框片段

我該如何允許外部接觸DialogFragment?

回答

15

爲了做到這一點,在Window,讓外界觸摸的標誌應被打開,爲良好的外觀應該清除背景昏暗標誌。
因爲它必須在創建對話框後完成,所以我通過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(); 
     } 
    }); 
} 

此時外面接觸是可能的。

如果我們想讓它更好,沒有框架,下面的代碼可以被添加:

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

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

您需要爲您的需要設置適當的樣式。您可以在official docs中閱讀更多關於FragmentDialogs的樣式。

我相信你可以使用以下方式:

  • STYLE_NO_FRAME
+0

我已經與STYLE_NO_FRAME工作,它是唯一一個OK的我(因爲UI)。 – Yaniv 2013-03-13 12:23:32

+1

@yaniv然後顯示代碼:) – Warpzit 2013-03-14 14:08:25

3

這是比較通用的標誌,以允許任何動作不僅觸摸操作

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

我找到了另一種方式來處理在外面接觸的解僱。請檢查下面的代碼示例,那肯定會的工作,

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

以我爲例,我是越來越getDialog()不爲空值,但getDialog()。解僱()不能正常工作。此外,標記爲正確的解決方案也不適用於我的情況。所以,我採取了這種方法。

0

那麼,讓我們來具體說明一下。 如果你想使用外部視圖,那麼你不應該使用對話框片段,而應該像這樣使用片段。

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

並使佈局wrap_content,它將顯然看起來像對話框,默認情況下,它放置在屏幕的頂部。

欲瞭解更多詳情,請訪問here