第一行代码笔记 (fragment)碎片的使用

来源:互联网 发布:微博淘宝网页链接 编辑:程序博客网 时间:2024/04/26 10:22

碎片的生命周期

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里面引用布局

public 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);    }}
3.定义一个activty

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里面的布局。



使用注意事项

点击打开链接


0 0