1,Fragment是什么?
一个小型的Activity,Fragment需要依托Activity存在
2,如何生成?
2.1 静态生成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 动态添加Fragment
步骤:
(1)创建fragment
(2)获取FragmentManager
(3)获取事务transaction
(4)通过transaction进行fragment替换
(5)提交事务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);
这里面会涉及到一个回退栈的部分:这些fragment会动态添加到栈里面,当不断点击back键时,会不断去显示栈中存储的fragment,直到activity退出。这其中会有重复的fragment UI出现,为了解决这个问题,可以自实现一个fragment的回退栈,回退过程中不同的fragment只出现一次。参加文末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,调试时候遇到的问题:
自定义了一个FragmentA,里面定义了setCallback API, Activity在调用时候:使用了Fragment fragmentA = new FragmentA()形式,然后去调用fragmentA.setCallback , 总是提示找不到接口,汗!
解决方法1: FragmentA fragmentA;
解决方法2:((FragmentA)fragmentA).setFragmentCallback(new IFragmentCallback()); 强转一下
6,【sample】实现fragment回退栈(自定义)
网友评论