Fragment是什么?
Fragment是可嵌入在Activity中的UI片段,使得程序可以更充分的利用大屏幕的空间,通常用在平板电视等应用中。
Fragment使用
创建left_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/replace"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="replace" />
</LinearLayout>
创建right_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Right Fragment" />
</LinearLayout>
创建another_right_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff00"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Another Right Fragment" />
</LinearLayout>
创建类LeftFragment重写onCreateView()方法加载left_fragment.xml:
public class LeftFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment, container, false);
return view;
}
}
创建RightFragment重写onCreateView()方法加载right_fragment.xml:
public class RightFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right_fragment, container, false);
return view;
}
}
创建RightFragment重写onCreateView()方法加载another_right_fragment.xml:
public class AnotherRightFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.another_right_fragment, container, false);
return view;
}
}
上述代码,创建了3个xml布局和对应的Fragment加载类,接下来修改activity_main.xml,将屏幕平分并添加FrameLayout用于之后的Fragment替换:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/left_fragment"
android:name="com.demo.demo0.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/right_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
修改MainActivity,先添加RightFragment,通过点击事件替换成AnotherRightFragment,其中addToBackStack()方法意为当通过按钮替换后可通过Back键返回上一个Fragment:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.replace);
replaceFragment(new RightFragment());
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(new AnotherRightFragment());
}
});
}
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();
}
}
主要步骤是:
- 创建待添加的Fragment实例
- 通过getSupportFragmentManager()方法获取FragmentManager
- 通过FragmentManager的beginTransaction()方法开启事务
- 调用replace()方法传入FrameLayout的id和步骤1中创建的Fragment实例
- 调用commit()方法提交事务
Fragment和Acitivity通信
在Activity中可通过FragmentManager的findFragmentById获取Fragment实例:
Fragment leftFragment = fragmentManager.findFragmentById(R.id.left_fragment);
在Fragment中通过 getActivity()获取Activity实例:
MainActivity activity = (MainActivity) getActivity();
Fragment生命周期
- 运行状态:当Fragment可见且其关联的Activity处于运行状态,该Fragment也处于运行状态
- 暂停状态:当关联的Activity进入暂停状态,其Fragment也处于暂停状态
- 停止状态:当关联的Activity进入停止状态,其Fragment也处于停止状态,或当移除和替换Fragment前调用了addToBackStack()。
- 销毁状态:当关联的Activity被销毁,其Fragment也处于销毁状态。或当移除和替换Fragment前未调用addToBackStack()。
相比于Activity,Fragment多了几个生命周期回调方法:
- onAttach():当Activity和Fragment建立关联时调用
- onCreateView():Fragment加载布局时调用
- onActivityCreate():当Fragment关联的Activity创建完毕时调用
- onDestoryView():当Fragment关联的View被移除时调用
- onDetach():当Activity和Fragment解除关联时调用