java - 尝试将 int 值从对话框传递回活动时发生 ClassCastException
问题描述
我制作了一个 dialogFragment,当单击 OK 按钮时,它会将一个整数值发送回游戏屏幕,这是我认为的活动。但是,当我尝试运行该应用程序时,它会因 ClassCastException 而崩溃。我查看了在线示例,告诉我使用我已经完成的界面,但是我只是不知道为什么会出现此异常,因为我已经在我的游戏屏幕中实现了该界面。
public class AddEmployeesDialogFragment extends DialogFragment {
public static interface DialogListener {
void onNeutralClick(DialogFragment dialog, int val);
}
//variables
int value = 0;
AlertDialog.Builder builder;
AlertDialog alertDialog;
DialogListener listener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
String regionName = getArguments().getString("regionName");
builder = new AlertDialog.Builder(getActivity());
builder.setTitle("How many Employees do you want to add to " + regionName + "?");
builder.setMessage((new Integer(value)).toString());
builder.setPositiveButton("+", null);
builder.setNegativeButton("---", null);
builder.setNeutralButton("Ok", null);
// Create the AlertDialog object and return it
return builder.create();
}
@Override
public void onStart(){
super.onStart();
alertDialog = (AlertDialog)getDialog();
if(alertDialog != null)
{
Button positiveButton = (Button)alertDialog.getButton(Dialog.BUTTON_POSITIVE);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
value++;
alertDialog.setMessage((new Integer(value)).toString());
}
});
Button negativeButton = (Button)alertDialog.getButton(Dialog.BUTTON_NEGATIVE);
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(value > 0) {
value--;
}
alertDialog.setMessage((new Integer(value)).toString());
}
});
Button neutralButton = (Button)alertDialog.getButton(Dialog.BUTTON_NEUTRAL);
neutralButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onNeutralClick(AddEmployeesDialogFragment.this, value);
dismiss();
}
});
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (DialogListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement DialogListener");
}
}
}
public class SoftwarGameScreen extends GameScreen implements AddEmployeesDialogFragment.DialogListener{
//other code here...
@Override
public void onNeutralClick(DialogFragment dialog, int val) {
regionValue[4] = (new Integer(val)).toString();
}
}
E/AndroidRuntime: FATAL EXCEPTION: main
PID: 2196
java.lang.ClassCastException: MainActivity@b424f98 must implement DialogListener
at AddEmployeesDialogFragment.onAttach(AddEmployeesDialogFragment.java:85)
at android.app.Fragment.onAttach(Fragment.java:1478)
at android.app.DialogFragment.onAttach(DialogFragment.java:370)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1242)
at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2426)
at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2205)
at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2161)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2062)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:738)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
解决方案
您必须在 MainActivity.java 文件中实现 DialogListener 接口。试着写:
public class MainActivity extends AppCompatActivity implements AddEmployeesDialogFragment.DialogListener{
//other code here...
@Override
public void onNeutralClick(DialogFragment dialog, int val) {
regionValue[4] = (new Integer(val)).toString();
}
}
推荐阅读
- sql - 子查询会降低查询性能
- javascript - self.registration.getNotifications() 在 firebase-messaging-sw 中返回一个空数组
- java - 如何使用带参数的自定义注释查找 CDI bean?
- c++ - 在 C++ 中使用 D 和 E 表示法有什么区别?
- sqlite - 数据库中的目标行
- excel - 数据透视表 - 将付款合并为一个
- ffmpeg - 使用ffmpeg将两个通道转换为左或右的单个通道
- javascript - 单击提交按钮时如何更改数组的值而不清除之前所做的更改?
- sitefinity - 在页面上放置 Sitefinity 内容块
- jess - JESS 引擎的网页不可用