Java Deitel如何编程Android Cannon游戏匿名内部类警告

Java Deitel如何编程Android Cannon游戏匿名内部类警告,java,android,Java,Android,我正在通过Deitel:Android编写如何编程示例,其中两个示例中,我的Android Studio对匿名内部类给出了警告/错误。它声明片段应该是静态的 正确的方法是什么?如果我创建静态的非匿名内部类,那么就没有关于该类的警告,但是我不能引用非静态类变量(?)。另一种方法是创建一个单独的类(而不是内部类),但引用变量也存在同样的问题 这个问题与示例Cannon游戏、类CannonView、方法showGameOverDialog(如下)以及FlagQuit有关 private void

我正在通过Deitel:Android编写如何编程示例,其中两个示例中,我的Android Studio对匿名内部类给出了警告/错误。它声明片段应该是静态的

正确的方法是什么?如果我创建静态的非匿名内部类,那么就没有关于该类的警告,但是我不能引用非静态类变量(?)。另一种方法是创建一个单独的类(而不是内部类),但引用变量也存在同样的问题

这个问题与示例Cannon游戏、类CannonView、方法showGameOverDialog(如下)以及FlagQuit有关

   private void showGameOverDialog(final int messageId) {

    final DialogFragment gameResult =
            new DialogFragment() {

                @Override
                public Dialog onCreateDialog(Bundle bundle) {

                    AlertDialog.Builder builder =
                            new AlertDialog.Builder(getActivity());
                    builder.setTitle(getResources().getString(messageId));

                    builder.setMessage(getResources().getString(
                            R.string.result_format, shotsFired, totalElapsettime
                    ));
                    builder.setPositiveButton(R.string.reset_game,
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialogIsDisplayed = false;
                                    newGame(); 
                                }
                            });
                    return builder.create(); 
                }
            };


    activity.runOnUiThread(
            new Runnable() {
                @Override
                public void run() {
                    showSystemBars(); 
                    dialogIsDisplayed = true;
                    gameResult.setCancelable(false);
                    gameResult.show(activity.getFragmentManager(), "results");
                }
            }
    );
}

这是我第一次尝试的同一个版本,但这里的问题是变量shotsFired和totalElapsetTime不是静态的,所以它们不能在静态方法中使用。另外,metodi newGame不是静态的。解决这个问题的一个方法是创建额外的静态变量(在这个方法中使用它们),在调用上面的MetodShowGameOverdialog之前将非静态值复制到它们。但我希望有更好的办法。
    // display an AlertDialog when the game ends
    private void showGameOverDialog(final int messageId) {
        // DialogFragment to display game stats and start new game
        final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle(getResources().getString(messageId));
        // display number of shots fired and total time elapsed
        builder.setMessage(getResources().getString(
                R.string.results_format, shotsFired, totalElapsedTime));
        builder.setPositiveButton(R.string.reset_game,
                new DialogInterface.OnClickListener() {
                    // called when "Reset Game" Button is pressed
                    @Override
                    public void onClick(DialogInterface dialog,
                                        int which) {
                        dialogIsDisplayed = false;
                        newGame(); // set up and start a new game
                    }
                }

        );
        /*       final DialogFragment gameResult =
                new DialogFragment() {
                    // create an AlertDialog and return it
                    @Override
                    public Dialog onCreateDialog(Bundle bundle) {
                        // create dialog displaying String resource for messageId
                        AlertDialog.Builder builder =
                                new AlertDialog.Builder(getActivity());
                        builder.setTitle(getResources().getString(messageId));

                        // display number of shots fired and total time elapsed
                        builder.setMessage(getResources().getString(
                                R.string.results_format, shotsFired, totalElapsedTime));
                        builder.setPositiveButton(R.string.reset_game,
                                new DialogInterface.OnClickListener() {
                                    // called when "Reset Game" Button is pressed
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        dialogIsDisplayed = false;
                                        newGame(); // set up and start a new game
                                    }
                                }
                        );

                        return builder.create(); // return the AlertDialog
                    }
                };
*/
        // in GUI thread, use FragmentManager to display the DialogFragment
        activity.runOnUiThread(
                new Runnable() {
                    public void run() {
                        final AlertDialog gameResult = builder.create();
                        showSystemBars();
                        dialogIsDisplayed = true;
                        gameResult.setCancelable(false); // modal dialog
                       // gameResult.show(activity.getFragmentManager(), "results");
                        gameResult.show();
                    }
                }
        );
    }