シンプルなDialogフレームワーク(ActivityのようにDialogを使う)


最近の開発で問題になったのは、Activityが起動した後、後続の多くのプロセスがDialogによって負荷されることです.Androidが提供するDialogは、ほとんどがAlertの役割であり、複雑なビジネスを担うControllerではないため、Dialog間で値の伝達やコールバックが必要な場合に問題が発生します.先人が書いたコードには、ADialogがBdialogにジャンプした後、Bdialogのある操作でAのある方法を呼び出したり値をAに渡したりする必要があり、Aの引用をBに伝えたり、AのHandlerをBに伝えたりする「仕方がない」コードが出てきて、とても痛ましいです.統一的な規範がないため、業務が膨張した後、様々なdialogが相互に伝達され、様々な結合が多くの問題をもたらし、この問題をどのように解決すべきかを悩んでいる.最近、アンドロイド開発者が最もよく知っているのはActivityを使うことです.ActivityのようにDialogを使うことができれば、学習コストが最も低くなるのではないでしょうか.そこで、このようなフレームワークを書く考えが出てきました.声明すると、このフレームワークは現在demoにすぎず、レンガを投げて玉を引くこともできます.もちろん、EventBusのような成熟したフレームワークを借りることもできますが、思いついた以上、手を練習しましょう.各道の大神がこの考えを気に入ったら、一緒にこのフレームワークを最適化したいと思っています.また、このフレームワークはベースのDialogとDialogに消えて自分のアニメーションを作ることを示しています.nineoldandroidsのjarがあることを前提にしています.はい、くだらないことは言わないで、コードをつけます.
package com.amuro.dialog_framework.base;

import com.amuro.dialog_framework.animation.BaseAnimatorSet;
import com.amuro.dialog_framework.utils.DialogIntent;
import com.amuro.dialog_framework.utils.DisplayUtils;
import com.nineoldandroids.animation.Animator;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.LinearLayout;

public abstract class BaseDialog extends Dialog {
    protected Context context;
    private DialogIntent intent;

    private int screenWidth;
    private int screenHeight;
    private int contentWidth;
    private int contentHeight;
    private int dialogMaxHeight;
    private float widthScale;
    private float heightScale;

    private LinearLayout linearLayoutRoot;
    private LinearLayout linearLayoutContent;

    private BaseAnimatorSet showAnimation;
    private BaseAnimatorSet dismissAnimation;
    private boolean isShowAnimPlaying = false;
    private boolean isDimissAnimPlaying = false;
    private boolean isOutsideTouchDismiss = true;

    private DialogManager dialogManager;
    private int resultCode = -1;
    private Bundle resultData;

    public BaseDialog(Context context) 
    {
        super(context);
        this.context = context;
        dialogManager = DialogManager.getInstance();

        initData();
        setDialogTheme();
        initParams();
    }

    public DialogIntent getIntent()
    {
        return intent;
    }

    public void setIntent(DialogIntent intent)
    {
        this.intent = intent;
    }

    protected abstract void initParams();

    private void initData()
    {
        screenWidth = DisplayUtils.getScreenWidth(context);
        screenHeight = DisplayUtils.getScreenHeight(context);
        dialogMaxHeight = screenHeight - DisplayUtils.getStatusBar(context);
        widthScale = 0.88f;
        heightScale = 0.5f;
    }

