12

我真的很好奇如何確定(來自外部類)如果片段的onCreateView()已被調用。我搜索了類似的問題,但沒有發現。我如何知道onCreateView已被外部類調用?

比如說,是fragment.isAdded()的一個很好的指標?

我的第一個想法是簡單地fragment.getView() != null,但我並不是100%確定它看起來是可靠的,而且我也略微不願意使用它(無特殊原因,我只是傾向於避免無效檢查)。我很樂意找到解決方法。我建議有:

isAdded()

返回真,如果片段正在增加其活性。

這條線在我看來很模糊; 增加了不是附加,但都沒有創建。它可能涉及到FragmentTransaction.add()(這在語義上是錯誤的,因爲您可以讓<fragment>停留在佈局中,而無需致電addreplace)。

仍然,FragmentTransaction.add()documentation沒有信息也沒有讓你覺得added -> created。我會說不。

ISVISIBLE()

返回真,如果片段是當前對用戶可見。這意味着:(1)已被添加,(2)將其視圖附加到窗口,並且(3)不被隱藏。

看起來不錯,從這個意義上說,isVisible() -> isCreated,但第三個選項使它isCreated != isVisible。我只是想到視圖尋呼機中的片段:並非所有片段都可見,但是當前可見片段附近的片段被添加,創建並存活,您可以調用它們的方法。但對於他們來說,isVisible() == false。這太嚴格了。

isInLayout()

返回如果爲真佈局被包括作爲經由<片段>標記的活動視圖 層次結構的一部分。在通過< fragment>標記創建 片段時,除非 (其中舊片段從先前狀態恢復並且 不出現在當前狀態的佈局中)除外。

我不認爲這適用於此。

getView()!= NULL

返回 片段的根視圖,或者null若沒有佈局。

這看起來仍然是唯一的解決方案。我只是想確認一下。

實現回調

..to被稱爲onCreateView(),或者更好,onViewCreated()。但是:

  • 我不需要在創建片段後立即調用某些內容(爲什麼需要這樣做?),我需要在給定時間檢查某些內容;
  • 應該定義相反的,比如onViewNotAvailableAnymore(),使檢查在任何時候都有意義;
  • 我不明白這與getView != null會有什麼不同或更好。
+0

也許這將幫助你: http://stackoverflow.com/questions/9294603/get-currently-displayed-fragment – q21forfun

+0

設置的界面和使用一個活動,您可以在其中添加片段以查看片段的onCreateView是否被調用。 –

回答

4

假設

  • 你不感興趣的Fragment是否可見
  • 你想知道只有當onCreateView(...)方法已被稱爲Android框架
  • 你需要使用現有的片段API方法找出

然後用

getView() != null 

前提條件是您充氣佈局並返回onCreateView(...)內的View

非片段API方法是在onCreate(...)中添加回調,然後在onCreateView()或更高版本(生命週期中)方法中調用該回調。

+0

聽者的方法並不是我所要求的,因爲我不想在創建片段時立即調用片段上的某些東西(我不知道人們會如何需要),而是檢查給定的片段時間。這也就像設置一個靜態變量爲true,但這樣一個簡單的事情至少應該由框架提供。我相信它是,它必須是'getView()!= null',所以我現在同意你的看法。 – natario

-1

是否Fragment.isAdded()意味着onCreateView已被調用?

isAdded()返回真,如果片段正在增加其活性。 (隱含地稱爲onCreateView())。

+0

