碎片的生命周期
1.运行状态:可见,并且能交互
2.暂停状态:可见,不能交互
3.停止状态:不可见,很可能被系统回收。(出现的情况:1.activity进入停止状态。2.在通过调用remove/repalce方法将碎片从活动中移除,但在commit之前调用了addToBackStack)
4.销毁状态:不可见 (出现情况:activity被销毁时,或调用remove/repalce方法将碎片从活动中移除,但在commit之前没有调用addToBackStack。)
使用
方法一:直接写在xml文件中
1.定义fragment的布局名为:left_layout
<?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"> <TextView android:text="leftFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>2.在定义的fragment里面引用布局
3.定义一个activtypublic class LeftFragment extends Fragment { /** * 当碎片和activity建立关联的时候 * @param context */ @Override public void onAttach(Context context) { super.onAttach(context); } /** * 当碎片创建试图时(加载布局的时候调用) * @param inflater * @param container * @param savedInstanceState * @return */ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.left_layout, container, false); return view; } /** * 确保与碎片相关的activity一定已经创建完毕的时候调用 * @param savedInstanceState */ @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } /** * 当碎片关联的试图被移除的时候调用 */ @Override public void onDestroyView() { super.onDestroyView(); } /** * 当碎片和activity解除关联的时候调用 */ @Override public void onDetach() { super.onDetach(); } /** * 防止被系统回收存储一些数据,通过bundle存储下来。可以在onCreateView()或者 * onActivityCreated()或者onCreat的bundle中取到值。 * @param outState */ @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } }
public class FragmentActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); } }4.在activty的xml布局中引用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:id="@+id/activity_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.lvyequeen.test.day01.fragment.FragmentActivity"> <fragment android:name="com.lvyequeen.test.day01.fragment.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>
方法二:动态添加碎片
1.像上面一样简单创建两个fragment 名为:RightFragment 和 AnotherFragment
2.创建一个activty
public class FragmentActivity extends AppCompatActivity implements View.OnClickListener { private Button leftButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); initView(); repalceFragment(new RightFragment()); } private void initView() { leftButton = ((Button) findViewById(R.id.leftButton)); leftButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.leftButton: repalceFragment(new AnotherFragment()); getFragment(); break; } } /** * 替换fragment * * @param fragment */ private void repalceFragment(Fragment fragment) { // 获取FragmentManager FragmentManager manager = getSupportFragmentManager(); manager.findFragmentById(R.id.right_Layout); // 开启一个事物 FragmentTransaction transaction = manager.beginTransaction(); // 向容器内添加或替换碎片,一般用replace 参数1:传入容器的id,参数2:待添加的fragment实例 transaction.replace(R.id.right_Layout, fragment); // 在碎片中模拟返回栈,点击回退键回到上一个fragment transaction.addToBackStack(null); // 提交事物 transaction.commit(); } /** * 获取fragment的实例 */ private void getFragment() { // 获取FragmentManager FragmentManager manager = getSupportFragmentManager(); // 获取fragment的实例 RightFragment rightFragment = (RightFragment) manager.findFragmentById(R.id.right_Layout); rightFragment.testContectWithActivity(); } }3.布局文件
<?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:id="@+id/activity_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.lvyequeen.test.day01.fragment.FragmentActivity"> <fragment android:name="com.lvyequeen.test.day01.fragment.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>
三 动态加载布局的技巧(区分平板和手机)
1.使用限定符
在res文件夹下创建一个layout-large文件夹写一个和activity引用原先layout文件一样名称的xml布局。屏幕被认为是large的设备就会加载layout-large文件夹里面的文件。
2.使用最小宽度限定符
在res文件夹下创建一个layout-sw600dp文件夹。和上面一样。当程序运行在屏幕宽度大于600dp的设备上时加载layout-sw600dp里的布局,小于时,加载默认layout里面的布局。
使用注意事项