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

所以教科書並不總是這樣做,因爲這樣做會提高文本的水平遠高於目標受衆。

相關問題