ClassCastException при попытке передать значение int из диалога обратно в действие - PullRequest
0 голосов
/ 14 марта 2019

Я создал элемент dialogFragment, который, когда нажимается кнопка «ОК», отправляет целое значение обратно на игровой экран, что, я думаю, является активностью. Тем не менее, когда я пытаюсь запустить приложение, оно падает с 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)

1 Ответ

0 голосов
/ 14 марта 2019

Вам потребуется реализовать интерфейс DialogListener в вашем файле MainActivity.java. Попробуйте написать:

    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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...