2012-07-09 172 views
38

您好我正在看Android的網站上下面的片段示例。setArguments有什麼意義?

http://developer.android.com/guide/components/fragments.html#Example

我想知道爲什麼執行某些方法。

爲什麼例如,在detailsFragment執行下面的方法:

public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

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

    return f; 
} 

你能不能也簡單地初始化DetailsFragment並使用setter方法來設置index代替。繞過整個setArguments

首先使用setArguments有什麼意義?你能不能只使用setter和getters?

+3

最近,將應用程序的核心功能封裝在「碎片」中,然後讓「活動」實質上管理由所述碎片組成的屏幕(和之間的導航)的安排變得很常見。通過一個'Activity',你可以傳遞一個'Bundle'的附加組件,並且可以從'onCreate()'開始直接訪問它。 'Fragments'不響應意圖,因此您可以使用'setArguments()'在它創建之前爲它提供一個'Bundle'''s extras「。 – Karakuri 2012-07-09 15:52:01

+0

@Karakuri謝謝,這是有用的知道。 – HGPB 2012-07-09 16:02:18

+1

看看這個:http://stackoverflow.com/a/7160253/334493 – 2012-07-31 07:52:33

回答

36

你可以使用getters和setter,但是通過傳入一個bundle你不需要編寫那個代碼,因爲它已經在那裏了。另外,我相信如果屏幕方向改變,這些參數會自動再次傳入,這也使得生活更輕鬆。

從本質上講,setArguments和getArguments只是一種設計模式,谷歌建議您遵循:

每一個片段必須有一個空的構造,所以可以 恢復其活性的狀態時,實例化。強烈建議 建議子類沒有其他具有 參數的構造函數,因爲在重新實例化 片段時,將不會調用這些構造函數;相反,參數可以由 調用者提供的setArguments(Bundle)提供,然後由片段 用getArguments()檢索。 http://developer.android.com/reference/android/app/Fragment.html

我認爲這個包括你的片段以及操作所需要setter方法。然後再一次 - 沒有什麼事情可以迫使你這樣做,而且正如你所知道的那樣 - 這不是唯一可以做的事情。

+0

好東西,只是兩種不同的方式來做同樣的工作 - 很好。你的第二點使得使用setArguments比僅僅使用setter和getters更有價值(如果這是真的)。在這種情況下,我不確定它會有什麼區別。但我可能是錯的。 – HGPB 2012-07-09 14:42:12

+0

兩個構造函數怎麼樣;一個是空的,另一個接受片段的初始狀態。然後片段可以使用在onSaveInstanceState()和onCreate()中傳遞的包來保持實例狀態? – 2013-11-28 14:19:39

+0

Glenn,通常我所做的是有一個靜態getInstance(..)方法,該方法創建一個包含所有參數的包,並在片段的一個新實例上使用setArguments()。這樣你就可以調用一個簡單的「構造函數」,參數被設置,並且Android有一個可以在內部使用的漂亮的空構造函數。 – 2014-04-24 16:24:54

23

只是爲了加入Matthew的回答:他正確地引用了Fragments需要一個空的構造函數,以便框架可以在需要時重新實例化它們。

使用getter和setter很好,但是由於框架可能會破壞並重新創建您的Fragment,所以您必須確保不會丟失這些參數。

這必須通過Fragment.onSaveInstanceState()完成。保存的陳述將作爲Fragment.onCreate(),Fragment.onCreateView()和其他幾種方法中的參數savedInstanceState傳回給您。

使用Fragment.setArguments()(在大多數情況下,我假設)更容易,在框架會自動保留參數,因此將爲您完成大部分工作。

安裝程序可能是最初提供給片段的參數以及片段可能隨時調整的參數。在這種情況下,單獨處理savedInstanceState可能比處理savedInstanceState和參數更容易 - 必須在其中作出有效參數的決定。

+4

這是理解碎片的一個非常重要的方面,我認爲碎片可能是荒謬的。你的迴應提供了一些見解。如果你不想使用setArguments,而是想使用setter,那麼你必須使用onSaveInstanceState或android將不能重新初始化你的Fragment?哎呀! – rmirabelle 2013-07-01 14:05:22

+3

@rmirabelle不幸的是,對於Android中的很多情況,我的情況似乎就是這種情況。我發現了很多不可能或有問題的情況,這些情況根本沒有記錄,或者只是作爲某個地方的附屬節點或者是stackoverflow/google組在某處回答。 – sstn 2013-07-05 09:51:37

5
public void setArguments (Bundle args) 

供應結構參數對該片段。在片段附加到其活動之前,只能調用 ;也就是 ,應該在構建片段後立即調用它。 這裏提供的將整個片段被保留的 參數破壞和 創建(可以是大膽從官方 文檔中缺少以前的文本)

Fragments.setArguments(Bundle args)

+0

謝謝。您已通過提供相關文件證實了這一點。 – stevehs17 2016-02-24 20:50:28

0

另外製定者都可能被濫用。如果updateSomeOtherStuff()將更改某個視圖,則會崩潰。

public class MyFragment extends Fragment { 
    void setData(someData){ 
     this.someData = someData; 
     updateSomeOtherStuff() 
    } 
} 

如果傳入一個包中不可能誤用setter,並且您將始終知道這將在生命週期方法中設置。