簡體   English   中英

getSupportLoaderManager()在不同的片段中使用相同的ID?

[英]getSupportLoaderManager() use same ids in different fragments?

我在FragmentActivity中使用多個ListFragments創建一個viewPager。 為了填充不同的列表視圖,我在加載器中獲得LoaderManager和initiliaze。 我希望每個片段都有一個唯一的LoaderManager,但是,片段沒有getSupportLoaderManager()方法,所以我需要調用父片段活動:

getActivity().getSupportLoaderManager()

我的Loaders在不同片段中識別的這種方法的問題與彼此沖突。 當你已經在一個片段中擁有多個加載器id時,它會變得有點麻煩。 那么有沒有辦法為每個片段獲取一個唯一的LoaderManager,而不是調用父片段? 我基本上希望能夠在多個片段上使用相同的id。

謝謝

是的,您可以使用: android.support.v4.app.Fragment.getLoaderManager()為每個片段獲取一個唯一的片段,這意味着您可以從零開始您的ID。

評論太長了,但我會在你的問題評論中繼續我們的討論。

你應該采取相反的方式:實際上ID是活動的本地,而不是片段。

是的,片段和活動之間的耦合很差。 大多數來自片段的回調將片段鏈接到一個活動(即使使用它不是那么干凈的接口),以及將參數從活動傳遞到片段:您必須使用靜態工廠方法來構建片段並設置其參數通過setArgs。

而你的問題就是這樣一個耦合問題:活動的每個片段中的加載器ID不應該與所有其他片段使用的ID重疊。 這也是一個耦合約束,因為我們對位於活動級別的片段有一個約束。 你是對的,這可能是Android在片段級別通過向片段引入本地加載器來解決的。

然而,可能有優雅的方法來解決這個問題並保留相對解耦方案。 例如,您可以創建一個ID工廠,為片段內的加載器生成“好”ID並防止重疊(id ++將是完美的):

public interface IdFactory {
   public int createId();
}

然后在每個片段內,當你需要一個加載器:

this.newLoaderId = idFactory.createId();

使用以下三種策略之一,所有碎片可以共享工廠:

  • 單身人士 每個片段都將通過訪問IdFactory

    IdFactory idFactory = DefaultIdFactory.getInstance();

  • 創建一個實現IdFactory的類的單個實例,使該類的實例成為應用程序類中的數據字段,並為其提供一個getter。 每個片段都可以使用它來訪問它

    IdFactory idFactory =((MyApplication)getActivity()。getApplicationContext())。getIdFactory();

  • 在活動級別創建工廠。 任何一個活動都可以實現IdFactory接口,或者它們可以提供內部類來完成它。 然后每個片段將使用以下方式訪問工廠:

    IdFactory idFactory = getActivity()。getIdFactory(); //或IdFactory idFactory =(IdFactory)getActivity();

第三種選擇是更好的,因為它將遵循您的確切需要,並將遵循活動生命周期,允許您的工廠被垃圾收集。

還有其他選項,如使用RoboGuice或Dagger或任何其他依賴注入框架,但這不太標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM