首页 > android中自定义方法怎样传递对象参数?

android中自定义方法怎样传递对象参数?

在Android中很多操作后都要调用一个对话框,所以封装了一个方法,大体如下:

protected void alertDialog(Context mContext, String title, String message)
    {
        // 构造对话框
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle(title);
        builder.setMessage(message);

        // 确定
        builder.setPositiveButton(R.string.i_know, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        Dialog noticeDialog = builder.create();
        noticeDialog.show();
    }

一个典型的 alert 对话框,但有时的可能需求:当用户点击确定按钮后,还需要做点其他的事情,所以我想在 参数当中传递一个对象过来,在click后调用其中的方法,我试着写了一个类:

class DialogButton{
    String bt2 = "";

    public void ok(){

    }

    public void cancel(){}

}

然后把之前的方法改成这样;

protected void alertDialog(Context mContext, String title, String message, final DialogButton button)
    {
        // 构造对话框
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle(title);
        builder.setMessage(message);

        // 确定
        builder.setPositiveButton(R.string.i_know, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                button.ok();
                dialog.dismiss();
            }
        });
        Dialog noticeDialog = builder.create();
        noticeDialog.show();
    }

后面调用的时候重写 DialogButton 这里面的方法,因为 alertDialog中 变成了 final DialogButton,所以传过来无效,请问大侠们有什么好的方法 ?


可以参考一下我这个写法,这是一个简单的通用消息提示框,模仿了.NET的MessageBox。

MessageBox.show(this, getString(R.string.save_confirm), MessageBox.Buttons.YesNo, new MessageBox.OnClickListener() {
    @Override
    public void onYesClick(DialogInterface dialog, int which) {
        // TODO 
    }
});

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;

/**
 * Created by JianyingLi on 15/2/5.
 */
public class MessageBox {

    public enum Buttons {
        AbortRetryIgnore, // 消息框包含“中止”、“重试”和“忽略”按钮。
        OK,               // 消息框包含“确定”按钮。
        OKCancel,         // 消息框包含“确定”和“取消”按钮。
        RetryCancel,      // 消息框包含“重试”和“取消”按钮。
        YesNo,            // 消息框包含“是”和“否”按钮。
        YesNoCancel,      // 消息框包含“是”、“否”和“取消”按钮。
    }

    public static AlertDialog show(Activity activity, int resId) {
        return show(activity, activity.getString(resId));
    }

    /**
     * 消息、确认(无事件处理)
     *
     * @param activity
     * @param msg
     */
    public static AlertDialog show(Activity activity, String msg) {
        return show(activity, msg, null, Buttons.OK, null);
    }

    /**
     * 消息、确认(有事件处理)
     *
     * @param activity
     * @param msg
     * @param listener1 onOKClick
     */
    public static AlertDialog show(Activity activity, String msg, OnClickListener listener1) {
        return show(activity, msg, null, Buttons.OK, listener1);
    }

    /**
     * 标题、消息、确认(无事件处理)
     *
     * @param activity
     * @param msg
     * @param title
     */
    public static AlertDialog show(Activity activity, String msg, String title) {
        return show(activity, msg, title, Buttons.OK, null);
    }

    /**
     * 标题、消息、确认(有事件处理)
     *
     * @param activity
     * @param msg
     * @param title
     * @param listener1 onOKClick
     */
    public static AlertDialog show(Activity activity, String msg, String title, OnClickListener listener1) {
        return show(activity, msg, title, Buttons.OK, listener1, null, null);
    }

    /**
     * 消息,自定义按钮
     *
     * @param activity
     * @param msg
     * @param buttons
     * @param clickListener
     * @return
     */
    public static AlertDialog show(Activity activity, String msg, final Buttons buttons, final OnClickListener clickListener) {
        return show(activity, msg, null, buttons, clickListener, null, null);
    }

    public static AlertDialog show(Activity activity, String msg, String title, final Buttons buttons, final OnClickListener clickListener) {
        return show(activity, msg, title, buttons, clickListener, null, null);
    }