    private void setDialogTheme() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);// android:windowNoTitle
        getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// android:windowBackground
        getWindow().addFlags(LayoutParams.FLAG_DIM_BEHIND);// android:backgroundDimEnabled   true 
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        linearLayoutRoot = new LinearLayout(context);
        linearLayoutRoot.setGravity(Gravity.CENTER);

        linearLayoutContent = new LinearLayout(context);
        linearLayoutContent.setOrientation(LinearLayout.VERTICAL);
        linearLayoutContent.setBackgroundColor(Color.WHITE);
        linearLayoutContent.addView(onCreateContentView());

        linearLayoutRoot.addView(linearLayoutContent);

        setContentView(linearLayoutRoot, 
                new ViewGroup.LayoutParams(screenWidth, dialogMaxHeight));

    }

    protected abstract View onCreateContentView();

    @Override
    public void onAttachedToWindow()
    {
        super.onAttachedToWindow();

        initContentView();
        initShowAnimation();

    }

    private void initContentView()
    {
        if (widthScale == 0)
        {
            contentWidth = ViewGroup.LayoutParams.WRAP_CONTENT;
        }
        else if(widthScale == 1)
        {
            contentWidth = ViewGroup.LayoutParams.MATCH_PARENT;
        }
        else
        {
            contentWidth = (int) (screenWidth * widthScale);
        }

        if (heightScale == 0)
        {
            contentHeight = ViewGroup.LayoutParams.WRAP_CONTENT;
        }
        else if (heightScale == 1)
        {
            contentHeight = ViewGroup.LayoutParams.MATCH_PARENT;
        }
        else
        {
            contentHeight = (int) (dialogMaxHeight * heightScale);
        }

        linearLayoutContent.setLayoutParams(new LinearLayout.LayoutParams(contentWidth, contentHeight));

        linearLayoutRoot.setOnTouchListener(new OnTouchListener()
        {

            @SuppressLint("ClickableViewAccessibility")
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                if(isOutsideTouchDismiss)
                {
                    int action = event.getAction();

                    if (action == MotionEvent.ACTION_DOWN)
                    {
                        if (!inRangeOfView(linearLayoutContent, event))
                        {
                            dismiss();
                        }
                    }
                }

                return false;
            }
        });
    }

    private void initShowAnimation()
    {
        if (showAnimation != null)
        {
            showAnimation.listener(new BaseAnimatorSet.AnimatorListener()
            {
                @Override
                public void onAnimationStart(Animator animator)
                {
                    isShowAnimPlaying = true;
                }

                @Override
                public void onAnimationRepeat(Animator animator)
                {
                }

                @Override
                public void onAnimationEnd(Animator animator)
                {
                    isShowAnimPlaying = false;
                }

                @Override
                public void onAnimationCancel(Animator animator)
                {
                    isShowAnimPlaying = false;
                }
            }).playOn(linearLayoutContent);
        }
        else
        {
            BaseAnimatorSet.reset(linearLayoutContent);
        }
    }

    private boolean inRangeOfView(View view, MotionEvent ev)
    {
        int[] location = new int[2];
        view.getLocationOnScreen(location);
        int x = location[0];
        int y = location[1];
        if (ev.getX() < x || ev.getX() > (x + view.getWidth()) || ev.getY() < y
                || ev.getY() > (y + view.getHeight()))
        {
            return false;
        }
        return true;
    }

    @Override
    public void dismiss()
    {
        if (dismissAnimation != null)
        {
            dismissAnimation.listener(new BaseAnimatorSet.AnimatorListener()
            {
                @Override
                public void onAnimationStart(Animator animator)
                {
                    isDimissAnimPlaying = true;
                }

                @Override
                public void onAnimationRepeat(Animator animator)
                {
                }

                @Override
                public void onAnimationEnd(Animator animator)
                {
                    isDimissAnimPlaying = false;
                    superDismiss();
                }

                @Override
                public void onAnimationCancel(Animator animator)
                {
                    isDimissAnimPlaying = false;
                    superDismiss();
                }
            }).playOn(linearLayoutContent);
        }
        else
        {
            superDismiss();
        }
    }

    private void superDismiss()
    {
        super.dismiss();
    }

    @Override
    public void onBackPressed() 
    {
        if (isShowAnimPlaying || isDimissAnimPlaying) 
        {
            return;
        }
        super.onBackPressed();
    }

    public BaseDialog setOutsideTouchDismiss(boolean isOutsideTouchDismiss)
    {
        this.isOutsideTouchDismiss = isOutsideTouchDismiss;
        return this;
    }

    /** set window dim or not(        ) */
    public BaseDialog setDimEnabled(boolean isDimEnabled)
    {
        if (isDimEnabled)
        {
            getWindow().addFlags(LayoutParams.FLAG_DIM_BEHIND);
        }
        else
        {
            getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);
        }
        return this;
    }

    /** set dialog width scale:0-1(       ,       0-1) */
    public BaseDialog setWidthScale(float widthScale)
    {
        this.widthScale = widthScale;
        return this;
    }

    /** set dialog height scale:0-1(       ,       0-1) */
    public BaseDialog setHeightScale(float heightScale)
    {
        this.heightScale = heightScale;
        return this;
    }

    /** set show anim(       ) */
    public BaseDialog setShowAnim(BaseAnimatorSet showAnim)
    {
        this.showAnimation = showAnim;
        return this;
    }

    /** set dismiss anim(       ) */
    public BaseDialog setDismissAnim(BaseAnimatorSet dismissAnim)
    {
        this.dismissAnimation = dismissAnim;
        return this;
    }

    protected void setResult(int resultCode)
    {
        this.resultCode = resultCode;
        this.resultData = null;
    }

    protected void setResult(int resultCode, Bundle data)
    {
        this.resultCode = resultCode;
        this.resultData = data;
    }

    public int getResultCode()
    {
        return resultCode;
    }

    public Bundle getResultData()
    {
        return resultData;
    }

    protected void startDialogForResult(DialogIntent intent, int requestCode)
    {
        dialogManager.startDialogForResult(intent, requestCode);
    }

    protected void onDialogResult(int requestCode, int resultCode, Bundle data)
    {

    }
}

