1,F(xiàn)ragment是什么?
一個(gè)小型的Activity急前,F(xiàn)ragment需要依托Activity存在
2,如何生成瀑构?
2.1 靜態(tài)生成Fragment
在布局文件里直接定義:
<fragment
android:name="com.mike.androidtips.framenttest.FragmentA"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_static"
/>
需要注意:一定要指定fragment的id裆针,不管代碼需不需要引用
2.2 動(dòng)態(tài)添加Fragment
步驟:
(1)創(chuàng)建fragment
(2)獲取FragmentManager
(3)獲取事務(wù)transaction
(4)通過transaction進(jìn)行fragment替換
(5)提交事務(wù)transaction
FragmentManager fragmentManager = getSupportFragmentManager();
transaction = fragmentManager.beginTransaction();
transaction.add(R.id.framelayout, fragmentA)
.add(R.id.framelayout, fragmentB)
.add(R.id.framelayout, fragmentC)
.hide(fragmentB)
.hide(fragmentC)
.commit();
transaction.replace(R.id.framelayout, fragmentB);
transaction.addToBackStack(null);
這里面會(huì)涉及到一個(gè)回退棧的部分:這些fragment會(huì)動(dòng)態(tài)添加到棧里面,當(dāng)不斷點(diǎn)擊back鍵時(shí)寺晌,會(huì)不斷去顯示棧中存儲(chǔ)的fragment世吨,直到activity退出。這其中會(huì)有重復(fù)的fragment UI出現(xiàn)呻征,為了解決這個(gè)問題耘婚,可以自實(shí)現(xiàn)一個(gè)fragment的回退棧,回退過程中不同的fragment只出現(xiàn)一次陆赋。參加文末sample
3沐祷,Activity之間如何通信
3.1 Bundle (Android原生方法)
Activity里面:
Fragment fragmentA = new FragmentA();
Bundle bundle = new Bundle();
bundle.putString("message", "data passed through bundle.");
fragmentA.setArguments(bundle);
FragmentA:
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String msg = getArguments().getString("message");
Log.d(TAG, "message through bundle: " + msg);
}
3.2 Java中類與類之間常用通信方案: Interface
public interface IFragmentCallback {
void sendMessage(String msg);
String getMessage();
}
Activtity里使用:
Fragment fragmentA = new FragmentA();
((FragmentA)fragmentA).setFragmentCallback(new IFragmentCallback() {
@Override
public void sendMessage(String msg) {
Toast.makeText(FragmentTestActivity.this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public String getMessage() {
return "This is msg from mainActivity.";
}
});
FragmentA里:
private IFragmentCallback callback;
public void setFragmentCallback(IFragmentCallback callback) {
this.callback = callback;
}
3.3 EventBus, LiveData
TO DO
4, Fragment的生命周期
4.1 打開界面
onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume
4.2 按下主屏鍵
onPause->onStop
4.3 重新打開界面
onStart->onResume
4.4 按后退鍵
onPause->onStop->onDestroyView->onDestroy->onDetach
5嚷闭,調(diào)試時(shí)候遇到的問題:
自定義了一個(gè)FragmentA,里面定義了setCallback API, Activity在調(diào)用時(shí)候:使用了Fragment fragmentA = new FragmentA()形式赖临,然后去調(diào)用fragmentA.setCallback , 總是提示找不到接口胞锰,汗!
解決方法1: FragmentA fragmentA;
解決方法2:((FragmentA)fragmentA).setFragmentCallback(new IFragmentCallback()); 強(qiáng)轉(zhuǎn)一下
6兢榨,【sample】實(shí)現(xiàn)fragment回退棧(自定義)