Android Studio教程07-Fragment的使用

来源:https://www.cnblogs.com/haochen273/archive/2019/01/21/10298415.html
-Advertisement-
Play Games

[TOC] 1. Fragment是什麼 fragment表示 Activity 中的行為或用戶界面部分。可以將多個片段組合在一個 Activity 中來構建多窗格 UI fragment是activity的模塊化組成部分 fragemnt性質: 有自己的生命周期 可以接收輸入事件,並且可以在act ...


目錄

1. Fragment是什麼

  • fragment表示 Activity 中的行為或用戶界面部分。可以將多個片段組合在一個 Activity 中來構建多窗格 UI
  • fragment是activity的模塊化組成部分
  • fragemnt性質:
    • 有自己的生命周期
    • 可以接收輸入事件,並且可以在activity運行時添加或者刪除片段
    • fragment必須依附在activity中(Activity暫停,fragment暫停,銷毀也銷毀)
    • activity運行時,可以獨立操作每個片段,也可以在fragment和activity之間進行通信

1.1. 設計原理和實例

  • 新聞應用可以使用一個片段在左側顯示文章列表,使用另一個片段在右側顯示文章 — 兩個片段併排顯示在一個 Activity 中,每個片段都具有自己的一套生命周期回調方法,並各自處理自己的用戶輸入事件。 因此,用戶不需要使用一個 Activity 來選擇文章,然後使用另一個 Activity 來閱讀文章,而是可以在同一個 Activity 內選擇文章併進行閱讀

2. 創建fragment

通過創建Fragment子類

  • 創建fragment類
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;

public class ArticleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.article_view, container, false);
    }
}
  • 添加到activity佈局中
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.android.fragments.HeadlinesFragment"
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment android:name="com.example.android.fragments.ArticleFragment"
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>
  • 在activity中調用該fragment
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);
    }
}

2.1. fragment的生命周期

生命周期 含義 主要內容
onCreate() 系統會在創建片段時調用此方法 初始化組件
onCreateView() 系統會在片段首次繪製其用戶界面時調用此方法。 要想為您的片段繪製 UI
您從此方法中返回的 View 必須是片段佈局的根視圖
onPause() 系統將此方法作為用戶離開片段的第一個信號(但並不總是意味著此片段會被銷毀)進行調用 確認在當前用戶會話結束後仍然有效的任何更改

2.2 添加用戶界面:融入到Activity中

  • 步驟1: 創建一個佈局文件example_fragment.xml
  • 步驟2: 在fragment類中載入佈局
public static class ExampleFragment extends Fragment {
  // container:您的片段佈局將插入到的父 ViewGroup
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}
  • 步驟3: 在activity中添加片段
    • 方法1:直接在佈局文件中添加:當系統創建此 Activity佈局時,會實例化在佈局中指定的每個片段,併為每個片段調用 onCreateView() 方法,以檢索每個片段的佈局。
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      <fragment android:name="com.example.news.ArticleListFragment"
              android:id="@+id/list"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />
      <fragment android:name="com.example.news.ArticleReaderFragment"
              android:id="@+id/viewer"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />
    </LinearLayout>
    • 方法2:通過編程添加
    // 必須使用 FragmentTransaction 中的 API
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    // 使用 add() 方法添加一個片段,指定要添加的片段以及將其插入哪個視圖
    ExampleFragment fragment = new ExampleFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    // 調用 commit() 以使更改生效
    fragmentTransaction.commit();

3. 管理fragment:FragmentManager

FragmentManager的執行操作包括:

  • 通過 findFragmentById()(對於在Activity 佈局中提供 UI 的片段)或 findFragmentByTag()(對於提供或不提供 UI 的片段)獲取 Activity中存在的片段。
  • 通過 popBackStack()(模擬用戶發出的返回命令)將片段從返回棧中彈出。
  • 通過 addOnBackStackChangedListener() 註冊一個偵聽返回棧變化的偵聽器。

3.1. 執行片段事務

  • Activity 中使用片段的一大優點是,可以根據用戶行為通過它們執行添加、移除、替換以及其他操作。也稱為事務
  • 可以將每個事務保存到由 Activity 管理的返回棧內,從而讓用戶能夠回退片段更改(類似於回退 Activity)。
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack 在返回棧中保留先前狀態
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

3.2. 與Activity通信

  • 片段可以通過getActivity() 訪問Activity 實例,並輕鬆地執行在Activity 佈局中查找視圖等任務。
  • Activity 也可以使用findFragmentById()findFragmentByTag(),通過從FragmentManager 獲取對 Fragment 的引用來調用片段中的方法
