一、简介
碎片是一种可以嵌入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();
}