6

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();でダイアログを閉じようとしました; rejectAllowingStateLoss(); 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 や Stop、DestroyView、Detach メソッドを呼び出したりしません。

これは、DialogFragment 内のダイアログの Dismiss() メソッドを呼び出そうとしているダイアログから閉じようとする別の試みです。

boton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {               
            Log.d(TAG,"doDismiss");
            FiltroDialog.this.getDialog().dismiss();
        }
    });

ダイアログを閉じたり、onDismiss や Stop、DestroyView、Detach メソッドを呼び出したりしません。

私はアプリにいくつかのダイアログを持っていますが、その問題は一度もありませんでした。私はAndroidプログラミングの初心者ではありませんが、何が間違っているのかわかりませんか? それは互換ライブラリのバグですか?

4

6 に答える 6

4

今日も同じ問題に遭遇しました。

ダイアログ内のビューをどのように処理していますか? 私にとっての問題は、(いくつかの情報に基づいて)ビューを膨らませた FrameLayout があることでした。なぜこれが壊れたのかわかりませんが、壊れました。フレームレイアウトを単純なビュータブに置き換えたところ、完全に正常に機能しました。

うまくいくことを願っています。幸運を!

于 2013-08-12T11:28:58.673 に答える
0

うーん、なぜそれが機能しないのかわかりませんが、暫定的な回避策としていつでも getActivity().onBackPressed() を実行できます

于 2013-07-03T15:42:48.417 に答える