BaseDialogというのも標準的な配置で、考え方を説明します:1.アンドロイドのWindowとViewの関係はあまり言わないで、理解しないで読書ノート2を見に行きます.私たちは標準的なDialog構成に従って、Windowの背景を透明にして、影を加えて、醜いシステムTitleを取り除きます.そしてRoot LinearLayoutを後ろに置いて、その大きさは全画面で、背景も透明です.2.Rootには、すべてのカスタムViewを搭載するコンテナとしてcontent LinearLayoutが追加されています.このcontentのサイズはwidthScaleとheightScaleで調整され、デフォルトはシステムAlertDialogの差が少ないサイズです.3.背景が完全にrootで覆われているので、onTouchOutsideDismissの方法を自分で処理する必要があります.考え方は簡単です.rootがクリックされたとき、この点の座標がcontentの範囲内かどうかを判断します.イベントをブロックするのではなく、dismissではありません.4.ポイントはstartDialogForResult方法とonDialogResult方法で、見覚えがあるかどうか、間違いなく、Activityと同じように感じさせます.ロジックも悪くないが、startDialogForResultメソッドはDialogManagerのstartDialogForResultメソッドを呼び出し、onDialogResultメソッドは空のメソッドで、サブクラスが自分で遊ぶのを待っている.5.アニメーションのベースクラスはBaseAnimatorSetであり、必要なアニメーション方法をカプセル化し、呼び出し者が自分で所望のアニメーションを設定するためのインタフェースを提供する.まず、DialogManagerクラスを見てみましょう.
package com.amuro.dialog_framework.base;

import java.lang.reflect.Constructor;

import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;

import com.amuro.dialog_framework.utils.DialogIntent;

public class DialogManager {
    private DialogManager(){}

    private final static class DialogManagerHolder {
        private static DialogManager instance = new DialogManager();
    }

    public static DialogManager getInstance()
    {
        return DialogManagerHolder.instance;
    }

    private Context context;
    private BaseDialog fromDialog;
    private BaseDialog toDialog;
    private int requestCode;

    public DialogManager setContext(Context context)
    {
        if(this.context == null)
        {
            this.context = context;
        }

        return this;
    }

    public void startDialog(DialogIntent intent)
    {
        startDialogForResult(intent, -1);
    }

