安卓基礎(chǔ)--fragment

本文是我學(xué)習(xí)安卓的筆記的一部分休弃,查看詳細(xì)完整筆記請(qǐng)參閱

簡介

fragment中文譯為碎片,可以嵌入活動(dòng)中够庙,讓程序充分合理的利用空間你虹,在平板中廣泛應(yīng)用抛杨。

基本使用

創(chuàng)建兩個(gè)布局備用

  • A布局中添加一個(gè)Button并添加標(biāo)題
  • B布局中添加一個(gè)TextView,布局設(shè)置背景色和標(biāo)題

創(chuàng)建兩個(gè)類暗赶,繼承自Fragment

繼承Fragment類IDE中包含兩種峦萎,建議選擇support-v4

  • 對(duì)于Activity中是通過重寫onCreate方法添加布局合適監(jiān)聽之類屡久,在Fragment中是重寫onCreateView方法
  • onCreateView中通過inflater方法來通過布局加載視圖,其中主要參數(shù)為視圖的layout
  • 為兩個(gè)布局分別綁定兩個(gè)Fragment類

修改主布局

  • 通過<fragment/>標(biāo)簽來在布局中添加fragment
  • 特別支出 name屬性來表明fragment綁定的類的路徑爱榔,路徑要包含包名

具體代碼

left_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="BUTTON"/>

</LinearLayout>

LeftFragment 類

public class LefFrament extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.left_fragment,container,false);
    }
}

right_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00ff00">
    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="12sp"
        android:text="This is right frament"
        />

</LinearLayout>

RightFragment 類

public class RightFrament extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return  inflater.inflate(R.layout.right_fragment,container,false);
    }
}

activity_main.xml

<?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:id="@+id/left_fragment"
        android:name="com.example.qinxinghua.fragmentprac.LefFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.qinxinghua.fragmentprac.RightFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />
    
</LinearLayout>
運(yùn)行結(jié)果

動(dòng)態(tài)改變fragment

我們?cè)谏厦娴拇a的基礎(chǔ)上進(jìn)行修改被环,因?yàn)樾枰獎(jiǎng)討B(tài)的改變,所以我們?cè)趧?chuàng)建一個(gè)fragment详幽,布局為一個(gè)TextView筛欢,用背景色加以區(qū)別

再創(chuàng)建一個(gè)fragment

  • 創(chuàng)建一個(gè)anther_right_fragment.xml布局,布局和right_fragment.xml保持一致,只是將背景色變?yōu)辄S色
  • 綁定一個(gè)AnotherRightFragment的類唇聘,不再贅述

修改主布局

思路:將先前的右邊的fragment改為<FrameLayout>的布局版姑,屬性與先前的右布保持一致,我個(gè)人認(rèn)為是通過布局提供一種占位迟郎,后續(xù)中將需要的組件進(jìn)行添加

修改主活動(dòng)

  • 通過implements View.OnClickListener的方式進(jìn)行監(jiān)聽剥险,PS:
    個(gè)人認(rèn)為這種添加監(jiān)聽的好處是可以將監(jiān)聽方法放在一處,然后根據(jù)id等進(jìn)行組件區(qū)分

  • 給左邊的fragment的button添加監(jiān)聽方法

  • 核心步驟:設(shè)置交換方法分為以下步:

    • 參數(shù)類型為Fragment類型
    • 通過getSupportFragmentManager方法獲取FragmentManager
    • 通過FragmentManagerbeginTransaction開啟一個(gè)事務(wù)
    • 通過事務(wù)的replace對(duì)容器內(nèi)的組件進(jìn)行改變
      • 第一參數(shù)為容器id
      • 第二參數(shù)為組件實(shí)例宪肖,本例中為Fragment實(shí)例
    • 不要忘記提交事務(wù)表制,通過commint方法

具體代碼

another布局和類不在贅述

主布局代碼

<?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:id="@+id/left_fragment"
        android:name="com.example.qinxinghua.fragmentprac.LefFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <FrameLayout
        android:id="@+id/right_fragment"
        android:name="com.example.qinxinghua.fragmentprac.RightFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">
    </FrameLayout>
</LinearLayout>

主活動(dòng)代碼

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
        replaceFragment(new RightFrament());
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button:
                replaceFragment(new AntherRightFragment());
                break;
            default:
                break;
        }
    }

    /**
     * 核心方法
     */
    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.right_fragment,fragment);
        fragmentTransaction.commit();

    }
}
效果圖