// fragment - > activity
View listView = getActivity().findViewById(R.id.list);
// activity - > fragment  
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

(1) 創建對Activity的事件回調

  • 在片段內定義一個回調介面,並要求宿主 Activity 實現它。 當 Activity 通過該介面收到回調時,可以根據需要與佈局中的其他片段共用這些信息。
  • 一個新聞應用的 Activity 有兩個片段 — 一個用於顯示文章列表(片段 A),另一個用於顯示文章(片段 B)— 那麼片段 A 必須在列表項被選定後告知 Activity,以便它告知片段 B 顯示該文章。
//fragment定義介面
public static class FragmentA extends ListFragment {
    ...
    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }
    ...

    OnArticleSelectedListener mListener;
    ...
    // 確保宿主 Activity 實現此介面
    // 通過轉換傳遞到 onAttach() 中的 Activity 來實例化 OnArticleSelectedListener 的實例
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    // 列表點擊事件
    OnArticleSelectedListener mListener;
    ...
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Append the clicked item's row ID with the content provider Uri
        Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
        // Send the event and Uri to the host activity
        mListener.onArticleSelected(noteUri);
    }
    ...
}

4. fragment與activity的生命周期關係

  • Activity 的每次生命周期回調都會引發每個片段的類似回調。例如,當 Activity 收到 onPause() 時,Activity 中的每個片段也會收到 onPause()。

5. 在Activity中動態添加fragment

  • 如需執行添加或移除片段等事務,您必須使用 FragmentManager 創建 FragmentTransaction,後者將提供添加、移除、替換片段以及執行其他片段事務所需的 API。
  • 如果您的 Activity 允許移除和替換片段,應在 Activity 的 onCreate() 方法執行期間為 Activity 添加初始片段。
  1. 採用以下方法為之前的佈局添加片段:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

        // Check that the activity is using the layout version with
        // the fragment_container FrameLayout
        if (findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.
            if (savedInstanceState != null) {
                return;
            }

            // Create a new Fragment to be placed in the activity layout
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

由於該片段已在運行時被添加到 FrameLayout 容器,可以從該Activity 中移除該片段,並將其替換為其他片段。

  1. 替換片段:
// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

6. 實例,新聞頁面

https://blog.csdn.net/zhaoyanga14/article/details/52166491


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HBase是建立在Hadoop文件系統之上的分散式面向列的資料庫。它是一個開源項目,是橫向擴展的。 HBase是一個數據模型,類似於谷歌的大表設計,可以提供快速隨機訪問海量結構化數據。它利用了Hadoop的文件系統(HDFS)提供的容錯能力。 它是Hadoop的生態系統,提供對數據的隨機實時讀/寫訪 ...
  • Appache hadoop 版本:2.77 jdk:1.8 系統:centos7 註意不要在root下解壓,要單獨建一個用戶安裝hadoop及其組件。 一、先查看系統是否有自帶j #dk: rpm -qa|grep java 通常是如下4個包: rpm -e --nodeps java-1.8.0 ...
  • oracle提供了for迴圈語句,讓我們可以遍歷select搜索的結果。用法也很簡單,代碼如下: for迴圈語句還可以傳入參數: ...
  • [TOC] 1. RecyclerView 1.1. Add support library 1.2. 將RecyclerView添加到佈局 此文件命名為: 1.3. 主actiivty中如何調用recycleview對象 2. 實例 本節中的所有代碼已上傳到: ...
  • ...
  • 起因: 最近做的APP中有一個新功能:已知用戶微信號,可點擊直接跳轉到當前用戶微信聊天視窗頁面。 當時第一想法是使用無障礙來做,並且覺得應該不難,只是邏輯有點複雜。沒想到最終踩了好多坑,特地把踩過的坑記錄下來。 實現邏輯: 在APP中點擊按鈕→跳轉到微信界面→模擬點擊微信搜索按鈕→在微信搜索頁面輸入 ...
  • [TOC] 1. Intent啟動器 1.1. Intent的用途 1. 啟動Activity :希望返回結果 2. 啟動服務 啟動一個不適用用戶界面而在後臺執行操作的組件 :下載文件等,可攜帶任何必要的數據 : 使用客戶端 伺服器介面,從其他組件綁定到此服務 3. 傳遞廣播 廣播是任何應用均可接收 ...
  • [TOC] 1.載入器特征 用於每個 和 支持非同步載入數據。 監控其數據源併在內容變化時傳遞新結果。 2. Loader API 3. 在應用中使用Loader 主要步驟 1. 或 2. 的實例 3. 一個 ,用於載入由 支持的數據。您也可以實現自己的 或 子類,從其他源中載入數據。 4. 一個 實 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...