Fragment

来源:http://www.cnblogs.com/wangfengdange/archive/2016/01/15/5133920.html
-Advertisement-
Play Games

如圖是效果圖 我在下麵定義3個按鈕來實現3個fragment的切換(不過寫完後發現應該定義成RadioGroup的顏色好改變)通過這3個fragment來看看fragment的生命周期和切換時Fragment都會重新實例化 1 先看下第一種方法用的是FragmentTransaction andr....


如圖是效果圖  我在下麵定義3個按鈕來實現3個fragment的切換(不過寫完後發現應該定義成RadioGroup的顏色好改變)通過這3個fragment來看看fragment的生命周期和切換時Fragment都會重新實例化

                                                                           

1   先看下第一種方法用的是

FragmentTransaction android.support.v4.app.FragmentTransaction.replace(int containerViewId, Fragment fragment)

 

 

package com.demo.text;

import com.demo.pullrefresh.R;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainFragment extends FragmentActivity implements OnClickListener {
    private Button btn_one, btn_two, btn_three;
    private Fragment01 fragment01;

    // private int currentIndex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Log.d("jiejie", "MainFragment————————————————onCreate");

        setContentView(R.layout.mainfragment);
        btn_one = (Button) findViewById(R.id.bb_one);
        btn_two = (Button) findViewById(R.id.bb_two);
        btn_three = (Button) findViewById(R.id.bb_three);

        btn_one.setOnClickListener(this);
        btn_two.setOnClickListener(this);
        btn_three.setOnClickListener(this);
        btn_one.setSelected(true);
        
        fragment01 = new Fragment01();
        // 獲取fragment管理器
        FragmentManager fmm = getSupportFragmentManager();
        // 打開事務
        FragmentTransaction ftm = fmm.beginTransaction();
        // 把內容顯示至幀佈局
        ftm.replace(R.id.fl_layout, fragment01);
        // 提交
        ftm.commit();

    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch (arg0.getId()) {
        case R.id.bb_one:
            btn_one.setSelected(true);
            btn_two.setSelected(false);
            btn_three.setSelected(false);
            // 創建fragment對象
            // fragment01 = new Fragment01();
            // 獲取fragment管理器
            FragmentManager fm = getSupportFragmentManager();
            // 打開事務
            FragmentTransaction ft = fm.beginTransaction();
            // 把內容顯示至幀佈局
            ft.replace(R.id.fl_layout, fragment01);
            // 提交
            ft.commit();

            break;
        case R.id.bb_two:
            btn_one.setSelected(false);
            btn_two.setSelected(true);
            btn_three.setSelected(false);
            // 創建fragment對象
            Fragment02 fragment012 = new Fragment02();
            // 獲取fragment管理器
            FragmentManager fm2 = getSupportFragmentManager();
            // 打開事務
            FragmentTransaction ft2 = fm2.beginTransaction();
            // 把內容顯示至幀佈局
            ft2.replace(R.id.fl_layout, fragment012);
            // 提交
            ft2.commit();

            break;
        case R.id.bb_three:
            btn_one.setSelected(false);
            btn_two.setSelected(false);
            btn_three.setSelected(true);
            // 創建fragment對象
            Fragment03 fragment03 = new Fragment03();
            // 獲取fragment管理器
            FragmentManager fm3 = getSupportFragmentManager();
            // 打開事務
            FragmentTransaction ft3 = fm3.beginTransaction();
            // 把內容顯示至幀佈局
            ft3.replace(R.id.fl_layout, fragment03);
            // 提交
            ft3.commit();

            break;

        default:
            break;
        }
    }

    /**
     * 這個方法在活動由不可見變成可見的時候調用
     */
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Log.d("jiejie", "MainFragment————————————————onStart");
    }

    /**
     * 這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位於返回棧的棧頂,並且處於運行的狀態
     */
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        Log.d("jiejie", "MainFragment————————————————onResume");
    }

    /**
     * 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中
     * 將一些消耗CPU的資源釋放掉,以及保存一些關鍵的數據,但這個方法的執行速度一定要快, 不然會影響到新的棧頂活動的使用。
     */
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        Log.d("jiejie", "MainFragment————————————————onPause");
    }

    /**
     * 這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在於,
     * 如果啟動的新活動是一個對話框的活動,那麼onPause()方法會得到執行,而onStop() 方法並不會執行
     */
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Log.d("jiejie", "MainFragment————————————————onStop");
    }

    /**
     * 這個方法在活動被銷毀之前調用,之後活動的狀態將變成銷毀狀態
     */
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.d("jiejie", "MainFragment————————————————onDestroy");
    }

    /**
     * 這個方法在活動由停止變為運行狀態之前調用,也是活動被重新啟動了。
     */
    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();
        Log.d("jiejie", "MainFragment————————————————onRestart");
    }
}

 

  1 package com.demo.text;
  2 
  3 import com.demo.pullrefresh.R;
  4 
  5 import android.app.Activity;
  6 import android.content.Intent;
  7 import android.os.Bundle;
  8 import android.support.v4.app.Fragment;
  9 import android.util.Log;
 10 import android.view.LayoutInflater;
 11 import android.view.View;
 12 import android.view.ViewGroup;
 13 import android.widget.Button;
 14 import android.widget.Toast;
 15 
 16 public class Fragment01 extends Fragment {
 17     private Button bb_text;
 18 
 19     @Override
 20     public View onCreateView(LayoutInflater inflater, ViewGroup container,
 21             Bundle savedInstanceState) {
 22         // TODO Auto-generated method stub
 23         // return super.onCreateView(R.layout.fragment1, container, false);
 24         Log.d("jiejie", "Fragment01————onCreateView————被調用");
 25         return inflater.inflate(R.layout.fragment1, container, false);
 26         // 第一個是resource ID,指明瞭當前的Fragment對應的資源文件;
 27         // 第二個參數是父容器控制項;
 28         // 第三個布爾值參數表明是否連接該佈局和其父容器控制項,在這裡的情況設置為false,
 29         //因為系統已經插入了這個佈局到父控制項,設置為true將會產生多餘的一個ViewGroup。
 30     }
 31 
 32     // //表示activity執行onCreate方法完成了的時候會調用此方法
 33     @Override
 34     public void onActivityCreated(Bundle savedInstanceState) {
 35         // TODO Auto-generated method stub
 36         super.onActivityCreated(savedInstanceState);
 37         System.out.println("1");
 38         Log.d("jiejie", "Fragment01————onActivityCreated————被調用");
 39         bb_text = (Button) getActivity().findViewById(R.id.bb_text);
 40         bb_text.setOnClickListener(new View.OnClickListener() {
 41 
 42             @Override
 43             public void onClick(View arg0) {
 44                 // TODO Auto-generated method stub
 45                 // startActivity(new Intent(getActivity(), OtherClass.class));
 46                 Toast.makeText(getActivity(), "------", Toast.LENGTH_SHORT)
 47                         .show();
 48             }
 49         });
 50     }
 51 
 52     // 當碎片和活動建立關聯的時候調用
 53     @Override
 54     public void onAttach(Activity activity) {
 55         // TODO Auto-generated method stub
 56         super.onAttach(activity);
 57         Log.d("jiejie", "Fragment01————onAttach————被調用");
 58     }
 59 
 60     // 為碎片創建視圖(載入佈局時調用)
 61     @Override
 62     public void onCreate(Bundle savedInstanceState) {
 63         // TODO Auto-generated method stub
 64         super.onCreate(savedInstanceState);
 65         Log.d("jiejie", "Fragment01————onCreate————被調用");
 66     }
 67 
 68     @Override
 69     public void onStart() {
 70         // TODO Auto-generated method stub
 71         super.onStart();
 72         Log.d("jiejie", "Fragment01————onStart————被調用");
 73     }
 74 
 75     @Override
 76     public void onResume() {
 77         // TODO Auto-generated method stub
 78         super.onResume();
 79         Log.d("jiejie", "Fragment01————onResume————被調用");
 80     }
 81 
 82     @Override
 83     public void onPause() {
 84         // TODO Auto-generated method stub
 85         super.onPause();
 86         Log.d("jiejie", "Fragment01————onPause————被調用");
 87     }
 88 
 89     @Override
 90     public void onStop() {
 91         // TODO Auto-generated method stub
 92         super.onStop();
 93         Log.d("jiejie", "Fragment01————onStop————被調用");
 94     }
 95 
 96     @Override
 97     public void onDestroyView() {
 98         // TODO Auto-generated method stub
 99         super.onDestroyView();
100         Log.d("jiejie", "Fragment01————onDestroyView————被調用");
101     }
102 
103     @Override
104     public void onDestroy() {
105         // TODO Auto-generated method stub
106         super.onDestroy();
107         Log.d("jiejie", "Fragment01————onDestroy————被調用");
108     }
109 
110     // 當碎片和活動解除了關聯的時候調用
111     @Override
112     public void onDetach() {
113         // TODO Auto-generated method stub
114         super.onDetach();
115         Log.d("jiejie", "Fragment01————onDetach————被調用");
116     }
117 }

 

