2011-11-26 52 views
4

我原本以爲我的轉換片段非常好做,直到我旋轉屏幕。我收到以下類型的錯誤:Android的碎片重新實例化錯誤

RuntimeException:無法啓動活動ComponentInfo {com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.GedStar}:android.support.v4.app.Fragment $ InstantiationException:Unable to實例化片段com.ghcssoftware.gedstar.PersonTab $ PersonTabFrag:確保類名存在,是公共的,並且具有公共的空構造函數

有問題的類確實存在,是公共的,並且我添加了一個空構造函數結果沒有變化。看一些示例代碼,我注意到與我的代碼編寫方式有一些區別,儘管我沒有看到空構造函數:

1)是否有任何理由將我的片段類聲明爲「static」很多樣本是?

2)我需要我的片段類中實現使用「的newInstance」的?爲什麼這樣做,而不是隻有一個構造函數?例如從V14樣本之一:

public static class CountingFragment extends Fragment { 
    int mNum; 

    /** 
    * Create a new instance of CountingFragment, providing "num" 
    * as an argument. 
    */ 
    static CountingFragment newInstance(int num) { 
     CountingFragment f = new CountingFragment(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

我還是有點生疏了一些Java概念,所以可能失去了一些東西基本。

道格·戈登 GHCS軟件

+0

我不知道什麼與您的旋轉問題的發生,但這頁面描述靜態類聲明的目的是:http:/ /www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html – goto10

回答

4

是否有我的片段類應該聲明「靜態」因爲許多樣品的原因嗎?

只有當它是一個內部類的東西。由於你的看起來是PersonTab的內部類,所以它需要是靜態的。或者,將它移出PersonTab以成爲獨立的Java類。

我需要我的片段類中實現使用「的newInstance」的?爲什麼這樣做,而不是隻有一個構造函數?

這只是一個工廠方法。它不是框架所要求的。

+0

尋找一點澄清:我與應用程序運行的旋轉屏幕,我的活動是「重啓」 - 正確的嗎?那麼,試圖實例化我的片段類的是誰呢?首次啓動時,我的活動本身創建該對象並將其添加到其容器視圖。輪流之後不會簡單地做這件事嗎?那爲什麼它會失敗 - 有什麼不同? – gordonwd

+0

@gordonwd:「那麼,試圖實例化我的片段類的是誰?」 - 我無法回答這個問題,因爲您沒有指出是通過「」還是「FragmentTransaction」設置的。 「旋轉之後不是簡單地做這件事嗎?」 - 是的。 「爲什麼它會失敗 - 有什麼不同?」 - 沒有區別。請理解我們不介意讀者。我們只能通過你提供的證據去尋找。你的證據表明你在片段類聲明中存在缺陷,正如我在答案中指出的那樣。 – CommonsWare

+0

對不起,馬克 - 我意識到這一點。儘管我猜我知道如何解決這個問題,但我想了解一些更好的事情,所以我認爲我會放入一些斷點,以便我能夠看到事情發生錯誤的地方(在執行「固定」)。我的碎片全部通過交易添加,順便說一句。我有一個相當複雜的現有的應用程序,並試圖採取一些快捷方式,使其片段友好,但你知道這是怎麼回事... – gordonwd

0

2)。 傳遞一個變量throw newInstance函數參數,在你的情況下它是num,允許排除需要在constraint和onCreateView之間傳遞值的類私有變量。對於int變量它SOVE不算什麼,但對於長串... 問候, 尤里