    public void startDialogForResult(DialogIntent intent, int requestCode)
    {
        try
        {
            fromDialog = intent.getFromDialog();

            Constructor<? extends BaseDialog> c = 
                    intent.getDialogClass().getConstructor(Context.class);

            this.requestCode = requestCode;

            toDialog = c.newInstance(context);
            toDialog.setIntent(intent);
            toDialog.setOnDismissListener(new OnDismissListener()
            {

                @Override
                public void onDismiss(DialogInterface dialog)
                {
                    notifyResult();
                }
            });

            toDialog.show();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private void notifyResult()
    {
        if(fromDialog == null)
        {
            return;
        }

        if(requestCode == -1)
        {
            return;
        }

        fromDialog.onDialogResult(requestCode, toDialog.getResultCode(), toDialog.getResultData());
    }
}

見ただけで分かるコードは,要求を出したDialogを記録し,それを反射して新しいDialogを手に入れ,新しいDialog dismissでは,コールバック要求DialogのonDialogResultメソッドは,Activityとほぼ同じ形式である.もちろんdemoはdemoですが、ここでは最も簡単な実装にすぎません.その後、Activity stackとmapを参照してdialogキュー全体を維持することで、より複雑なニーズを実現することができます.データの転送を容易にするために、ここではいっそIntentをカプセル化して、DialogIntentを作って、複雑なデータの転送、直接Intentのコードを多重化することができます~
package com.amuro.dialog_framework.utils; import com.amuro.dialog_framework.base.BaseDialog; import android.content.Intent; public class DialogIntent extends Intent { private BaseDialog fromDialog; private Class<? extends BaseDialog> toDialogClass; public DialogIntent(BaseDialog fromDialog, Class<? extends BaseDialog> dialogClass) { super(); this.fromDialog = fromDialog; this.toDialogClass = dialogClass; } public BaseDialog getFromDialog() { return fromDialog; } public void setFromDialog(BaseDialog fromDialog) { this.fromDialog = fromDialog; } public Class<? extends BaseDialog> getDialogClass() { return toDialogClass; } public void setDialogClass(Class<? extends BaseDialog> dialogClass) { this.toDialogClass = dialogClass; } } 

さて、最後にアニメのベースクラスBaseAnimatorSet:、
package com.amuro.dialog_framework.animation;

import android.view.View;
import android.view.animation.Interpolator;

import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorSet;
import com.nineoldandroids.view.ViewHelper;

public abstract class BaseAnimatorSet {
    public interface AnimatorListener {
        void onAnimationStart(Animator animator);

        void onAnimationRepeat(Animator animator);

        void onAnimationEnd(Animator animator);

        void onAnimationCancel(Animator animator);
    }

    protected long duration = 500;
    protected AnimatorSet animatorSet = new AnimatorSet();
    private Interpolator interpolator;
    private long delay;
    private AnimatorListener listener;

    public abstract void setAnimation(View view);

    protected void start(final View view)
    {
        reset(view);
        setAnimation(view);

        animatorSet.setDuration(duration);
        if (interpolator != null)
        {
            animatorSet.setInterpolator(interpolator);
        }

        if (delay > 0)
        {
            animatorSet.setStartDelay(delay);
        }

        if (listener != null)
        {
            animatorSet.addListener(new Animator.AnimatorListener()
            {
                @Override
                public void onAnimationStart(Animator animator)
                {
                    listener.onAnimationStart(animator);
                }

                @Override
                public void onAnimationRepeat(Animator animator)
                {
                    listener.onAnimationRepeat(animator);
                }

                @Override
                public void onAnimationEnd(Animator animator)
                {
                    listener.onAnimationEnd(animator);
                }

                @Override
                public void onAnimationCancel(Animator animator)
                {
                    listener.onAnimationCancel(animator);
                }
            });
        }

        animatorSet.start();
    }

    /**        */
    public BaseAnimatorSet duration(long duration)
    {
        this.duration = duration;
        return this;
    }

    /**        */
    public BaseAnimatorSet delay(long delay)
    {
        this.delay = delay;
        return this;
    }

    /**         */
    public BaseAnimatorSet interpolator(Interpolator interpolator)
    {
        this.interpolator = interpolator;
        return this;
    }

    /**      */
    public BaseAnimatorSet listener(AnimatorListener listener)
    {
        this.listener = listener;
        return this;
    }

    /**  View      */
    public void playOn(View view)
    {
        start(view);
    }

    public static void reset(View view) 
    {
        ViewHelper.setAlpha(view, 1);
        ViewHelper.setScaleX(view, 1);
        ViewHelper.setScaleY(view, 1);
        ViewHelper.setTranslationX(view, 0);
        ViewHelper.setTranslationY(view, 0);
        ViewHelper.setRotation(view, 0);
        ViewHelper.setRotationY(view, 0);
        ViewHelper.setRotationX(view, 0);
    }
}

アトリビュートアニメーションについては関連ブログを参考にして、ここでは後述しませんが、自分のクールなアニメーション効果を実現するには、継承して振り回しましょう.次は3つの実装クラスを貼って使用効果を示します.Main,Login,Register
package com.amuro.example.dialogs;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.amuro.dialog_framework.animation.AnimatorBottomExit;
import com.amuro.dialog_framework.animation.AnimatorTopEnter;
import com.amuro.dialog_framework.animation.BaseAnimatorSet;
import com.amuro.dialog_framework.base.BaseAnimationDialog;
import com.amuro.dialog_framework.utils.DialogIntent;
import com.amuro.dialogframework.R;
import com.amuro.example.bean.User;
import com.amuro.example.utils.custom_view.TitleBar;
import com.amuro.example.utils.custom_view.ToastUtils;

public class MainDialog extends BaseAnimationDialog {
    private TitleBar titleBar;
    private Button button1;
    private Button button2;

    public MainDialog(Context context)
    {
        super(context);
    }

    @Override
    protected BaseAnimatorSet getShowAnim()
    {
        return new AnimatorTopEnter();
    }

    @Override
    protected BaseAnimatorSet getDismissAnim()
    {
        return new AnimatorBottomExit();
    }

    @Override
    protected View onCreateContentView()
    {
        View view = View.inflate(context, R.layout.dialog_main_layout, null);
        return view;
    }

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

        initTitle();
        initView();
    }

    private void initTitle()
    {
        titleBar = (TitleBar)findViewById(R.id.tb);
        titleBar.setTitleText("  ");
    }

    private void initView()
    {
        button1 = (Button)findViewById(R.id.bt1);
        button1.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                DialogIntent intent = new DialogIntent(MainDialog.this, LoginDialog.class);
                intent.putExtra("test", "From MainDialog");
                startDialogForResult(intent, 1);
                dismiss();
            }
        });

        button2 = (Button)findViewById(R.id.bt2);
        button2.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                DialogIntent intent = new DialogIntent(MainDialog.this, RegisterDialog.class);
                intent.putExtra("test", "From MainDialog");
                startDialogForResult(intent, 2);
            }
        });
    }

    @Override
    protected void onDialogResult(int requestCode, int resultCode, Bundle data)
    {
        if(requestCode == 1)
        {
            if(resultCode == LoginDialog.LOGIN_SUCCESS)
            {
                User user = null;
                if(data != null)
                {
                    user = data.getParcelable("User");
                }

                String userName = "null";
                if(user != null)
                {
                    userName = user.getName();
                }

                ToastUtils.showToast(context, "    ,      :" + userName);
            }
            else if(resultCode == LoginDialog.LOGIN_FAILED)
            {
                ToastUtils.showToast(context, "    ");
            }
            else if(resultCode == LoginDialog.LOGIN_CANCEL)
            {
                ToastUtils.showToast(context, "    ");
            }
        }
        else if(requestCode == 2)
        {
            if(resultCode == RegisterDialog.REGISTER_SUCCESS)
            {
                User user = null;
                if(data != null)
                {
                    user = data.getParcelable("User");
                }

                String userName = "null";
                if(user != null)
                {
                    userName = user.getName();
                }

                ToastUtils.showToast(context, "    ,      :" + userName);
            }
            else if(resultCode == RegisterDialog.REGISTER_FAILED)
            {
                ToastUtils.showToast(context, "    ");
            }
            else if(resultCode == RegisterDialog.REGISTER_CANCEL)
            {
                ToastUtils.showToast(context, "    ");
            }
        }
    }


}
package com.amuro.example.dialogs;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.amuro.dialog_framework.animation.AnimatorBottomExit;
import com.amuro.dialog_framework.animation.AnimatorTopEnter;
import com.amuro.dialog_framework.animation.BaseAnimatorSet;
import com.amuro.dialog_framework.base.BaseAnimationDialog;
import com.amuro.dialogframework.R;
import com.amuro.example.bean.User;
import com.amuro.example.utils.custom_view.TitleBar;
import com.amuro.example.utils.custom_view.ToastUtils;

