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