是否可以对 AlertDialog 和 View 使用相同的 onClick?

Is it possible to use a same onClick for both AlertDialog and View?

我的 activity 有一个接受按钮 通过 onClickOkayButton 方法向父级发送意图。我已经覆盖了 onBackPressed() 方法,以便它显示一个 AlertDialog 询问用户是否真的想离开或者他是否想保存首选项, 执行与接受按钮完全相同的操作。

是否可以将两种 onClick 方法合并为一个,这样即使两种方法使用不同的参数,我也不需要 copy/paste 编辑其中一种方法?

public void onClickOkayButton(View view) {

// THIS IS THE ACCEPT BUTTON
    EditText editText = (EditText)findViewById(R.id.surveyadd_name_edittext);
    String title = editText.getText().toString();
    if (!(title.matches("")) || !(title.isEmpty()) || !(title.equals("")) ) {
        Intent intent = new Intent();
        intent.putExtra("title", title);
        setResult(RESULT_OK, intent);
        finish();
    } else {
        Toast.makeText(this, R.string.surveyadd_warn_notitle, Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onBackPressed() {
    if (adapter.getCount() != 0) {
        showAlertDialog();
    } else {
        super.onBackPressed();
    }
}

public void showAlertDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(R.string.surveyadd_warn_back_message);
    builder.setNegativeButton(R.string.surveyadd_warn_back_save, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

// THIS WAS COPIED FROM THE ACCEPT BUTTON
            EditText editText = (EditText)findViewById(R.id.surveyadd_name_edittext);
            String title = editText.getText().toString();
            if (!(title.matches("")) || !(title.isEmpty()) || !(title.equals("")) ) {
                Intent intent = new Intent();
                intent.putExtra("title", title);
                setResult(RESULT_OK, intent);
                finish();
            } else {
                Toast.makeText(context, R.string.surveyadd_warn_notitle, Toast.LENGTH_SHORT).show();
            }
        }
    });
// UP TO HERE

    builder.setPositiveButton(R.string.surveyadd_warn_back_erase, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            finish();
        }
    });

    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}

您将无法使用相同的回调方法,因为它们来自不同的接口。

您应该做的是将所有通用代码移动到第三种方法中,然后从两个点击处理程序中调用它,如下所示:

private void setResultAndFinish() {
    EditText editText = (EditText)findViewById(R.id.surveyadd_name_edittext);
    String title = editText.getText().toString();
    if (!TextUtils.isEmpty(title)) ) {
        Intent intent = new Intent();
        intent.putExtra("title", title);
        setResult(RESULT_OK, intent);
        finish();
    } else {
        Toast.makeText(context, R.string.surveyadd_warn_notitle, Toast.LENGTH_SHORT).show();
    }
}

然后是处理程序:

public void onClickOkayButton(View view) {
    setResultAndFinish();
}

@Override
public void onClick(DialogInterface dialog, int which) {
    setResultAndFinish();
}