列印的日誌如下

剛進來時    

當點擊其他的時候也就是切換fragment時

         

再此返回這個fragment時然後銷毀

      

不過這個方法每次點擊切換按鈕的時候fragment都會重新實例話這樣話會對伺服器的請求過多

2    一般都用第二種方法來實現fragment

FragmentTransaction android.support.v4.app.FragmentTransaction.add(int containerViewId, Fragment fragment)

這種方法是從一開始就載入了3個fragment下麵的3個按鈕只是確定顯示哪個和隱藏哪個而已,每次點擊不會出現再次實例話

package com.demo.text;

import com.demo.pullrefresh.R;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class OtherClass extends FragmentActivity implements OnClickListener {
    private Button btn_one, btn_two, btn_three;
    private Fragment01 fragment01;
    private Fragment02 fragment02;
    private Fragment03 fragment03;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainfragment);

        btn_one = (Button) findViewById(R.id.bb_one);
        btn_two = (Button) findViewById(R.id.bb_two);
        btn_three = (Button) findViewById(R.id.bb_three);

        btn_one.setOnClickListener(this);
        btn_two.setOnClickListener(this);
        btn_three.setOnClickListener(this);
        btn_one.setSelected(true);

        fragment01 = new Fragment01();
        fragment02 = new Fragment02();
        fragment03 = new Fragment03();

        // 獲取fragment管理器
        FragmentManager fm = getSupportFragmentManager();
        // 打開事務
        FragmentTransaction ft = fm.beginTransaction();
        // 把內容顯示至幀佈局
        // ft.replace(R.id.fl_timeshopfragment, timeLimitShop);
        ft.add(R.id.fl_layout, fragment01);
        ft.add(R.id.fl_layout, fragment02);
        ft.add(R.id.fl_layout, fragment03);
        ft.show(fragment01).hide(fragment02).hide(fragment03);
        // 提交
        ft.commit();
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch (arg0.getId()) {
        case R.id.bb_one:
            btn_one.setSelected(true);
            btn_two.setSelected(false);
            btn_three.setSelected(false);
            
            getSupportFragmentManager().beginTransaction().show(fragment01)
                    .hide(fragment02).hide(fragment03).commit();
            break;
        case R.id.bb_two:
            btn_one.setSelected(false);
            btn_two.setSelected(true);
            btn_three.setSelected(false);
            
            getSupportFragmentManager().beginTransaction().show(fragment02)
                    .hide(fragment01).hide(fragment03).commit();
            break;
        case R.id.bb_three:
            btn_one.setSelected(false);
            btn_two.setSelected(false);
            btn_three.setSelected(true);
            
            getSupportFragmentManager().beginTransaction().show(fragment03)
                    .hide(fragment01).hide(fragment02).commit();
            break;

        default:
            break;
        }
    }

    /**
     * 這個方法在活動由不可見變成可見的時候調用
     */
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
    }

    /**
     * 這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位於返回棧的棧頂,並且處於運行的狀態
     */
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    }

    /**
     * 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中
     * 將一些消耗CPU的資源釋放掉,以及保存一些關鍵的數據,但這個方法的執行速度一定要快, 不然會影響到新的棧頂活動的使用。
     */
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
    }

    /**
     * 這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在於,
     * 如果啟動的新活動是一個對話框的活動,那麼onPause()方法會得到執行,而onStop() 方法並不會執行
     */
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }

    /**
     * 這個方法在活動被銷毀之前調用,之後活動的狀態將變成銷毀狀態
     */
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    /**
     * 這個方法在活動由停止變為運行狀態之前調用,也是活動被重新啟動了。
     */
    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();
    }

}
1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 
4     <item android:state_selected="true" android:color="#f00"></item>
5     <item android:color="#000"/>
6 
7 </selector>
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 微信介面:用戶通過oauth2.0的授權登錄第三方網站的方式,獲取微信用戶的一些基本信息,如:昵稱、所在地、性別……
  • 安裝jdk,把jdk安裝路徑複製,例如我複製的路徑: C:\Program Files\Java\jdk1.8.0_66\bin;進入後在系統變數中找到Path。點擊編輯進入,之後把你第一步複製的路徑粘貼進去,如果前面有別的路徑你就必須在前面的路徑後尾加上(;)分號。此處的括弧不用加,而且必須是英文...
  • 學習來源:《快速集成App中頂部標題滾動條》效果:根據這個網易新聞的界面,需求分析: 需要的對象: 1、導航控制器預設會生成的導航條,上面可以設置title(當然也可以另外自定義View設置導航條title) 2、切換頁面的標題滾動區是一個ScrollView,在這個ScrollView...
  • 已經開始自學iOS開發將近一個月了。買了本書iOS開發的書,但是書上的版本和系統的版本不同,關註了ourcoder網站的tiny的推薦自學iOS步驟。使用蘋果官方文檔開始學習iOS。本人的開發環境如下:Mac10.11 xcode6.2.3 昨晚跟著文檔學習創建todolist碰到了一個問題,如圖....
  • UIView不接收觸摸事件的三種情況:1、不接收用戶交互userInteractionEnabled = NO2、隱藏hidden = YES3、透明alpha = 0.0 ~ 0.014. 如果子視圖的位置超出了父視圖的有效範圍, 那麼子視圖也是無法與用戶交互的, 即使設置了父視圖的 clipsT...
  • 1、git 上有常見的pull request 功能 2、pull request 的含義 解釋一: 有一個倉庫,叫Repo A。你如果要往裡貢獻代碼,首先要Fork這個Repo,於是在你的Github賬號下有了一個Repo A2。 然後你在這個A2下工作,Commit,push等。然後你希望原始倉...
  • 對於GCD中的同步任務、非同步任務的區別,之前有前輩們有這麼認為的:同步任務:不會開闢線程;非同步任務:會開闢新的線程,開闢線程的個數,視資源需求。後來部分人更新了微博簡書稱:同步任務、非同步任務的區別在於前者會阻塞主線程,活著不回阻塞主線程。一開始我也這麼認為,但是後來我寫Demo的時候我就糊塗,不知道...
  • 1、進入這個網站,註冊並且登錄 https://dt.testbird.com/login/2、選擇 雲手機 3、選擇需要租用的手機 4、點擊 遠程調試 5、在本地電腦的dos 命令視窗,輸入兩條 adb 命令提示符,沒有出錯的話,會提醒鏈接成功。6、在Android studio 裡面就可以運.....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...