1. 程式人生 > >fragment中onCreateView與onActivityCreated的區別,以及fragment中生命週期的利用

fragment中onCreateView與onActivityCreated的區別,以及fragment中生命週期的利用

最近使用了一個自定義的view在activity中執行正常,可在fragment中就奔潰,無提示,之前view是在onCreateView中初始化並呼叫的,崩潰,換到onActivityCreated之後,執行ok了,這是什麼原因呢??

先看看fragment的生命週期,首次展示介面時

Android Fragment生命週期深入探究

可以看到onActivityCreated是在onCreateView之後呼叫的,那麼如果在onCreateView方法的時候直接初始化view,並呼叫,和在onActivityCreated時呼叫,有什麼區別呢

網上有網友回覆

If your view is static, then moving any code to the onActivityCreated method is not necessary. But when you - for instance, fill some lists from the adapter, then you should do it in the onActivityCreated method as well as restoring the view state when setRetainInstance used to do so.

Also accessing the view hierarchy of the parent activity must be done in the onActivityCreated, not sooner.

哦,,大概意思就是如果view是靜態的,那麼沒有必要在onActivityCreated 方法去呼叫,大多數的自定義的view,初始化時都需要一個context,而activity是context的子類,所以在onCreateView方法的時候非靜態的view初始化呼叫可能出現異常,所以對於非靜態的view,最好在onActivityCreated方法呼叫

fragment 生命週期的利用

生命週期有 onAttach(),onCreate(),onCreateView(),onActivityCreated();此為建立時會執行的方法

onstart(),onResume(),是變得可見時會執行的方法

onPause(),onStop(),是進入後臺會執行的方法。

銷燬時會執行 onpause(),onStop(),onDestroyView(),Ondestroy();

我們經常將fragment放在activity中使用,資料是activity獲得,而在fragment中展示,那麼如何比較簡單的實現,在fragment中展示activity的資料呢,

1 我們首先想到的就是,在fragment中增加一個屬性,如在fragment中定義一個list集合,然後在activity中呼叫fragment的構造方法時來給list賦值,可是fragment跟普通的類不一樣,他有自己的生命週期,這樣做會報錯。

2 那麼我們是不是就一定要利用回撥來實現呢,其實不用,我們剛剛看了onStart()方法,是在進入前臺可見時才呼叫,那麼

我們可以在fragment中新增list的set方法,在activity中new 了fragment後,呼叫set方法給list賦值,最後,重寫fragment的onStart()方法,在此方法中展示list的資料

程式碼如下

這是fragment中的set方法

private JSONObject json;
public PayforFragment() {
    // Required empty public constructor
}

public void setJson(JSONObject json) {
    this.json = json;
}
這是重寫的fragment的onStart()方法
@Override
public void onStart() {
    try {
        JSONObject jos = new JSONObject(json.getString("data"));
name.setText(jos.getString("studentName"));
phone.setText(jos.getString("phoneNum"));
bTime.setText(jos.getString("startDate"));
oTime.setText(jos.getString("endDate"));
idCard.setText(jos.getString("idCard"));
pxbj.setText(jos.getString("trainingInfoName"));
je.setText(jos.getString("trainingCost"));
} catch (Exception e) {

    }
    super.onStart();
}
這是在activity中的對fragment的json賦值
AlreadyPayForFragment fragment= new AlreadyPayForFragment();
fragment.setJson(jsonObject);
FragmentManager fragmentManager =getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame, fragment).commit();

相關推薦

字串處理sizeofstrlen區別以及末尾的\0

char *ch = "wonima aisaoziaaa"; int n = sizeof(ch); // 指標長度,對於64平臺來說,值為8 int nn = sizeof(*ch); // 一個字元的長度,值為1 int nnn = strlen(ch); //

fragmentonCreateViewonActivityCreated區別以及fragment生命週期利用

最近使用了一個自定義的view在activity中執行正常,可在fragment中就奔潰,無提示,之前view是在onCreateView中初始化並呼叫的,崩潰,換到onActivityCreated之後,執行ok了,這是什麼原因呢?? 先看看fragment的生命週期,首

GBDTxgb區別以及梯度下降法和牛頓法的數學推導

  2019年01月05日 15:48:32 IT界的小小小學生 閱讀數:31 標籤: xgb gbdt 梯度下降法 牛頓法 xgboost原理 更多 個人分類: data mining 深度學習

Aspectjcallexecution區別織入程式碼位置不同

