我有一個Fragment
在我的應用程序顯示DialogFragment
。
我在片段中有一個關閉對話框的按鈕。但是,當我顯示dialogFragment時,對話框外的觸摸什麼也不做,我不能單擊對話框片段之外的按鈕。允許外部觸摸對話框片段
我該如何允許外部接觸DialogFragment?
我有一個Fragment
在我的應用程序顯示DialogFragment
。
我在片段中有一個關閉對話框的按鈕。但是,當我顯示dialogFragment時,對話框外的觸摸什麼也不做,我不能單擊對話框片段之外的按鈕。允許外部觸摸對話框片段
我該如何允許外部接觸DialogFragment?
爲了做到這一點,在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);
}
這是比較通用的標誌,以允許任何動作不僅觸摸操作
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
我找到了另一種方式來處理在外面接觸的解僱。請檢查下面的代碼示例,那肯定會的工作,
@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()。解僱()不能正常工作。此外,標記爲正確的解決方案也不適用於我的情況。所以,我採取了這種方法。
那麼,讓我們來具體說明一下。 如果你想使用外部視圖,那麼你不應該使用對話框片段,而應該像這樣使用片段。
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
我已經與STYLE_NO_FRAME工作,它是唯一一個OK的我(因爲UI)。 – Yaniv 2013-03-13 12:23:32
@yaniv然後顯示代碼:) – Warpzit 2013-03-14 14:08:25