如何修复android Studio中的android按钮,引发cast异常?

如何修复android Studio中的android按钮,引发cast异常?,android,button,casting,Android,Button,Casting,我的应用程序一直运行良好,直到我开始单击一个特定的按钮,即rate按钮。每次单击此按钮,应用程序都会崩溃,我会在log cat中收到以下消息: 22808/com.nileworx.guesstheplace E/AndroidRuntime: FATAL EXCEPTION: main Process: com.nileworx.guessthepla

我的应用程序一直运行良好,直到我开始单击一个特定的按钮,即
rate按钮
。每次单击此按钮,应用程序都会崩溃,我会在log cat中收到以下消息:

22808/com.nileworx.guesstheplace E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.nileworx.guesstheplace, PID: 22808
                                                                        java.lang.ClassCastException: com.nileworx.guesstheplace.GameActivity cannot be cast to com.nileworx.guesstheplace.MainActivity
                                                                            at com.nileworx.guesstheplace.CustomDialog$11.onClick(CustomDialog.java:283)
                                                                            at android.view.View.performClick(View.java:5198)
                                                                            at android.view.View$PerformClick.run(View.java:21147)
                                                                            at android.os.Handler.handleCallback(Handler.java:739)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                            at android.os.Looper.loop(Looper.java:148)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-25 06:46:03.423 1642-2032/system_process W/ActivityManager:   Force finishing activity com.nileworx.guesstheplace/.GameActivity
我相信
游戏活动中存在问题,只有一个错误:

@Override
protected void onResume() {
    super.onResume();

    if (!mSharedPreferences.getString("placesNum", "0").equals("0")) {
        String updatesDlgMsg = String.format(getResources().getString(R.string.updatesDlg), mSharedPreferences.getString("placesNum", "0"));
        dialog.showDialog(R.layout.blue_dialog, "updatesDlg", updatesDlgMsg, mSharedPreferences.getString("placesJSON", ""));
        e.putString("placesNum", "0");
        e.commit();
    }
}
第6行代码出现以下消息问题:

格式字符串“updatesDlg”不是有效的格式字符串,因此应 无法传递到String.format less。。。(Ctrl+F1)如果字符串包含 “%”字符,则该字符串可能是将 从Java代码传递到String.format以替换每个“%” 具有特定值的事件。此棉绒警告检查两次 相关问题:(1)格式化无效的字符串,即 该String.format在运行时尝试 使用格式字符串。(2) 包含“%”的字符串不是 正在格式化传递给String.format调用的字符串。在这个 案例“%”需要作为“%”转义。注意:并非所有字符串 这些字符串看起来像是供用户使用的格式化字符串 字符串格式;例如,它们可能包含用于 android.text.format.Time#format()。林特不可能总是明白这一点 字符串是日期格式,因此在这些格式中可能会出现错误警告 情节。请参阅“抑制帮助”主题,以了解有关如何抑制的信息 在这种情况下抑制错误

我不知道如何解决这个问题,我已经尝试了两个多小时来解决它

我的费率按钮代码

private void rateDlg(final Dialog dialog, final String marketLink) {

    Button rateBtn = (Button) dialog.findViewById(R.id.rateBtn);
    // if button is clicked, close the custom dialog
    rateBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            sou.playSound(R.raw.buttons);
            dialog.dismiss();
            MainActivity mainAct = (MainActivity) context;
            Intent intent = new Intent(Intent.ACTION_VIEW);



            intent.setData(Uri.parse("playstorelink, changed for stackoverflow"));

            if (!mainAct.MyStartActivity(intent)) {
                // Market (Google play) app seems not
                // installed, let's try
                // to open a webbrowser
                intent.setData(Uri.parse("playstorelink, changed for stackoverflow"));
                if (!mainAct.MyStartActivity(intent)) {
                    // Well if this also fails, we have run
                    // out of options,
                    // inform the user.
                    Toast.makeText(context, "Could not open Android market, please install the market app.", Toast.LENGTH_SHORT).show();
                } else {
                    editor.putInt("usingNum", 100);
                    editor.commit();
                }
            } else {
                editor.putInt("usingNum", 100);
                editor.commit();
            }
        }
    });

    Button laterBtn = (Button) dialog.findViewById(R.id.laterBtn);
    // if button is clicked, close the custom dialog
    laterBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            sou.playSound(R.raw.buttons);
            editor.putInt("usingNum", 0);
            editor.commit();
            dialog.dismiss();
        }
    });
}