call 呼叫通知的環境是方法呼叫位置;而execution是方法執行位置,也就是方法簽名處。 具體結合一個示例可以更簡單跟容易理解: 1、pointcut配置: pointcut callPointCut():execution(public

python @classmethod 和 @staticmethod區別以及方法引數cls和self的區別

staticmethod 首先來看@staticmethod,這個裝飾器很好理解,就是讓類中的方法變成一個普通的函式(因為是普通函式,並沒有繫結在任何一個特定的類或者例項上。所以與不需要物件例項化就可以直接呼叫)。可以使用類或者類的例項呼叫,並且沒有任何隱含引數的傳入,

javanull是什麽以及使用要註意的事項

拆箱 大小寫 pan 沒有 使用 類型 區別 null lean 1.null既不是對象也不是一種類型,它僅是一種特殊的值,你可以將其賦予任何引用類型,你也可以將null轉化成任何類型,例如: Integer i=null; Float f=null; String

centos7python3環境的配置以及pycharm執行環境的配置

Centos7安裝Python3的方法 由於centos7原本就安裝了Python2,而且這個Python2不能被刪除,因為有很多系統命令,比如yum都要用到。 輸入Python命令,檢視可以得知是Python2.6.6版本 [root@xxx]# pyt

Android Makefileinherit-product函式簡介以及include的區別

    在 Android Makefile 中時不時會看見 inherit-product 函式的使用,類似下方這樣:         $(call  inherit-product,  vendor/dolby/ds/dolby-product.mk)     從引數來

android開發—FragmentonCreateView()和onActivityCreated()的區別

在編寫Fragment時,在onCreateView()方法中啟動了一個初始化自定義View的方法 initView(),但是除錯時就崩潰,列印日誌發現是這裡出了問題,就將這個方法放到了onActivityCreated()方法中啟動,就沒有再崩潰過,不明白為什

標籤 href 和 onclick 的區別以及href="javascript:xxx(this);"onclick="xxx(this);" 傳遞this引數的區別

<a>標籤中href屬性動作和onclick事件的區別,以及href="javascript:xxx(this);"與onclick="xxx(this);" 傳遞this引數的區別

CSS的聖盃佈局以及聖盃佈局雙飛翼佈局的區別

            為了解決中間寬度自適應,左右列固定寬度,最早出現的是聖盃佈局,雙飛翼佈局是對聖盃佈局的改良,同樣這種 佈局的優勢在於在中間列中的文件可以優先渲染。        1.什麼是聖盃佈局           其實對於聖盃佈局,前面一部分與雙飛翼佈局完

C#override重寫new隱藏的區別以及C#Java的Override區別

在C#中:override重寫,是指對父類中的虛方法(標記為override)或抽象方法(標記為abstract)進行重寫,實現新的功能,它必須與父類方法的簽名完全一致,而且與父類方法的可訪問性也必須一致new方法隱藏,是指在子類中重新定義一個簽名與父類的方法相同的方法,這個

php classpublic,private,protected的區別以及實例

ons report acc per cnblogs 自己 context php undefined 一,public,private,protected的區別 public:權限是最大的,可以內部調用,實例調用等。 protected: 受保護類型,用於本類和繼承

多線程sleep和wait的區別以及多線程的實現方式及原因定時器--Timer

守護 驗證 取消 技術 方法 代碼 安全 接口 art 1. Java中sleep和wait的區別 ① 這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。 sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用b

word-wrapword-break的區別以及無效情況

OS 自動 class word-wrap 就是 con 整體 tro ace 兩種方法的區別說明: 1,word-break:break-all 例如div寬400px,它的內容就會到400px自動換行,如果該行末端有個英文單詞很長(congratulation等),它會

mybatis ${} 和 #{} 的區別以及轉義符

1)#{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設定值,自動進行java型別和jdbc型別轉換,#{}可以有效防止sql注入。#{}可以接收簡單型別值或pojo屬性值。如果parameterType傳輸單個簡單型別值,#{}括號中可以是value或其它名稱。

關於jsreturn false、event.preventDefault()和event.stopPropagation()區別以及阻止事件冒泡和阻止預設事件

在平時專案中,如果遇到需要阻止瀏覽器預設行為,大家經常會用return false;和event.preventDefault()來阻止,但對它倆的區別還是模糊,這裡順便帶上event.stopPropagation()一起區分下。 事件處理程式的返回值只對通過屬性註冊的處理程式才有意義,如果我

php classpublic,private,protected,static的區別以及例項

一,public,private,protected的區別 public:許可權是最大的,可以內部呼叫,例項呼叫等。 protected: 受保護型別,用於本類和繼承類呼叫。 private: 私有型別,只有在本類中使用。 二,例項 <?php  

抱怨從何處來又將向何處去 —— 談專案管理者執行者的矛盾以及建議解決方案

工作中,我們最常用的方式是以專案為單位執行任務。在專案中,我們又各有分工,有的人擔當專案管理者,有的人擔當專案開發人員,有的人擔當專案的整合、釋出人員等等。雖然我們看到的是分工明確,然而,在專案的執行過程中卻困難重重。客戶的變更,日程的壓力,無疑是我們最頭痛而且很難改變的。同

java8 map和flatmap的共同點和區別以及兩者的例項解析

在函式式語言中,函式作為一等公民,可以在任何地方定義,在函式內或函式外,可以作為函式的引數和返回值,可以對函式進行組合。由於指令式程式設計語言也可以通過類似函式指標的方式來實現高階函式,函式式的最主要的好處主要是不可變性帶來的。沒有可變的狀態,函式就是引用透明(Referen