当对话框按钮被按下时,如何打开另一个活动?

7

我想在任何来自此评分对话框的按钮被按下时,成功运行以下代码(属于此库)。 我该如何做?

  public void goToPickerActivity() {
    Intent intent = new com.sucho.placepicker.PlacePicker.IntentBuilder()
            .onlyCoordinates(true) //Get only Coordinates from Place Picker
            .showLatLong(true)
            .setLatLong(40.71274, -74.005974)  // Initial Latitude and Longitude the Map will load into (NYC coordinates)
            .setMapZoom(2.5f)  // Map Zoom Level. Default: 14.0
            .build(this);

    startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST);
  }

编辑:我希望先执行goToPickerActivity()然后再执行库的默认点击代码。例如,当点击Rate App按钮时:

第一步是:执行goToPickerActivity()

完成第一步后,第二步是:运行通常的Rate App点击代码。


你的意思是“将库作为新模块导入”吗?你能展示一下你的Gradle配置吗? - Link182
我认为您需要提供更多关于您的问题的细节...在单击该错误后,工作室是否指出了任何行? - AgentP
请添加更多的代码,告诉我你尝试了什么。 'com.github.shurajcodx:android-app-rating-dialog:1.0.2' 这个库里只有两个文件。只需将这两个文件复制到你的代码中即可。按照需要更改 onClick 方法。 - mudit_sen
否则,使用反射获取已设置的点击监听器,使用findViewbyId设置您自己的点击监听器,在完成工作后调用从反射中获取的监听器。 - mudit_sen
我非常建议您将这些文件复制到您的项目中,并根据您的喜好更改代码。 - mudit_sen
显示剩余2条评论
6个回答

0
请按照以下步骤操作: 在库模块中查找名为 AppRatingDialog.java 的类,在每个 onClick 视图(第171行)方法中添加 YOURACTIVITY.goToPickerActivity(**boolean**);,像这样:
@Override
public void onClick(View v) {
    if (v.getId() == R.id.dialog_rating_button_never_rate) {
        YOURACTIVITY.goToPickerActivity(false); 
        savedNeverShow();
        dismiss();

        if (onRatingDialogListener != null) {
            onRatingDialogListener.onClick();
        }
    } else if (v.getId() == R.id.dialog_rating_button_rate_later) {
        YOURACTIVITY.goToPickerActivity(false);
        dismiss();
        incrementLaunchCount(true);

        if (onRatingDialogListener != null) {
            onRatingDialogListener.onClick();
        }
    } else if (v.getId() == R.id.dialog_rating_button_rate) {
        YOURACTIVITY.goToPickerActivity(true);
        savedNeverShow();
        dismiss();

        if (onRatingDialogListener != null) {
            onRatingDialogListener.onClick();
        }
    }
}

在您的活动中修改方法goToPickerActivity(),使其类似于以下内容:
private static void goToPickerActivity(boolean isRate) {
    Intent intent = new com.sucho.placepicker.PlacePicker.IntentBuilder()
        .onlyCoordinates(true) //Get only Coordinates from Place Picker
        .showLatLong(true)
        .setLatLong(40.71274, -74.005974)  // Initial Latitude and Longitude the Map will load into (NYC coordinates)
        .setMapZoom(2.5f)  // Map Zoom Level. Default: 14.0
        .build(this);
    if (isRate){
        startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST_RATE);
    } else {
        startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST);
    }

在方法onActivityResult中,检查请求代码是否等于Constants.PLACE_PICKER_REQUEST_RATE,如果是,则调用方法openStore()
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (requestCode == Constants.PLACE_PICKER_REQUEST_RATE) {
        //other code ...
        openStore();
        }
    } 
}

private void openStore() {
    final Uri storeUri = Uri.parse(mStoreLink); // your app store listing link
    try {
        startActivity(new Intent(Intent.ACTION_VIEW, storeUri));
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
    }
}

如果您想在进入商店页面之前等待一段时间,可以向openStore()添加处理程序:

Handler mHandler = new Handler();
mHandler.postDelayed(() -> {
    openStore();
}, 1000); // wait for 1 second