我認爲這篇文檔很模糊, *添加*不*附加*,但都不*創建*。它可能指的是'FragmentTransaction#add()'(這在語義上是錯誤的,因爲你可以讓'卡住你的佈局而不必調用'add'或'replace')。另外,'add'文檔也不明確,並且onCreateView已經被調用。 – natario

5

Fragment.isAdded()是否意味着已經調用了onCreateView?

NO !! NO !! 暫停NOOOOOOO00000000000 !!!!!

爵士

Fragment.isAdded()是你Fragment已添加到故事的你Activity,結束的通知。

FragmentTransactionadd()方法有3種不同的方法,所有這些加FragmentActivity,還有,兩個更進一步創建您Fragment小號View並通過LayoutInflater幫助下將其連接到ParentViewGroup提供您的第一個參數是不 (id != 0)

要檢查是否onCreateView()一直叫你需要重寫onViewCreated()

getView()將始終返回null,除非onCreateView()完成

您的解決方案是檢查Fragment.isVisible()

FYI:有沒有錯,我與文檔看。它很清楚,先生。

希望我是清醒的爵士

+0

我的「文檔」思想只是我爲迴應其他答案而做出的修改,而這種修改對我來說並不令人信服。除此之外,我正在尋找方法來檢查視圖是否是從* outside *片段創建的,例如,來自外部活動。我不知道'fragment.getView()!= null'是否是唯一的(也是最好的)方法。 – natario

+0

好吧,你可以去[Fragment.isVisible()](http://developer.android.com/reference/android/app/Fragment.html#isV​​isible%28%29),只有在添加片段時纔會返回true並有一位家長。你也可以看看'FragmentisInLayout()'希望我的說服力@mvai – Elltz

+0

@mvai謹慎分享你的迴應和讚賞? – Elltz

1

如果isAdded()上的一個分段返回true,這並不意味着onCreateView()被調用。實際上,即使在onAttach回調期間,isAdded也會返回true,這在onCreate()之前被調用。

0

我會繼續擴展Fragment類並添加一個公共方法,您可以使用該方法從您的自定義片段類的外部訪問。

onCreateView()被調用時,你可以一個布爾值設置爲,並根據您的架構,你可以將其設置爲回來時,它在onPause()onStop()onDestroyView()onDestroy()onDetach(),同比增長給你。

我不認爲你在你的問題中提到的方法會爲你提供你所需要的。

2

它可以使用接口完成。使OnCreateViewListerner

public interface OnViewCreatedListener 
    { 
     void onCreateCalled(); 
    } 

在片段創建OnViewCreatedListener的靜態對象和在外部類和外部類中初始化它的接口實現諸如

public class CustomClass implements OnViewCreatedListener{ 
     @Override 
     public void onCreateCalled() { 

     } 
    public void initializeInterface() 
    { 
     FragmentTest.listerner = this; 
    } 
    ..... 

    } 

此接口然後覆蓋你的onCreateView()方法和寫這個

public class FragmentTest extends Fragment{ 

public static OnViewCreatedListener listerner; 
    View mView; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
//  if (container == null) 

     if(listerner!= null) 
     { 
      listerner.onCreateCalled(); 
     } 
     mView = inflater.inflate(R.layout.fragment_product, container, false); 


     return mView; 
    } 


    } 

希望這會幫助你。

+0

我會這樣做onViewCreated()實際上,但你錯過了你調用的那一塊,就像onViewNotAvailableAnymore()。我不想回調,而是從給定的'fragment'中知道它的onCreateView()是否已經被調用。我相信'getView!= null'要簡單得多。 – natario

+0

當你不想調用回調,然後只是FragmentTest.listener = null,你可以調用這個回調函數。那麼它會打電話給聽衆。 –

2

請考慮此方法,因爲我也一樣是這樣的:

定義與您的片段上的Interface說:

public Interface IDoSomething{ 

    void intimateAfterOnCreateView(); 
} 

現在,在片段的onStart()調用此方法爲根據生活循環此方法後將調用onCreateView()。 從這個片段外面只是實現IDoSomething,你會得到一個自動覆寫的方法(intimateAfterOnCreateView())。

現在這個方法的執行會顯示onCreateView()已被調用。

我只是想分享我的知識,可能會有幫助。

+1

其他答案在這裏,我相信你錯過了把這個「可用性」設置回false的那一部分。這就像設置一個公共的靜態布爾變量爲'true'(然後檢查'MyFragment.created'),但是我應該什麼時候將它設置回'false',這與getView()更好/不同! = null'? – natario

0

我怎麼知道onCreateView是從外部類調用的?

您需要在片段中創建接口並在容器活動中實現它(比方說MainActivity)。

1.首先創建一個接口的片段中:

// Container activity must implement this interface 
public interface OnCreateViewCalledListener { 
    void OnCreateViewCalled(String someData); 
} 

2.接下來實現你的容器內活動的界面(可以說是MainActivity),並調用它的方法:

public class MainActivity extends AppCompatActivity implements 
     YourFragment.OnCreateViewCalledListener { 
... 

@Override 
    public void OnCreateViewCalled(String someData) { 
     Toast.makeText(MainActivity.this, "OnCreateView was called and passed " + someData) 
    } 

3.然後,您需要檢查MainActivity是否實現接口回調(此步驟對於使其正常工作至關重要):

//Using onAttach method to check that activity has implemented callbacks 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    // Make sure that container activity has implemented 
    // the callback interface. If not, it throws an exception 
    try { 
     mCallback = (OnCreateViewCalledListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnCreateViewCalledListener"); 
    } 
} 

4.最後,你需要觸發內部onCreateView回調:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     mCallback.OnCreateViewCalled("Some useful data"); 
     ... 
    } 

這就是它!

編輯

讓其他類知道onCreateView叫,請使用在MainActivity內onCreateViewCalled()回調(例如使用另一個接口來觸發其他類回調)。 此外,它不是強制性的將數據傳遞到OnCreateViewCalled()