2

错误的全文是:我升级到Android 2.3.3工作室和一个古老的,无缺陷的程序现在给出错误:“碎片应该是静态的......”

C:\Users\Dov\Google Drive\AndroidStudioProjects\FlagQuiz - Copy (2)\app\src\main\java\com\dslomer64\flagquiz\QuizFragment.java

Error: Fragments should be static such that they can be re-instantiated by the system, and anonymous classes are not static [ValidFragment]

更糟糕的是,它并没有告诉我这行的错误是,我曾以为,因为它是上面提到的,这QuizFragment有过错,但如何?所以我得出结论,QuizFragment被提及只是为了表明错误是在哪一类。

此外,请注意,没有行被标记为黄色正方形显示的错误。 enter image description here

我在下面的不完整代码段的评论中的3个地方找到了“匿名”一词。

DialogFragment quizResults = new DialogFragment() // anonymously **********  
         // extend DialogFragment class 
{ 
    @Override public Dialog onCreateDialog(Bundle bundle) 
    { 
    ... 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setPositiveButton 
    (
     R.string.reset_quiz, 
     new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       resetQuiz(); 
      } 
     } // end anonymous inner class ******************* 
    ); 
    return builder.create(); // return the AlertDialog 

    } // end method onCreateDialog 

}; // end DialogFragment anonymous inner class **************** 

有什么问题(如为2.3.3,没有什么是升级之前错误的)与DialogFragment quizResults = new DialogFragment()builder的定义,其中包含一个匿名内部类?

如果是这样,为什么没有编译错误?在这种情况下,我该如何解决这个问题? (我不想刚刚开始剽窃代码,我没有写[我从作者那里收到项目并做了很多修改],因为至少有3个可以想象的出发点,也许没有解决错误( ?S)

+0

我回复了这个问题,因为修订版1是一个很好的规范问题,可能对未来的读者有用。如果您还有其他疑问,那么最好将它们添加为一个新问题,而不是编辑旧问题。祝你好运! –

回答

3

nothing was wrong before upgrade

最有可能的,有。 Android Studio以前不会抱怨你的代码,但它可能无法正常工作。现在Android Studio正在指出这个问题,而不是你在测试中找到困难的方法。

Is there something wrong... with DialogFragment quizResults = new DialogFragment()

是的。无法重新创建片段。因此,当用户旋转屏幕,改变语言环境或夜间模式或其他任何可能的配置更改时,当Android销毁片段并尝试重新创建它时,它不能。只有你问题中的代码行可以重新创建片段,这些代码行是你的,而不是框架的,而且它不知道它们。

您可能已经通过android:configChanges阻止了活动的普通销毁和重新创建循环。这本身通常是反模式,但如果您合法需要android:configChanges并正确使用它,则应该能够抑制此Lint错误。

And in this case, how do I fix the problem?

quizResults创建一个普通的Java类,扩展DialogFragment和包括你的代码。然后,使用该Java类。

+0

对不起,你忍住了我! –

+0

@CommonsWare,我知道这是你从第一句话。或者也许这是黄色突出显示。无论如何,多谢棉花糖的时间。 – DSlomer64

+0

@DavidRawson:对不起,我们提交的时间差不多。如果我迟来了,我会刚刚投票答复你的答案并继续前进。 – CommonsWare

2

,这是错误的部分如下:

DialogFragment quizResults = new DialogFragment() { 

    @Override 
    public Dialog onCreateDialog(Bundle bundle) { 

你在哪里定义的DialogFragment一个匿名子类这是用碎片的错误方式由新皮棉的建议检查Android 2.3.3。

为什么?如果使用活动的FragmentManager,像这样实例化片段会导致问题。

有问题的情况如下:当Activity#saveInstanceState(Bundle outState)被调用时FragmentManager将尝试保存您的Fragment的状态。当随后活动状态恢复时,FragmentManager将尝试重新创建碎片(使用无参数构造函数)并将它们的状态设置为以前的方式。如果你使用Fragment的匿名子类,这是不可能的。

Henec,片段必须有一个无参数构造函数,实例化它们的首选方法是使用静态工厂方法。相反匿名子类,使用Fragment#setArguments(Bundle bundle)

QuizFragment.java

public static QuizFragment instantiate(Bundle args) { 
    QuizFragment frag = new QuizFragment(); 
    frag.setArguments(args); 
    return frag; 
} 
0

感谢@Commonsware和@David Rawson,我设法通过改变编译器所持有的任何东西来改变static的内部类static,其中包括几个方法以及许多(每个?)变量。

这就提出一个问题:

public static void loadNextFlag() 
    { 
... 
    // display current question number--2nd and 3rd parameters are INPUT into the xml statement 

    questionNumberTextView.setText 
     (correctAnswers + 1) + //was , 
     "/" + FLAGS_IN_QUIZ); 

    //  AssetManager assets = getActivity().getAssets(); 

... 
} // end method loadNextFlag 

格式化questionNumberTextView线,就必须改变以

questionNumberTextView.setText(
           ("" + (correctAnswers + 1) 
           "/" + FLAGS_IN_QUIZ); 

因为原来

questionNumberTextView.setText(getResources().getString 
      (R.string.question, 
      (correctAnswers + 1), 
       FLAGS_IN_QUIZ); 

给静态还是非静态错误getResources。我刚刚解决不了一个格式,但适合。

我也制作assets全球static变量只能分配一次,在onCreateView

所以教科书并不总是这样做,因为这样做会提高文本的水平远高于目标受众。

相关问题