首先检查字符串资源文件中是否存在
R.string.updatesDlg

您的另一个问题是由于错误
GameActivity无法转换为com.nileworx.guesstheplace.MainActivity
,您正在尝试将一个类转换为另一个类。您的按钮对话框代码显示在这里

MainActivity mainAct = (MainActivity) context;
我很确定本例中的
context
不是
MainActivity
类型。检查
上下文的类型
。错误表明它属于
GameActivity
类型

话虽如此,我不明白你为什么需要联系
main活动
,除非那里发生了什么特别的事情。您可以创建一个
Helper
类,并包含一个检查是否安装了包的方法。在活动的上下文中传递。像这样:

//MainActivity mainAct = (MainActivity) context;
//Intent intent = new Intent(Intent.ACTION_VIEW);
//intent.setData(Uri.parse("playstorelink, changed for stackoverflow"));

if (!isPackageInstalled(playstorelink)) {
    // Market (Google play) app seems not
    // installed, let's try
    // to open a webbrowser
    //intent.setData(Uri.parse("playstorelink, changed for stackoverflow"));
    if (!isPackageInstalled(playstorelink)) {
        Toast.makeText(context, "Could not open Android market, please install the market app.", Toast.LENGTH_SHORT).show();
    } else {
        editor.putInt("usingNum", 100);
        editor.commit();
    }
} else {
    editor.putInt("usingNum", 100);
    editor.commit();
}

private boolean isPackageInstalled(Context context, String packagename) {
    try {
        context.packageManager.getPackageInfo(packagename, 0);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

另一方面,这行代码让我相信您已将活动的实例保存到静态变量中:

if(!mainAct.MyStartActivity(intent)){

这太糟糕了!我要引用这句话-

永远不要将上下文存储在硬引用中,否则会泄漏 内存。一个活动引用了视图和许多其他 如果存储上下文,则存储活动和 从那以后事情会变得糟糕。学会传递上下文,使用 应用程序上下文,只要可能,并且需要传递 有充分的理由这样做。大多数情况下,应用程序上下文 足够获取资源、字符串等 存储上下文,始终存储上下文。getApplicationContext();从不 存储一个静态活动上下文。你也可以用谷歌搜索它,然后 StackOverflow有一些很好的答案


不必将上下文存储在静态变量中,您可以使用事件系统库,例如在活动/片段之间进行通信。您也可以将上下文从一个位置传递到另一个位置,或者使用intent
putExtras
向intent添加数据,然后在另一个活动/对话框中接收数据…

也许您应该发布代码> > RATButt < /代码>。这是我得到的信息,当我在第二个代码的第六行代码中滚动时,请不要关闭这个问题,这样一个有效答案的问题对于社区来说是有益的,因为这可以帮助另一个人。如果它解决了你的问题,请接受答案。谢谢!注意,如果我的回答有助于解决您的问题,请接受我的回答,或者让它作为一个资源为其他人打开……好吧,那么我如何才能更改最后一件事,因此上下文和mainactivity是同一类型的?我不太擅长使用Android Studio。什么是
mainAct
,是类似于此的
public static mainactivity mainAction;
?该
上下文
变量的类型是什么?如果您可以发布整个活动,替换您为buttonYes发布的代码,那么它就是actually@Raven然后我更新的答案会帮助你,这是非常糟糕的。我知道,因为我在开始使用Android时做了同样的事情。永远不要存储活动引用、上下文或任何与此相关的内容对静态变量进行排序。我将用建议更新我的答案。