0

由于您可以编辑库代码以满足您的要求,因此首先需要更改appratingdialog库代码。 转到AppRatingDialog.java并在onClick(View v)内修改评级按钮条件,如下所示:

if (v.getId() == R.id.dialog_rating_button_rate) {
    savedNeverShow();
    dismiss();

    if (onRatingDialogListener != null) {
        onRatingDialogListener.onClick();
        openPlayStore();    // Just added this extra line here, others are kept in place
    } else {
        openPlayStore();
    }
}

现在,在你的应用活动中,使用setRateButtonText创建自定义点击监听器以进行评分按钮,示例如下:

AppRatingDialog appRatingDialog = new AppRatingDialog.Builder(MainActivity.this)
                .setTriggerCount(3)
                .setRepeatCount(4)
                .setRateButtonText("Rate Now", clickListener)
                .build();
appRatingDialog.show();

最后,在您的应用程序活动中实现单击监听器,将PlacePicker意图放置在onClick内,如下所示:

OnRatingDialogListener clickListener = new OnRatingDialogListener() {
    @Override
    public void onClick() {
        goToPickerActivity();
    }
};

0
你可以简单地编写一个类并从 AppRatingDialog 继承。然后通过重写 onClick 方法,你可以做你想做的事情。最后通过调用 super.onClick,你将运行库中的 onClick 方法。
@Override
    public void onClick(View v) {
        if (v.getId() == R.id.dialog_rating_button_rate) {
            goToPickerActivity();
        }
        super.onClick(v);
    }

0

你似乎已经在原帖中回答了这个问题。

startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST);

public void goToPickerActivity() {
    Intent intent = new com.sucho.placepicker.PlacePicker.IntentBuilder()
            .onlyCoordinates(true) //Get only Coordinates from Place Picker
            .showLatLong(true)
            .setLatLong(40.71274, -74.005974)  // Initial Latitude and Longitude the Map will load into (NYC coordinates)
            .setMapZoom(2.5f)  // Map Zoom Level. Default: 14.0
            .build(this);

    startActivityForResult(intent, Constants.PLACE_PICKER_REQUEST);
  }

所以从中覆盖 onActivityResult(),您可以确定活动是否成功,然后执行您需要的操作,如下所示。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (!(requestCode == 0 && resultCode == RESULT_OK)){
        onBackPressed();
    }else{
        goToPickerActivity()
    }
}

0
您可以尝试使用AppRatingDialog.Builder类的setRateButtonTextsetRateLaterButtonTextsetNeverRateButtonText方法添加一个OnRatingDialogListener
final AppRatingDialog appRatingDialog = new AppRatingDialog.Builder(this)
            // ... call another setup methods if need
            .setRateButtonText("Rate App", new OnRatingDialogListener() {
                @Override
                public void onClick() {
                    goToPickerActivity();
                }
            })
            .setRateLaterButtonText("Rate App Later", new OnRatingDialogListener() {
                @Override
                public void onClick() {
                    goToPickerActivity();
                }
            })
            .setNeverRateButtonText("Never", new OnRatingDialogListener() {
                @Override
                public void onClick() {
                    goToPickerActivity();
                }
            })
            .build();

appRatingDialog.show();

使用lambda表达式,代码将如下所示:

final AppRatingDialog appRatingDialog = new AppRatingDialog.Builder(this)
        // ... call another setup methods if need
        .setRateButtonText("Rate App", () -> goToPickerActivity())
        .setRateLaterButtonText("Rate App Later", () -> goToPickerActivity())
        .setNeverRateButtonText("Never", () -> goToPickerActivity())
        .build();

appRatingDialog.show();

编辑 1:

方法 openPlayStore

private void openPlayStore() {
    final String storeLink = "market://details?id=" + context.getPackageName();
    final Uri marketUri = Uri.parse(storeLink);
    try {
        mContext.startActivity(new Intent(Intent.ACTION_VIEW, marketUri));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(mContext, "Couldn't find PlayStore on this device", Toast.LENGTH_SHORT).show();
    }
}

