面试

Fragment知识整理

2021-05-30  本文已影响0人  奔跑吧小马哥

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回退栈(自定义)

上一篇下一篇

猜你喜欢

热点阅读