Fragment 模擬返回棧

思路:將上例中的布局容器當(dāng)做一種棧結(jié)構(gòu),進(jìn)后進(jìn)先出控乾,在界面back返回過程中在將組件出棧么介。

實(shí)現(xiàn):只需調(diào)用事務(wù)的addToBackStack的方法,參數(shù)為一個(gè)字符串的名字蜕衡,用于描述棧的狀態(tài)壤短,在不需要描述的時(shí)候可以傳入null

   /**
     * 核心方法
     */
    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.right_fragment,fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

    }
效果圖

Fragment 通信

  • Activity 與 Fragment
    主要是通過FragmentManagerfingFragmentById方法,通過傳入具體的id獲取fragment

  • Fragment 與 Activity
    主要是通過Fragment的getActivity方法來獲取Activity的Context實(shí)例

  • Fragment 與 Fragment 之間
    就是對(duì)以上兩種方式的融合慨仿,先 F1 通過getActivity獲取到Activity久脯,然后Activity在通過FragmentManagerfingFragmentById方法獲取其他的Fragment

使用限定符

場景:靈活的決定在不同屏幕尺寸或者不同的分辨率下使用不同的布局

修改代碼

  • 將項(xiàng)目復(fù)制一份備用

  • 修改activity_main.xml的代碼,僅保留left_fragment,并且讓其占滿整個(gè)屏幕

  • 新建layout-large文件夾镰吆,
    注:在AS中左邊的項(xiàng)目結(jié)構(gòu)如果選擇為Android樣式帘撰,那么layout-large文件夾是不顯示的,應(yīng)切換到到Project樣式鼎姊,當(dāng)時(shí)layout-large文件夾有資源文件的時(shí)候骡和,Android樣式下就能顯示文件了

  • layout-large文件夾下新建一個(gè)名字也是activity_main.xml的布局,在布局中引入兩個(gè)Fragment相寇,代碼和前例中一樣

  • 修改主活動(dòng)中的代碼慰于,屏蔽掉replaceFragment的方法實(shí)現(xiàn)

在手機(jī)和平板不同的設(shè)備中分別運(yùn)行

手機(jī)效果圖
平板效果圖

常見限定符

根據(jù)尺寸區(qū)別
根據(jù)分辨率區(qū)別

最小寬度限定符

由于很難界定large到底是多大,或者沒有辦法界定一個(gè)準(zhǔn)確的尺寸唤衫,故最小寬度限定符能更好的解決這樣問題

  • 概念: 最小寬度限定符允許對(duì)屏幕寬度指定一個(gè)最小值(以dp為單位)婆赠,并以此值為臨界點(diǎn),大于或者小于此值都會(huì)加載不同的布局
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市休里,隨后出現(xiàn)的幾起案子蛆挫,更是在濱河造成了極大的恐慌,老刑警劉巖妙黍,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悴侵,死亡現(xiàn)場離奇詭異,居然都是意外死亡拭嫁,警方通過查閱死者的電腦和手機(jī)可免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來做粤,“玉大人浇借,你說我怎么就攤上這事∨缕罚” “怎么了妇垢?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肉康。 經(jīng)常有香客問我闯估,道長,這世上最難降的妖魔是什么迎罗? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任睬愤,我火速辦了婚禮片仿,結(jié)果婚禮上纹安,老公的妹妹穿的比我還像新娘。我一直安慰自己砂豌,他們只是感情好厢岂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阳距,像睡著了一般塔粒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筐摘,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天卒茬,我揣著相機(jī)與錄音,去河邊找鬼咖熟。 笑死圃酵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馍管。 我是一名探鬼主播郭赐,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼确沸!你這毒婦竟也來了捌锭?” 一聲冷哼從身側(cè)響起俘陷,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎观谦,沒想到半個(gè)月后拉盾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豁状,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年盾剩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片替蔬。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡告私,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出承桥,到底是詐尸還是另有隱情驻粟,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布凶异,位于F島的核電站蜀撑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剩彬。R本人自食惡果不足惜酷麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喉恋。 院中可真熱鬧沃饶,春花似錦、人聲如沸轻黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氓鄙。三九已至馆揉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抖拦,已是汗流浹背升酣。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留态罪,地道東北人噩茄。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像向臀,于是被迫代替她去往敵國和親巢墅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容