如果您可以编辑库,请尝试将openPlayStore方法更改为public,将AppRatingDialog实例的引用保存到某个变量中,例如appRatingDialog,然后调用appRatingDialog.openPlayStore()
编辑2:
为了拥有不同的按钮监听器,我们需要向AppRatingDialog添加新的监听器并处理它们:
public class AppRatingDialog extends AppCompatDialog implements View.OnClickListener {
    //...
    private OnRatingDialogListener onRatingDialogListener;
    private OnRatingDialogListener onRateLaterDialogListener;
    private OnRatingDialogListener onRateNeverDialogListener;

    //...

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.dialog_rating_button_never_rate) {
            savedNeverShow();
            dismiss();

            if (onRateNeverDialogListener != null) {
                onRateNeverDialogListener.onClick();
            }
        } else if (v.getId() == R.id.dialog_rating_button_rate_later) {
            dismiss();
            incrementLaunchCount(true);

            if (onRateLaterDialogListener != null) {
                onRateLaterDialogListener.onClick();
            }
        } else if (v.getId() == R.id.dialog_rating_button_rate) {
            savedNeverShow();
            dismiss();

            if (onRatingDialogListener != null) {
                onRatingDialogListener.onClick();
            } else {
                openPlayStore();
            }
        }
    }

    // ...

    public static class Builder {
        //...

        @NonNull
        public Builder setRateLaterButtonText(String rateLaterButtonText, @Nullable OnRatingDialogListener onRateLaterClickListener) {
            appRatingDialog.mRateLaterButtonText = rateLaterButtonText;
            appRatingDialog.onRateLaterDialogListener = onRateLaterClickListener;
            return this;
        }

        @NonNull
        public Builder setNeverRateButtonText(String neverRateButtonText, @Nullable OnRatingDialogListener onNeverRateClickListener) {
            appRatingDialog.mNeverRateButtonText = neverRateButtonText;
            appRatingDialog.onRateNeverDialogListener = onNeverRateClickListener;
            return this;
        }

        // ...
    }
}

编辑3:

同时打开Play Store并通知监听器:

public class AppRatingDialog extends AppCompatDialog implements View.OnClickListener {
    //...
    private OnRatingDialogListener onRatingDialogListener;
    private OnRatingDialogListener onRateLaterDialogListener;
    private OnRatingDialogListener onRateNeverDialogListener;

    //...

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.dialog_rating_button_never_rate) {
            savedNeverShow();
            dismiss();

            if (onRateNeverDialogListener != null) {
                onRateNeverDialogListener.onClick();
            }
        } else if (v.getId() == R.id.dialog_rating_button_rate_later) {
            dismiss();
            incrementLaunchCount(true);

            if (onRateLaterDialogListener != null) {
                onRateLaterDialogListener.onClick();
            }
        } else if (v.getId() == R.id.dialog_rating_button_rate) {
            savedNeverShow();
            dismiss();

            openPlayStore();

            if (onRatingDialogListener != null) {
                onRatingDialogListener.onClick();
            }   
        }
    }

    // ...
}

例如,当单击“评价应用”按钮时。步骤1是:执行“goToPickerActivity()”。完成后,步骤2是:运行通常的“评价应用”点击代码。 - Panjeet
你的代码有问题。当点击“评价应用”时,执行的是“不再提示”的按钮代码,而没有执行“评价应用”的代码。为什么会这样? - Panjeet
之前打开过吗?我觉得没有。逻辑是这样的:如果您设置了一个监听器,您将处理点击事件,并且Play Store未打开。可以尝试使用先前的实现。如果您想同时打开Play Store并添加监听器,请查看我的EDIT 3。 - Sergio
好的,这很不错。唯一的问题是从Play Store返回应用程序后,goToPickerActivity中的地图没有像应该打开。这个问题能修复吗? - Panjeet
好的,那就够了。还有一个小问题:当屏幕的其他部分被点击时,如何使对话框不消失? - Panjeet
显示剩余12条评论

-1

尝试在您的 build.gradle 项目级别中更新以下依赖项:

classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:$the_latest_version'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接