Android開發 Activity和Fragment詳解_Android

來源:互聯網
上載者:User

1.Activity的生命週期

1)多個Activity組成Activity棧,當前活動位於棧頂。我們先來看看各種Activity基類的類圖:

當Activity類定義出來之後,這個Activity何時被執行個體化、它所包含的方法何時被調用,這些都不是由開發人員所決定的,都應該由Android系統來決定。

下面我們來看一下Activity的生命週期:

2.Activity的用法

1)啟動、關閉Activity

// 首先需要建立啟動的Activity對應的IntentIntent intent = new Intent(MainActivity.this, TwoActivity.class);// 啟動ActivitystartActivity(Intent intent);startActivityForResult(Intent intent, int requestCode); // requestCode:請求碼//startActivityForResult方法以指定的請求碼啟動Activity,並通過重寫onActivityResult方法擷取返回的結果。// 關閉Activityfinish();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對應的IntentIntent intent = getIntent();intent.putExtra("test", "test");// 設定該SelectActivity的結果碼,並設定結束之後退回的ActivitySelectCityActivity.this.setResult(0, intent);// 結束TwoActivityTwoActivity.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顯示的組件@Overridepublic 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中調用的方法如下:

// 設定預設的FragmentFragmentManager 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 的資料整理,後續繼續補充相關資料,謝謝大家對本站的支援!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.