シンプルな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があることを前提にしています.はい、くだらないことは言わないで、コードをつけます.
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クラスを見てみましょう.
見ただけで分かるコードは,要求を出したDialogを記録し,それを反射して新しいDialogを手に入れ,新しいDialog dismissでは,コールバック要求DialogのonDialogResultメソッドは,Activityとほぼ同じ形式である.もちろんdemoはdemoですが、ここでは最も簡単な実装にすぎません.その後、Activity stackとmapを参照してdialogキュー全体を維持することで、より複雑なニーズを実現することができます.データの転送を容易にするために、ここではいっそIntentをカプセル化して、DialogIntentを作って、複雑なデータの転送、直接Intentのコードを多重化することができます~
さて、最後にアニメのベースクラスBaseAnimatorSet:、
アトリビュートアニメーションについては関連ブログを参考にして、ここでは後述しませんが、自分のクールなアニメーション効果を実現するには、継承して振り回しましょう.次は3つの実装クラスを貼って使用効果を示します.Main,Login,Register
はい、Dialog間の通信はもう卵が痛いリスナーと相互参照伝達handlerを使う必要はありません.Activityのように、あなたは持つ価値があります.
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のように、あなたは持つ価値があります.