Android開(kāi)發(fā) Activity和Fragment詳解
1.Activity的生命周期
1)多個(gè)Activity組成Activity棧,當(dāng)前活動(dòng)位于棧頂。我們先來(lái)看看各種Activity基類的類圖:
當(dāng)Activity類定義出來(lái)之后,這個(gè)Activity何時(shí)被實(shí)例化、它所包含的方法何時(shí)被調(diào)用,這些都不是由開(kāi)發(fā)者所決定的,都應(yīng)該由Android系統(tǒng)來(lái)決定。
下面我們來(lái)看一下Activity的生命周期:
2.Activity的用法
1)啟動(dòng)、關(guān)閉Activity
// 首先需要?jiǎng)?chuàng)建啟動(dòng)的Activity對(duì)應(yīng)的Intent Intent intent = new Intent(MainActivity.this, TwoActivity.class); // 啟動(dòng)Activity startActivity(Intent intent); startActivityForResult(Intent intent, int requestCode); // requestCode:請(qǐng)求碼 //startActivityForResult方法以指定的請(qǐng)求碼啟動(dòng)Activity,并通過(guò)重寫onActivityResult方法獲取返回的結(jié)果。 // 關(guān)閉Activity finish(); finishActivity(int requestCode); // finishActivity方法結(jié)束以startActivityForResult方法啟動(dòng)的Activity。
2)啟動(dòng)其他Activity并返回結(jié)果
當(dāng)前Activity重寫onActivityResult(int requestCode, int resultCode, Intent intent)
requestCode:請(qǐng)求碼(指出該方法是從哪個(gè)請(qǐng)求的結(jié)果觸發(fā)的)
resultCode:Activity返回的結(jié)果碼(指出返回的數(shù)據(jù)來(lái)自于哪個(gè)新的Activity)
被啟動(dòng)的Activity需要調(diào)用setResult()方法設(shè)置處理結(jié)果。
實(shí)例:
在當(dāng)前Activity中重寫onActivityResult方法
public class MainActivity extends Activity { Button bn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲取界面上的組件 ... // 綁定事件監(jiān)聽(tīng)器 bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, TwoActivity.class); startActivityForResult(intent, 0); // 0是請(qǐng)求碼,用于標(biāo)識(shí)該請(qǐng)求 } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { // 處理特定的結(jié)果 if (requestCode == 0 && resultCode == 0) { // 取出Intent里的Extras數(shù)據(jù) Bundle data = intent.getExtras(); // 取出Bundle中的數(shù)據(jù) String result = data.getString("test"); Toast.makeText(getApplicationContext(), result, 0).show(); } } }
然后在被啟動(dòng)的TwoActivity中調(diào)用setResult()方法設(shè)置處理結(jié)果
// 獲取啟動(dòng)該Activity之前的Activity對(duì)應(yīng)的Intent Intent intent = getIntent(); intent.putExtra("test", "test"); // 設(shè)置該SelectActivity的結(jié)果碼,并設(shè)置結(jié)束之后退回的Activity SelectCityActivity.this.setResult(0, intent); // 結(jié)束TwoActivity TwoActivity.this.finish();
3.使用Bundle在Activity之間交換數(shù)據(jù)
Intent提供了多個(gè)重載的方法來(lái)“攜帶”額外的數(shù)據(jù),如下:
intent.putExtras(Bundle data); // 向Intent放入數(shù)據(jù)包 intent.putExtras(String name, Xxx value); // 向Intent中按key-value對(duì)的形式放入數(shù)據(jù) intent.getExtras(); // 取出Intent中攜帶的數(shù)據(jù)包 intent.getXxxExtras(String name); //從Intent中按key取出指定類型的數(shù)據(jù)
上面方法中Bundle就是一個(gè)簡(jiǎn)單的數(shù)據(jù)攜帶包,Intent主要通過(guò)Bundle對(duì)象來(lái)攜帶數(shù)據(jù),Bundle包含多個(gè)方法來(lái)存取數(shù)據(jù):
Bundle bundle = new Bundle(); // 首先創(chuàng)建一個(gè)Bundle對(duì)象 bundle.putXxx(String key, Xxx data); // 向Bundle中放入數(shù)據(jù) bundle.putSerializable(String key, Serializable data); // 向Bundle中放入一個(gè)可序列化的對(duì)象(即實(shí)現(xiàn)了java.io.Serializable接口) bundle.getXxx(String key); // 從Bundle中取出數(shù)據(jù) bundle.getSerializable(String key); // 從Bundle中取出一個(gè)可序列化的對(duì)象
4.Activity的四種加載模式
配置AndroidManifest.xml中Activity時(shí),可指定android:launchMode屬性用于配置該Activity的加載模式,該屬性支持4個(gè)屬性值:
standard:標(biāo)準(zhǔn)模式;
singleTop:棧頂單例模式;
singleTask:棧內(nèi)單例模式(如果目標(biāo)Activity已經(jīng)存在、但沒(méi)有位于棧頂,系統(tǒng)會(huì)把位于該Activity上面的所有Activity移出Task棧,從而使目標(biāo)Activity轉(zhuǎn)入棧頂);
singleInstance:全局單例模式(新創(chuàng)建Activity將放入新棧,一個(gè)棧只包含一個(gè)Activity,如果目標(biāo)Activity已經(jīng)存在,系統(tǒng)會(huì)把該Activity所在Task轉(zhuǎn)到前臺(tái)顯示出來(lái))。
5.Fragment的生命周期
Fragment是AndroiD3.0引入的新API,F(xiàn)ragment代表Activity子模塊(Activity片段),F(xiàn)ragment必須嵌入到Activity中使用,F(xiàn)ragment的生命周期受它所在Activity的生命周期的控制。
Fragment可調(diào)用getActivity()方法獲取它所在Activity;
Activity可調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()方法獲取Fragment;
在Activity運(yùn)行過(guò)程中,可調(diào)用FragmentManager的add()、remove()、replace()方法動(dòng)態(tài)的添加、刪除和替換Fragment。
1)我們先來(lái)看看各種Fragment基類的類圖:
2)下面我們來(lái)看一下Fragment的生命周期,并和Activity的生命周期做對(duì)比:
6.Fragment的用法
1)創(chuàng)建Fragment
創(chuàng)建Fragment通常要實(shí)現(xiàn)如下三個(gè)方法:
onCreate()、onCreateView()、onPause()
為了控制Fragment顯示的組件,通常需要重寫onCreateView()方法,該方法返回的View將作為該Fragment顯示的View組件。
// 重寫該方法,該方法返回的View將作為Fragment顯示的組件 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加載/res/layout/目錄下的fragment.xml布局文件 View view = inflater.inflate(R.layout.fragment, container, false); TextView name = (TextView)view.findViewById(R.id.name)); ... return view; }
2)將Fragment添加到Activity
將Fragment添加到Activity有如下兩種方式:
第1種:在布局文件中使用<fragment.../>元素添加Fragment,<fragment.../>元素的android:name屬性指定Fragment的實(shí)現(xiàn)類。
第2種:在Java代碼中通過(guò)FragmentTransaction對(duì)象的add()方法來(lái)添加Fragment。
Activity的getFragmentManager()方法可返回FragmentManager,F(xiàn)ragmentManager對(duì)象的beginTransaction()方法即可開(kāi)啟并返回FragmentTransaction對(duì)象。
3)如何在Activity中動(dòng)態(tài)的添加、更新、以及刪除Fragment呢?
首先需要在MainActivity布局文件中添加FrameLayout(設(shè)置id為fl),然后簡(jiǎn)單創(chuàng)建一個(gè)兩個(gè)Fragment(MyFragment和TwoFragment)如下:
public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_my, container, false); } } public class TwoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_two, container, false); } }
接下來(lái)就可以在MainActivity中動(dòng)態(tài)的添加、更新、以及刪除Fragment了,MainActivity中調(diào)用的方法如下:
// 設(shè)置默認(rèn)的Fragment FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); myFragment = new MyFragment(); transaction.replace(R.id.fl, myFragment); transaction.commit();
假設(shè)點(diǎn)擊某按鈕更新Fragment,該按鈕點(diǎn)擊事件如下:
@Override public void onClick(View v) { FragmentManager fm = getFragmentManager(); // 開(kāi)啟Fragment事務(wù) FragmentTransaction transaction = fm.beginTransaction(); twoFragment = new TwoFragment(); // 使用當(dāng)前Fragment的布局替代fl的控件 transaction.replace(R.id.fl, twoFragment); // transaction.addToBackStack(); // 將事物添加到back棧,允許用戶按BACK按鍵返回到替換Fragment之前的狀態(tài) // 事務(wù)提交 transaction.commit(); }
以上就是對(duì)Android Activity和Fragment 的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
- Android基礎(chǔ)之Fragment與Activity交互詳解
- Android 管理Activity中的fragments
- Android中fragment與activity之間的交互(兩種實(shí)現(xiàn)方式)
- Android中Fragment與Activity的生命周期對(duì)比
- Android Fragment與Activity之間的相互通信實(shí)例代碼
- 詳解Android activity與fragment之間的通信交互
- Android基礎(chǔ)之使用Fragment控制切換多個(gè)頁(yè)面
- Android中fragment嵌套fragment問(wèn)題解決方法
- Android程序開(kāi)發(fā)之Fragment實(shí)現(xiàn)底部導(dǎo)航欄實(shí)例代碼
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- android開(kāi)發(fā)教程之實(shí)現(xiàn)滑動(dòng)關(guān)閉fragment示例
- Android開(kāi)發(fā)教程之Fragment定義、創(chuàng)建與使用方法詳解【包含Activity通訊,事務(wù)執(zhí)行等】
相關(guān)文章
簡(jiǎn)單實(shí)現(xiàn)Android驗(yàn)證碼
在登錄或者注冊(cè)的時(shí)候要求輸入驗(yàn)證碼,這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)Android驗(yàn)證碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼
這篇文章主要介紹了Android 5.0+ 屏幕錄制實(shí)現(xiàn)的示例代碼,從 5.0 開(kāi)始,系統(tǒng)提供給了 app 錄制屏幕的一系列方法,不需要 root 權(quán)限,只需要用戶授權(quán)即可錄屏,相對(duì)來(lái)說(shuō)較為簡(jiǎn)單,感興趣的小伙伴們可以參考一下2018-05-05Android自定義View實(shí)現(xiàn)照片裁剪框與照片裁剪功能
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)照片裁剪框與照片裁剪功能的相關(guān)資料,需要的朋友可以參考下2016-07-07基于RecyclerView實(shí)現(xiàn)橫向GridView效果
這篇文章主要為大家詳細(xì)介紹了基于RecyclerView實(shí)現(xiàn)橫向GridView效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android NDK生成及連接靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的方法
這篇文章主要介紹了Android NDK生成及連接靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Android檢測(cè)Activity或者Service是否運(yùn)行的方法
下面小編就為大家分享一篇Android檢測(cè)Activity或者Service是否運(yùn)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03android開(kāi)發(fā)教程之文本框加滾動(dòng)條scrollview
EditText與TextView加上滾動(dòng)條其實(shí)很簡(jiǎn)單,只需要在文本輸入框或者文本顯示框上面加上滾動(dòng)條控件即可2014-02-02Android WebView如何判定網(wǎng)頁(yè)加載的錯(cuò)誤
這篇文章主要介紹了Android WebView如何判定網(wǎng)頁(yè)加載的錯(cuò)誤,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04Kotlin StateFlow單數(shù)據(jù)更新熱流設(shè)計(jì)與使用介紹
StateFlow當(dāng)值發(fā)生變化,就會(huì)將值發(fā)送出去,下流就可以接收到新值。在某些場(chǎng)景下,StateFlow比LiveData更適用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09Android TextView的TextWatcher使用案例詳解
這篇文章主要介紹了Android TextView的TextWatcher使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08