public class LoginDialog extends BaseAnimationDialog {
    public static final int LOGIN_SUCCESS = 0;
    public static final int LOGIN_FAILED = 1;
    public static final int LOGIN_CANCEL = 2;

    private TitleBar titleBar;

    private Button button1;
    private Button button2;

    public LoginDialog(Context context)
    {
        super(context);
    }

    @Override
    protected BaseAnimatorSet getShowAnim()
    {
        return new AnimatorTopEnter();
    }

    @Override
    protected BaseAnimatorSet getDismissAnim()
    {
        return new AnimatorBottomExit();
    }

    @Override
    protected void initParams()
    {
        super.initParams();
        setOutsideTouchDismiss(false);
    }

    @Override
    protected View onCreateContentView()
    {
        return View.inflate(context, R.layout.dialog_login_layout, null);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        String test = getIntent().getStringExtra("test");
        ToastUtils.showToast(context, "     Dialog msg: " + test);

        initTitle();
        initView();
    }

    private void initTitle()
    {
        titleBar = (TitleBar)findViewById(R.id.tb);
        titleBar.setTitleText("  ");
    }

    private void initView()
    {
        button1 = (Button)findViewById(R.id.bt_success);
        button1.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Bundle bundle = new Bundle();
                User user = new User("1", "  ");
                bundle.putParcelable("User", user);
                setResult(LOGIN_SUCCESS, bundle);
                dismiss();
            }
        });

        button2 = (Button)findViewById(R.id.bt_fail);
        button2.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                setResult(LOGIN_FAILED);
                dismiss();
            }
        });

    }

    @Override
    public void onBackPressed()
    {
        super.onBackPressed();
        setResult(LOGIN_CANCEL);
    }

}
package com.amuro.example.dialogs;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.amuro.dialog_framework.base.BaseDialog;
import com.amuro.dialogframework.R;
import com.amuro.example.bean.User;
import com.amuro.example.utils.custom_view.TitleBar;
import com.amuro.example.utils.custom_view.ToastUtils;

