我升级到Android 2.3.3工作室和一个古老的,无缺陷的程序现在给出错误:“碎片应该是静态的......”
错误的全文是:我升级到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
被提及只是为了表明错误是在哪一类。
我在下面的不完整代码段的评论中的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)
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类。
对不起,你忍住了我! –
@CommonsWare,我知道这是你从第一句话。或者也许这是黄色突出显示。无论如何,多谢棉花糖的时间。 – DSlomer64
@DavidRawson:对不起,我们提交的时间差不多。如果我迟来了,我会刚刚投票答复你的答案并继续前进。 – CommonsWare
,这是错误的部分如下:
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;
}
感谢@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
。
所以教科书并不总是这样做,因为这样做会提高文本的水平远高于目标受众。
我回复了这个问题,因为修订版1是一个很好的规范问题,可能对未来的读者有用。如果您还有其他疑问,那么最好将它们添加为一个新问题,而不是编辑旧问题。祝你好运! –