    public static AlertDialog show(Activity activity, String msg, String title, final Buttons buttons, final OnClickListener clickListener, final DialogInterface.OnShowListener onShowListener, final DialogInterface.OnDismissListener onDismissListener) {
        final DialogInterface.OnClickListener listener1 = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (clickListener == null) return;
                switch (buttons) {
                    case AbortRetryIgnore:
                        clickListener.onAbortClick(dialog, which);
                        break;
                    case OK:
                    case OKCancel:
                        clickListener.onOKClick(dialog, which);
                        break;
                    case RetryCancel:
                        clickListener.onRetryClick(dialog, which);
                        break;
                    case YesNo:
                    case YesNoCancel:
                        clickListener.onYesClick(dialog, which);
                        break;
                }
            }
        };
        final DialogInterface.OnClickListener listener2 = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (clickListener == null) return;
                switch (buttons) {
                    case AbortRetryIgnore:
                        clickListener.onRetryClick(dialog, which);
                        break;
                    case YesNoCancel:
                        clickListener.onNoClick(dialog, which);
                        break;
                }
            }
        };
        final DialogInterface.OnClickListener listener3 = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (clickListener == null) return;
                switch (buttons) {
                    case AbortRetryIgnore:
                        clickListener.onIgnoreClick(dialog, which);
                        break;
                    case OKCancel:
                    case RetryCancel:
                    case YesNoCancel:
                        clickListener.onCancelClick(dialog, which);
                        break;
                    case YesNo:
                        clickListener.onNoClick(dialog, which);
                        break;
                }
            }
        };
        AlertDialog d = null;
        AlertDialog.Builder b = new AlertDialog.Builder(activity);
        if (msg != null && msg.trim().length() > 0) {
            b.setMessage(msg);
        }
        if (title != null && title.trim().length() > 0) {
            b.setTitle(title);
        }
        switch (buttons) {
            case AbortRetryIgnore:
                b.setPositiveButton(R.string.msg_box_abort, listener1); // Abort
                b.setNeutralButton(R.string.msg_box_retry, listener2); // Retry
                b.setNegativeButton(R.string.msg_box_ignore, listener3); // Ignore
                break;
            case OK:
                b.setPositiveButton(R.string.msg_box_ok, listener1); // OK
                break;
            case OKCancel:
                b.setPositiveButton(R.string.msg_box_ok, listener1); // OK
                b.setNegativeButton(R.string.msg_box_cancel, listener3); // Cancel
                break;
            case RetryCancel:
                b.setPositiveButton(R.string.msg_box_retry, listener1); // Retry
                b.setNegativeButton(R.string.msg_box_cancel, listener3); // Cancel
                break;
            case YesNo:
                b.setPositiveButton(R.string.msg_box_yes, listener1); // Yes
                b.setNegativeButton(R.string.msg_box_no, listener3); // No
                break;
            case YesNoCancel:
                b.setPositiveButton(R.string.msg_box_yes, listener1); // Yes
                b.setNeutralButton(R.string.msg_box_no, listener2); // No
                b.setNegativeButton(R.string.msg_box_cancel, listener3); // Cancel
                break;
        }
        d = b.create();
        d.setOnShowListener(onShowListener);
        d.setOnDismissListener(onDismissListener);
        d.show();
        return d;
    }

    public static abstract class OnClickListener {
        public void onAbortClick(DialogInterface dialog, int which) {
        }

        public void onRetryClick(DialogInterface dialog, int which) {
        }

        public void onIgnoreClick(DialogInterface dialog, int which) {
        }

        public void onOKClick(DialogInterface dialog, int which) {
        }

        public void onCancelClick(DialogInterface dialog, int which) {
        }

        public void onYesClick(DialogInterface dialog, int which) {
        }

        public void onNoClick(DialogInterface dialog, int which) {
        }
    }
}

如果想后期可以重写,你在这里可以将DialogButton设置成一个接口啊。然后在调用函数传入这个参数的时候(也就是新建DialogButton的时候),来自定义dialogbutton的ok函数和cancel函数的具体实现啊。类似于这样:

    public void click(View view) {
        alertDialog(this, "test", "this is a test", new DialogButton() {
            @Override
            public void ok() {
                Log.d(TAG, "ok");
            }

            @Override
            public void cancel() {
                Log.d(TAG, "cancel");
            }
        });
    }

    protected void alertDialog(Context mContext, String title, String message, final DialogButton button)
    {
        // 构造对话框
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle(title);
        builder.setMessage(message);

        // 确定
        builder.setPositiveButton(R.string.i_know, new     DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                button.ok();
                dialog.dismiss();
            }
        });
        Dialog noticeDialog = builder.create();
        noticeDialog.show();
    }

public abstract class BaseAlertDialog extends AlertDialog {

protected Context mContext;

public BaseAlertDialog(Context context) {
    super(context);
    mContext = context;
}

public BaseAlertDialog(Context context, int theme) {
    super(context, theme);
    mContext = context;
}

public abstract int getLayoutRes();

public abstract void initViews(View convertView);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = getLayoutInflater().inflate(getLayoutRes(), null);
    setContentView(view);
    initViews(view);
}


public BaseAlertDialog showDialog(){
    show();
    return this;
}

}

修改初始化方法传入值即可

【热门文章】
【热门文章】