使用 fragment argument 與 activity 的通信

今天主要學(xué)習(xí)下通過 arguments倔叼,實(shí)現(xiàn)activity 給fragment傳遞數(shù)據(jù)。

以下為目錄:

  • 從 fragment 中啟動(dòng) activity
  • argument 的優(yōu)點(diǎn)
  • argument 的用法

從 fragment 中啟動(dòng) activity

從 fragment 中啟動(dòng) activity 苛骨,和從 activity 中啟動(dòng) activity 是一樣的鸽扁,如圖污呼。


image

需要注意的小點(diǎn)是避咆,newIntent 方法是寫在 CrimeActivity 中的舟肉。在CrimeFragment 中調(diào)用 getActivity().getIntent().getSerializableExtra(...) 得到值。

CrimeActivity.java

public static Intent newIntent(Context packageContext, UUID crimeId){
    Intent intent = new Intent(packageContext,CrimeActivity.class);
    intent.putExtra(EXTRA_CRIME_ID,crimeId);
    return intent;
}

GitHub地址

argument 的優(yōu)點(diǎn)

那么為什么又要用 argument 呢查库?因?yàn)檫@破環(huán)了 CrimeFragment 的封裝路媚,CrimeActivity 無法用于其他的 Activity 了。比較好的做法是把 crime ID 存放到 CrimeFragment 的某個(gè)地方樊销,而不是保存到 CrimeActivity 的私有空間中整慎。這樣就無需依賴 CrimeActivity 的私有空間了。這樣就不需要依賴 CrimeActivity 的 intent 內(nèi)的 extra围苫,CrimeFragment 就能獲取自己所需要的數(shù)據(jù)裤园。屬于fragment 的“某個(gè)地方”就是 argument bundle。

要附加 argument bundle 給 fragment够吩。需要調(diào)用 Fragment.setArguments(Bundle) 方法比然。而且必須在 fragment 創(chuàng)建后,添加給 activity 前呀伙。為了滿足以上的要求零抬,添加 newInstance() 方法隙弛,完成 fragment 實(shí)例和 Bundle 的創(chuàng)建满力。

argument 的用法

那么如何使用呢碳胳?我們從頭來講废境。

首先還是當(dāng)然還是需要啟動(dòng) CrimeActivity榛泛。在 CrimeListFragment 的 CrimeHolder 中啟動(dòng)嚎研。

CrimeListFragment.java

@Override
public void onClick(View view) {
    Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
    startActivity(intent);
}

在 CrimeActivity 中得到 id 并傳給 CrimeFragment蓖墅。

CrimeActivity.java

 @Override
protected Fragment createFragment() {
    UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
    return  CrimeFragment.newInstance(crimeId);
}

CrimeFragment 存放 id 到 argument并創(chuàng)建 fragment。

CrimeFragmen.java

private static final String ARG_CRIME_ID = "crime_id";
public static CrimeFragment newInstance (UUID crimeId){
    Bundle args = new Bundle();
    args.putSerializable(ARG_CRIME_ID,crimeId);

    CrimeFragment fragment = new CrimeFragment();
    fragment.setArguments(args);
    return fragment;
}

在 onCreat(Bundle savedInstanceState) 中得到

CrimeFragment.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
    mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}

現(xiàn)在數(shù)據(jù)可以正常顯示了临扮,那么我想點(diǎn)擊某個(gè)列表項(xiàng)论矾,然后修改它的值,返回列表項(xiàng)后杆勇,可以直接看到修改后的值贪壳,該怎么操作呢?

其實(shí)我們修改后蚜退,數(shù)據(jù)已經(jīng)保存到模型層了闰靴,我們只需要刷新 RecycleView 就可以了。調(diào)用 notifyDataSetChanged() 就行了钻注。這里需要注意的是蚂且,要在 onResume() 方法中寫。

CrimeListFragment.java

 @Override
public void onResume() {
    super.onResume();
    updateUI();
}

private void updateUI() {
    CrimeLab crimeLab = CrimeLab.get(getActivity());
    List<Crime> crimes = crimeLab.getCrimes();
    if (mAdapter==null){
        mAdapter = new CrimeAdapter(crimes);
        mCrimeRecyclerView.setAdapter(mAdapter);
    }else {
        mAdapter.notifyDataSetChanged();
    }
}

現(xiàn)在又有一個(gè)新的問題幅恋,notifyDataSetChanged() 是更新所有的列表項(xiàng)杏死,但是我們每次只修改一個(gè),怎么優(yōu)化這一步操作呢捆交?可以調(diào)用 RecycleView.Adapter 的 notifyItemChanged(int) 方法识埋。

增加一個(gè)變量:

CrimeListFragment.java

//保存位置變量
private int mPosition;
...
//得到位置
@Override
public void onClick(View view) {
    Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
    mPosition = this.getAdapterPosition();
    startActivity(intent);
}

...
//更新某個(gè)位置的數(shù)據(jù)
private void updateUI() {
    CrimeLab crimeLab = CrimeLab.get(getActivity());
    List<Crime> crimes = crimeLab.getCrimes();
    if (mAdapter==null){
        mAdapter = new CrimeAdapter(crimes);
        mCrimeRecyclerView.setAdapter(mAdapter);
    }else {
       // mAdapter.notifyDataSetChanged();
        mAdapter.notifyItemChanged(mPosition);
    }
}

GitHub地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市零渐,隨后出現(xiàn)的幾起案子窒舟,更是在濱河造成了極大的恐慌,老刑警劉巖诵盼,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惠豺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡风宁,警方通過查閱死者的電腦和手機(jī)洁墙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒财,“玉大人热监,你說我怎么就攤上這事∫” “怎么了孝扛?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵列吼,是天一觀的道長。 經(jīng)常有香客問我苦始,道長寞钥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任陌选,我火速辦了婚禮理郑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咨油。我一直安慰自己您炉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布役电。 她就那樣靜靜地躺著赚爵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宴霸。 梳的紋絲不亂的頭發(fā)上囱晴,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音瓢谢,去河邊找鬼畸写。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氓扛,可吹牛的內(nèi)容都是我干的枯芬。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼采郎,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼千所!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒜埋,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤淫痰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后整份,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體待错,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年烈评,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了火俄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讲冠,死狀恐怖瓜客,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤谱仪,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布玻熙,位于F島的核電站,受9級(jí)特大地震影響芽卿,放射性物質(zhì)發(fā)生泄漏揭芍。R本人自食惡果不足惜胳搞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一卸例、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肌毅,春花似錦筷转、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笨奠,卻和暖如春袭蝗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背般婆。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工到腥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔚袍。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓乡范,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啤咽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晋辆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • 旅游業(yè)是綜合性產(chǎn)業(yè),是拉動(dòng)經(jīng)濟(jì)發(fā)展的重要?jiǎng)恿τ钫磥?到十年瓶佳,一個(gè)很大的風(fēng)口,就是文化旅游地產(chǎn)產(chǎn)業(yè)鳞青,這個(gè)市場(chǎng)很大霸饲。 ...
    Jason_167閱讀 129評(píng)論 1 1
  • 生活壞到一定程度就會(huì)好起來,因?yàn)樗鼰o法更壞盼玄。許多事情贴彼,堅(jiān)持堅(jiān)持,就過來了埃儿。不是每個(gè)人都那么完美器仗,只是你沒看到罷了。...
    王語星閱讀 225評(píng)論 0 1