[英]Android DialogFragment doesn't dismiss
我在Android中有一個自定義對話框,我在onCreateView方法上創建對話框視圖。
public class FiltroDialog extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
當我嘗試關閉對話框時,我在onClickListener調用的對話框中有一個方法
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"doDismiss");
FiltroDialog.this.dismiss();
}
});
我已經覆蓋了對話框中的幾個onMethods,以查看對話框中發生的事情。
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
Log.d(TAG,"onCancel");
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
Log.d(TAG,"onDismiss");
}
我嘗試用dismiss()關閉對話框; dismissAllowingStateLoss(); 使用FragmentTransaction並且每次我都有相同的結果。
D/FiltroDialog(30492): doDismiss
D/FiltroDialog(30492): onStop
D/FiltroDialog(30492): onDestroyView
D/FiltroDialog(30492): onDetach
但是對話框沒有從屏幕上消失,使用后退按鈕,對話框正確消失但是使用dismiss()或FragmentTransaction.remove方法我只能進入Stop,DestroyView,Detach但不能onDismiss()
當我再次單擊該按鈕時,只有這個在LogCat中顯示
D/FiltroDialog(30492): doDismiss
我嘗試了幾種方法來解除對話。 這是我用來顯示活動對話框的代碼(也是從片段中嘗試過)
FiltroDialog newFragment = FiltroDialog.newInstance();
newFragment.show(getSupportFragmentManager(), TAG_DLG_FILTROS);
以下是嘗試從活動中關閉對話框的代碼(也是從片段中嘗試過,同樣的結果)
DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag(TAG_DLG_FILTROS);
if (prev != null) {
prev.dismiss();
}
這是嘗試從活動中關閉的另一種嘗試(從片段嘗試過,同樣的結果)
Fragment prev = getSupportFragmentManager().findFragmentByTag(TAG_DLG_FILTROS);
if (prev != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(prev);
ft.commit();
}
這是另一個嘗試從對話框中關閉嘗試調用DialogFragment內對話框的cancel()方法。
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"doDismiss");
FiltroDialog.this.getDialog().cancel();
}
});
不解除對話框並且不調用onDismiss既不停止,也不調用DestroyView,Detach方法。
這是另一個嘗試從對話框中關閉嘗試調用DialogFragment中對話框的dismiss()方法。
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"doDismiss");
FiltroDialog.this.getDialog().dismiss();
}
});
不解除對話框並且不調用onDismiss既不停止,也不調用DestroyView,Detach方法。
我在應用程序中有一些對話框,從來沒有遇到過這個問題,我不完全是Android編程的新手,但我不知道我做錯了什么? 這是compat庫中的一個錯誤?
我今天遇到了同樣的問題。
你是如何處理對話框中的視圖的? 對我來說問題是我有一個FrameLayout,然后我將視圖膨脹到(基於一些信息)。 我不知道為什么這會打破它,但確實如此。 當我用一個簡單的viewstub替換framelayout時,它工作得很好。
希望它成功。 祝好運!
嗯,不明白為什么那不起作用但你總是可以做getActivity()。onBackPressed()作為臨時解決方法
從@zoltish回答開始,我發現在創建實際視圖后將視圖擴展到對話框內容會產生這種麻煩。 在onCreate
我正在給布局充氣,然后使用帖子來調用onViewCreated工具,在那里我在第一個布局內膨脹另一個布局。 解決方案是所有布局/視圖層次結構必須已從onCreate
加載,至少在4.3模擬器上。
將Gianluca P.的評論轉化為答案:
似乎使用錯誤的LayoutInflater
可以打破解散功能。 如果從android.support.v4.app.DialogFragment.getLayoutInflater(Bundle)
獲取LayoutInflater然后使用它來膨脹視圖,則會解除dismiss。
要解決此問題,請改用(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
。
只是其中一個Android的東西。
我遇到了同樣的問題,我將DialogFragment的引用移動到了一個方法的本地范圍,這對我有用。 (最初,這是我班級的領域)。
為什么不嘗試僅使用此代碼:
dismiss();
如果你想自己解除Dialog Fragment。 您可以簡單地將此代碼放在要取消Dialog的對話框片段中。
例如:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
這將關閉屏幕上顯示的最近的Dialog Fragment。
希望它對你有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.