public class RegisterDialog extends BaseDialog {
    public static final int REGISTER_SUCCESS = 0;
    public static final int REGISTER_FAILED = 1;
    public static final int REGISTER_CANCEL = 2;

    private TitleBar titleBar;

    private Button button1;
    private Button button2;

    public RegisterDialog(Context context)
    {
        super(context);
    }

    @Override
    protected void initParams()
    {
        setOutsideTouchDismiss(false);
    }

    @Override
    protected View onCreateContentView()
    {
        return View.inflate(context, R.layout.dialog_register_layout, null);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        String test = getIntent().getStringExtra("test");

        ToastUtils.showToast(context, "     Dialog msg: " + test);

        initTitle();
        initView();
    }

    private void initTitle()
    {
        titleBar = (TitleBar)findViewById(R.id.tb);
        titleBar.setTitleText("  ");
    }

    private void initView()
    {
        button1 = (Button)findViewById(R.id.bt_success);
        button1.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Bundle bundle = new Bundle();
                User user = new User("1", "  ");
                bundle.putParcelable("User", user);
                setResult(REGISTER_SUCCESS, bundle);
                dismiss();
            }
        });

        button2 = (Button)findViewById(R.id.bt_fail);
        button2.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                setResult(REGISTER_FAILED);
                dismiss();
            }
        });

    }

    @Override
    public void onBackPressed()
    {
        super.onBackPressed();
        setResult(REGISTER_CANCEL);
    }

}

はい、Dialog間の通信はもう卵が痛いリスナーと相互参照伝達handlerを使う必要はありません.Activityのように、あなたは持つ価値があります.