Android開發中巧用Activity和Fragment
1.Activity的生命週期
1)多個Activity組成Activity棧,當前活動位於棧頂。我們先來看看各種Activity基類的類圖:
當Activity類定義出來之後,這個Activity何時被例項化、它所包含的方法何時被呼叫,這些都不是由開發者所決定的,都應該由Android系統來決定。
下面我們來看一下Activity的生命週期:
2.Activity的用法
1)啟動、關閉Activity
// 首先需要建立啟動的Activity對應的Intent Intent intent = new Intent(MainActivity.this, TwoActivity.class); // 啟動Activity startActivity(Intent intent); startActivityForResult(Intent intent, int requestCode); // requestCode:請求碼 //startActivityForResult方法以指定的請求碼啟動Activity,並通過重寫onActivityResult方法獲取返回的結果。 // 關閉Activity finish(); finishActivity(int requestCode); // finishActivity方法結束以startActivityForResult方法啟動的Activity。
2)啟動其他Activity並返回結果
當前Activity重寫onActivityResult(int requestCode, int resultCode, Intent intent)
requestCode:請求碼(指出該方法是從哪個請求的結果觸發的)
resultCode:Activity返回的結果碼(指出返回的資料來自於哪個新的Activity)
被啟動的Activity需要呼叫setResult()方法設定處理結果。
例項:
在當前Activity中重寫onActivityResult方法
public class MainActivity extends Activity { Button bn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲取介面上的元件 ... // 繫結事件監聽器 bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, TwoActivity.class); startActivityForResult(intent, 0); // 0是請求碼,用於標識該請求 } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { // 處理特定的結果 if (requestCode == 0 && resultCode == 0) { // 取出Intent裡的Extras資料 Bundle data = intent.getExtras(); // 取出Bundle中的資料 String result = data.getString("test"); Toast.makeText(getApplicationContext(), result, 0).show(); } } }
然後在被啟動的TwoActivity中呼叫setResult()方法設定處理結果
// 獲取啟動該Activity之前的Activity對應的Intent Intent intent = getIntent(); intent.putExtra("test", "test"); // 設定該SelectActivity的結果碼,並設定結束之後退回的Activity SelectCityActivity.this.setResult(0, intent); // 結束TwoActivity TwoActivity.this.finish();
3.使用Bundle在Activity之間交換資料
Intent提供了多個過載的方法來“攜帶”額外的資料,如下:
intent.putExtras(Bundle data); // 向Intent放入資料包 intent.putExtras(String name, Xxx value); // 向Intent中按key-value對的形式放入資料 intent.getExtras(); // 取出Intent中攜帶的資料包 intent.getXxxExtras(String name); //從Intent中按key取出指定型別的資料
上面方法中Bundle就是一個簡單的資料攜帶包,Intent主要通過Bundle物件來攜帶資料,Bundle包含多個方法來存取資料:
Bundle bundle = new Bundle(); // 首先建立一個Bundle物件 bundle.putXxx(String key, Xxx data); // 向Bundle中放入資料 bundle.putSerializable(String key, Serializable data); // 向Bundle中放入一個可序列化的物件(即實現了java.io.Serializable介面) bundle.getXxx(String key); // 從Bundle中取出資料 bundle.getSerializable(String key); // 從Bundle中取出一個可序列化的物件
4.Activity的四種載入模式
配置AndroidManifest.xml中Activity時,可指定android:launchMode屬性用於配置該Activity的載入模式,該屬性支援4個屬性值:
standard:標準模式;
singleTop:棧頂單例模式;
singleTask:棧內單例模式(如果目標Activity已經存在、但沒有位於棧頂,系統會把位於該Activity上面的所有Activity移出Task棧,從而使目標Activity轉入棧頂);
singleInstance:全域性單例模式(新建立Activity將放入新棧,一個棧只包含一個Activity,如果目標Activity已經存在,系統會把該Activity所在Task轉到前臺顯示出來)。
5.Fragment的生命週期
Fragment是AndroiD3.0引入的新API,Fragment代表Activity子模組(Activity片段),Fragment必須嵌入到Activity中使用,Fragment的生命週期受它所在Activity的生命週期的控制。
Fragment可呼叫getActivity()方法獲取它所在Activity;
Activity可呼叫FragmentManager的findFragmentById()或findFragmentByTag()方法獲取Fragment;
在Activity執行過程中,可呼叫FragmentManager的add()、remove()、replace()方法動態的新增、刪除和替換Fragment。
1)我們先來看看各種Fragment基類的類圖:
2)下面我們來看一下Fragment的生命週期,並和Activity的生命週期做對比:
6.Fragment的用法
1)建立Fragment
建立Fragment通常要實現如下三個方法:
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的實現類。 第2種:在Java程式碼中通過FragmentTransaction物件的add()方法來新增Fragment。 Activity的getFragmentManager()方法可返回FragmentManager,FragmentManager物件的beginTransaction()方法即可開啟並返回FragmentTransaction物件。
3)如何在Activity中動態的新增、更新、以及刪除Fragment呢?
首先需要在MainActivity佈局檔案中新增FrameLayout(設定id為fl),然後簡單建立一個兩個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); } }
接下來就可以在MainActivity中動態的新增、更新、以及刪除Fragment了,MainActivity中呼叫的方法如下:
// 設定預設的Fragment FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); myFragment = new MyFragment(); transaction.replace(R.id.fl, myFragment); transaction.commit();
假設點選某按鈕更新Fragment,該按鈕點選事件如下:
@Override public void onClick(View v) { FragmentManager fm = getFragmentManager(); // 開啟Fragment事務 FragmentTransaction transaction = fm.beginTransaction(); twoFragment = new TwoFragment(); // 使用當前Fragment的佈局替代fl的控制元件 transaction.replace(R.id.fl, twoFragment); // transaction.addToBackStack(); // 將事物新增到back棧,允許使用者按BACK按鍵返回到替換Fragment之前的狀態 // 事務提交 transaction.commit(); }
相關文章
- Android | Activity和Fragment最全生命週期+發現大牛AndroidFragment
- Activity、Fragment和IntentFragmentIntent
- Android--單Activity+多Fragment,玩轉FragmentAndroidFragment
- activity和fragment中startactivityforresult方法的區別Fragment
- Flutter Android 端 Activity/Fragment 流程原始碼分析FlutterAndroidFragment原始碼
- Android技術棧(一)從Activity遷移到FragmentAndroidFragment
- Activity和fragment是如何互動的Fragment
- Activity和Fragment有什麼區別Fragment
- 巧用Fragment解耦onActivityResultFragment解耦
- Fragment傳值到ActivityFragment
- Android開發教程 - 使用Data Binding(四)在Fragment中的使用AndroidFragment
- Android開發教程 - 使用Data Binding(三)在Activity中的使用Android
- 將一個Activity中的資料傳到另一個Activity的Fragment中的方法Fragment
- Android中Context、Activity、ApplicatioAndroidContextAPP
- 應用程式基礎知識:activity和intent——Android開發祕籍IntentAndroid
- [Android]關閉所有Activity,開啟某個ActivityAndroid
- Android之FragmentAndroidFragment
- 【Android開發入門教程】三.Activity入門指南!Android
- Fragment中的那些坑——Android進階FragmentAndroid
- Android基礎—FragmentAndroidFragment
- ()Android中的Activity建立與週期Android
- fragment返回鍵關閉fragment以及最後一個fragment的時候關閉activity的簡便方法Fragment
- Android中Fragment巢狀Fragment,切換Fragment時不顯示檢視的原因及解決方法AndroidFragment巢狀
- Android setUserVisibleHint-- fragment真正的onResume和onPause方法AndroidFragment
- Android之android:theme設定在Application 和 Activity的區別AndroidAPP
- 3-AVI–Activity與Fragment的資料傳遞Fragment
- Android 9 Activity的載入和顯示Android
- Android 碎片(Fragment)講解AndroidFragment
- Android App開發學習第二十二天:FragmentAndroidAPPFragment
- Android中Activity設計思想個人理解Android
- Android中Activity的四種啟動方式Android
- android --巧用 flexboxLayout 佈局AndroidFlex
- Android 開發中 getContext 和 getActivity的區別AndroidContext
- Android開發在Activity外申請許可權呼叫相機開啟相簿Android
- Android 點將臺:撒豆成兵[- Fragment -]AndroidFragment
- Android Jetpack - Fragment官方說明AndroidJetpackFragment
- Android Activity生命週期Android
- Android之Activity全面解析Android
- 仿寫Android的ActivityAndroid