美文网首页面试
Fragment知识整理

Fragment知识整理

作者: 奔跑吧小马哥 | 来源:发表于2021-05-30 18:04 被阅读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回退栈(自定义)

    相关文章

      网友评论

        本文标题:Fragment知识整理

        本文链接:https://www.haomeiwen.com/subject/lcrksltx.html