美文网首页
Android Fragment

Android Fragment

作者: 潜心之力 | 来源:发表于2018-05-11 16:30 被阅读0次

一、简介

碎片是一种可以嵌入Activity中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,它和活动的使用相近,同样能包含布局,同样有自己的生命周期

二、创建碎片

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MyFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main,container,false);
        return view;
    }
}

三、添加碎片

静态添加(activity的布局里)

    <fragment
        android:id="@+id/fragment"
        android:name="com.MyFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

动态添加(代码实现)

    <!--用于被fragment取代-->
    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

事务只允许提交一次,因此每次执行事务前都需要创建新的事务(beginTransaction)

        // 因为使用support.v4包下的Fragment,所以getSupportFragmentManager
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.frame_layout,new MyFragment());
        //在碎片中模拟返回栈
        transaction.addToBackStack(null);
        transaction.commit();

四、碎片和活动之间的通信

在活动中操纵碎片(fragment在activity的布局文件里面静态添加)

MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);

在碎片中操纵活动(碎片依赖活动的声明周期)

MainActivity activity = (MainActivity) getActivity(); -> 获取碎片所依赖的活动

在碎片中操纵碎片

MyFragment fragment = getChildFragmentManager().findFragmentById(R.id.fragment);

五、懒加载

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class BaseFragment extends Fragment {

    private View mView;
    protected boolean visible = false; // 当前碎片是否可见
    protected boolean first = true; // 当前碎片是否第一次加载

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mView == null) {
            mView = inflater.inflate(getLayoutResourceId(), container, false);
        }
        if (first && visible) {
            initView(mView);
            initData();
            initCallback();
            first = false;
        }
        return mView;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) { -> 在所有生命周期前执行
        visible = isVisibleToUser;
        if (mView != null && isVisibleToUser && first) {
            initView(mView);
            initData();
            initCallback();
            first = false;
        }
    }

    protected abstract void initCallback();

    protected abstract void initView(View view);

    protected abstract void initData();

    protected abstract int getLayoutResourceId();
}

相关文章

网友评论

      本文标题:Android Fragment

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