在 Fragment 中调用带有参数的 AlertDialog 方法

Call AlertDialog Method with parameters inside Fragment

我正在为我的项目做一个应用程序,但我不确定要在我的方法中传递什么。

我是这样调用方法的:

public void scanBar(View v) {
    switch (v.getId()) {
        case R.id.barcode_scan_btn:
            try {
                Intent intent = new Intent(ACTION_SCAN);
                intent.putExtra("SCAN_MODE", "PRODUCT_MODE");
                startActivityForResult(intent, 0);
            } catch (ActivityNotFoundException anfe) {
                showDialog(getActivity(), "No Scanner Found", "Download the scanner application?", "Yes", "No").show();
            }
        break;
    }
}    

这是我的方法:

private static AlertDialog showDialog(final Activity act, CharSequence title, CharSequence message, CharSequence buttonYes, CharSequence buttonNo) {
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
    downloadDialog.setTitle(title);
    downloadDialog.setMessage(message);
    downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            try {
                act.startActivity(intent);
            } catch (ActivityNotFoundException anfe) {

            }
        }
    });
    downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

        }
    });

    return downloadDialog.show();
}

这是错误:

09-20 05:20:31.774  17032-17032/app.psiteportal.com.psiteportal E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: app.psiteportal.com.psiteportal, PID: 17032
java.lang.IllegalStateException: Could not find a method scanBar(View) in the activity class app.psiteportal.com.psiteportal.DrawerMainAdapter for onClick handler on view class android.support.v7.widget.AppCompatButton with id 'barcode_scan_btn'
        at android.view.View.onClick(View.java:3994)
        at android.view.View.performClick(View.java:4756)
        at android.view.View$PerformClick.run(View.java:19761)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5253)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Caused by: java.lang.NoSuchMethodException: scanBar [class android.view.View]
        at java.lang.Class.getMethod(Class.java:664)
        at java.lang.Class.getMethod(Class.java:643)
        at android.view.View.onClick(View.java:3987)

我不知道我应该把我的方法放在 activity 中还是片段中。请帮忙

编辑:我需要将参数更改为 Fragment 还是 Activity?

问题是您的方法 scanBar() 被声明为 onClick 回调(在您的布局内)。这不会碎片化。

"The Activity hosting the layout must then implement the corresponding method." - developer.android.com

这不是错误。如果您想以这种方式实现回调,则必须使用活动而不是片段。

所以解决办法就是设置一个onClick监听器,像这样:

setOnClickListener(new OnClickListener() {/* Some Code */ });