web-dev-qa-db-ja.com

FragmentActivityのないDialogFragment

DialogFragmentの代わりにActivityを使用する場合、FragmentActivityを使用することは可能ですか? show()メソッドにはFragmentManagerが必要です。

EditTextを1つだけ含むダイアログを実装したいのですが、Android開発者向けのチュートリアルでは、ダイアログフラグメントでカスタムレイアウトを使用する必要があると言われています。 1つのダイアログだけにFragmentActivityを使用するように変更する気はありません。

解決済み:複雑にならないように、FragmentActivityの代わりにActivityを使用することにしました。

13

同じ問題が発生しました。あなたが1年前にこれを尋ねたのは知っていますが、それでも他のユーザーを助けるためです。これが私が問題を解決した方法です。

public void show_dialog() {
    FragmentManager fm = getFragmentManager();
    DialogFragment newFragment = new DialogFragment();
    newFragment.show(fm, "abc");
}

これには、FragmentActivityではなく、FragmentManagerのインポートが必要です。

21
shadyinside

少し遅れるかもしれませんが、FragmentActivity以外からDialogFragmentを呼び出すという問題もありました。また、単純なダイアログのためだけにFragmentActivityにすることは意味がありません。したがって、私にとっての解決策は、コールバックvoidを使用してインターフェイスを作成し、アクティビティでDialogFragment応答を取得することでした。私にとっては、onActivityResultオーバーライドのどこかで応答を取得するのではなく、ダイアログ呼び出しの近くで応答を取得する方がよいでしょう。

インターフェース:

   import Android.os.Parcelable;

/**
 * Created by TH on 03.11.2015.
 */
public interface OnDialogResponseListener extends Parcelable {

    void onDialogResponse(int responseCode);

}

一般的なダイアログクラス:

import Android.app.Activity;
import Android.app.Dialog;
import Android.content.DialogInterface;
import Android.os.Bundle;
import Android.support.v4.app.DialogFragment;
import Android.support.v7.app.AlertDialog;

/**
 * Code basisc found here:
     *   http://stackoverflow.com/questions/7977392/Android-dialogfragment-vs-dialog
* changed by TH on 03.11.2015.
     */
public class YesNoDialog extends DialogFragment
{

    public static final String TITLE="title";
    public static final String MESSAGE="message";
    public static final String LISTENER="listener";
    public static final String YES="yes";
    public static final String NO="no";
    public static final String ICON_ID="icon_id";
    private OnDialogResponseListener mResponseListener;

    public YesNoDialog()
    {

    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle args = getArguments();
        String title = args.getString(TITLE, "");
        String message = args.getString(MESSAGE, "");
        String yes = args.getString(YES, "");
        String no = args.getString(NO, "");
        int iconID=args.getInt(ICON_ID);
        mResponseListener=args.getParcelable(LISTENER);

        return new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setMessage(message)
                .setIcon(iconID)
                .setPositiveButton(yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mResponseListener != null) {
                            mResponseListener.onDialogResponse(Activity.RESULT_OK);
                        }

                    }
                })
                .setNegativeButton(no, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mResponseListener != null) {
                            mResponseListener.onDialogResponse(Activity.RESULT_CANCELED);
                        }
                    }
                })
                .create();
    }
}

そして、使用法は次のようになります:

OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() {


                @Override
                public int describeContents() {
                    return 0; //Leave this as it is
                }

                @Override
                public void writeToParcel(Parcel dest, int flags) {
                        //Leave this as it is
                }

                @Override
                public void onDialogResponse(int responseCode) {


                    //Do what you want with your dialog answers

                    if(responseCode== Activity.RESULT_OK){
                        Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show();
                    }else if(responseCode==Activity.RESULT_CANCELED){
                        Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show();
                    }

                }
            };


            YesNoDialog dialog = new YesNoDialog();
            Bundle args = new Bundle();
            args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light);
            args.putString(YesNoDialog.YES, getString(R.string.action_add));
            args.putString(YesNoDialog.NO, getString(R.string.action_cancel));
            args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item));
            args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item));
            args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener);
            dialog.setArguments(args);
            dialog.show(getSupportFragmentManager(), "tag");

以上です。単純なダイアログよりもコードが少し多いかもしれませんが、値を保持し、方向の変更時に表示されます。それがDialogFragmentを使用するための私の目標でした。

2
Tarik Huber

私は同じ問題を抱えていましたが、以下にリンクされているスタックオーバーフローの投稿の回答の助けを借りてそれを修正することができました。私は特に、ポジティブ/ネガティブな結果のリスナーの概念を備えたmrolcsiのソリューションが好きでした。

DialogFragmentから値を取得

0
Mattias

すべてのフラグメントに対して包括的なダイアログが必要な場合は、フラグメントアクティビティを含むアクティビティに通常の ダイアログコード を使用してください。それ以外の場合は、フラグメントアクティビティの子としてDialogFragmentに実装するだけです。

0
Steven Mann