本文是我學(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>
動(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
- 通過
FragmentManager
的beginTransaction
開啟一個(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
主要是通過FragmentManager
的fingFragmentById
方法,通過傳入具體的id獲取fragmentFragment 與 Activity
主要是通過Fragment的getActivity
方法來獲取Activity的Context實(shí)例Fragment 與 Fragment 之間
就是對(duì)以上兩種方式的融合慨仿,先 F1 通過getActivity
獲取到Activity久脯,然后Activity在通過FragmentManager
的fingFragmentById
方法獲取其他的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)行
常見限定符
最小寬度限定符
由于很難界定
large
到底是多大,或者沒有辦法界定一個(gè)準(zhǔn)確的尺寸唤衫,故最小寬度限定符
能更好的解決這樣問題
- 概念:
最小寬度限定符
允許對(duì)屏幕寬度指定一個(gè)最小值(以dp為單位)婆赠,并以此值為臨界點(diǎn),大于或者小于此值都會(huì)加載不同的布局