2

我使用一个Alert类,在其中定义所有警报对话框以向用户显示状态消息。这是因为管理起来更舒服。

此类中定义的典型对话框是

public static void DataCleared(Context con) {
    AlertDialog.Builder builder = new AlertDialog.Builder(con);
    builder.setTitle(R.string.data_cleared_title);
    builder.setIcon(android.R.drawable.ic_dialog_info);
    DialogListner listner = new DialogListner();
    builder.setMessage(R.string.data_cleared_text);
    builder.setPositiveButton("ok", listner);

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

此对话框有一个确定按钮,单击该按钮可关闭对话框。

我在简单调用的任何活动中显示这些对话框

Alerts.DataCleared(MyActivity.this)

现在,以同样的方式,我想创建一个带有两个按钮的对话框,一个取消按钮关闭对话框,一个市场按钮打开另一个 Google Play 应用程序的链接

我试过了

public static void TryThisApp(Context con) {
    AlertDialog.Builder builder = new AlertDialog.Builder(con);
    builder.setTitle(R.string.my_title);
    builder.setIcon(android.R.drawable.ic_dialog_info);
    builder.setMessage(R.string.my_text)
       .setCancelable(false)
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               Intent marketIntent = new Intent(
                        Intent.ACTION_VIEW,
                        Uri.parse("market://details?id=com.myapp.sample"
                                + getPackageName()));
                startActivity(marketIntent);
           }
       })
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
    AlertDialog diag = builder.create();
    diag.show();
}

但不起作用,出现各种编译错误“无法对非静态方法进行静态引用...”

getPackageName()并由startActivity(marketIntent);Eclipse 用红色下划线显示,并带有此消息

我该如何解决这个问题?如何创建带有打开链接和取消按钮的对话框?

4

2 回答 2

3

1)您必须在 Context 上调用getPackageName()andstartActivity()因为是实例方法,

2) 如果您想从另一个类执行此操作,则必须声明Context con为 final,因为安全策略不允许在以不同方法定义的内部类中引用非 final 变量。

3)(不是必须的)你应该反转按钮,通常取消在左边,确认在右边

这是正确的代码:

public static void TryThisApp(final Context con) {
    AlertDialog.Builder builder = new AlertDialog.Builder(con);
    builder.setTitle(R.string.my_title);
    builder.setIcon(android.R.drawable.ic_dialog_info);
    builder.setMessage(R.string.my_text)
       .setCancelable(false)
       .setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
 dialog.cancel();

           }
       })
       .setNegativeButton("Market", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               Intent marketIntent = new Intent(
                        Intent.ACTION_VIEW,
                        Uri.parse("market://details?id=com.myapp.sample"
                                + con.getPackageName()));
                con.startActivity(marketIntent);
           }
       });
    AlertDialog diag = builder.create();
    diag.show();
}
于 2012-10-21T01:54:05.927 回答
0

这里的编译时错误只是getPackageName() and startActivity()两个实例方法(来自上下文)。您想调用con.getPackageName()(即您的 Context 参数)和con.startActivity().

于 2012-10-21T01:03:45.397 回答