android fragment 介绍和使用

fragment用了很多遍,可总觉得在理解上还有一些欠缺,就想将自己得理解写下来,看看是否能够完善。

首先,android  有了activity组件,为什么还要fragment呢?我们在开发应用的时候,会发现如今机型尺寸样式非常多,单独使用activity没办法完全适配,这就可能导致要维护两份代码,fragment就是用来解决这样的问题,并且如今的底部栏+fragment和tablayout+fragment,一个activity可以展示多个不同的页面,而且加载速度比activity快很多。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全由不同的Fragment组成,Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了,你可以动态的添加、替换和移除某个。

下面就来介绍一下fragment的生命周期,静态fragment 和动态fragment的使用。

fragment 的生命周期

可见fragment比activity多了几个生命周期方法

onAttach  跟activity关联时调用

onCreateView 创建fragment视图时调用

onActivityCreate  activity onCreate返回时调用

onDestroyView fragment 视图销毁时调用

onDetach 跟activity取消关联时调用

静态fragment的使用

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/fg_one"
        android:name="com.uw.fragmenttest.OneFragment"
        android:text="one fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

创建一个fragment,重写onCreateView方法,创建布局

public class OneFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }
}

以上就是fragment的静态用法,启动MainActivity,onefragment布局就会覆盖在上面。

动态fragment的使用

简单用法如下:

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
        .replace(R.id.fg_one,TwoFragment.newInstance("twofragment",""))
        .addToBackStack(null)
        .commit();

首先获取FragmentManager ,然后开启事务管理也就是获取FragmentTransaction,api介绍如下

Fragment常用的三个类:

android.app.Fragment 主要用于定义Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 保证一些列Fragment操作的原子性,

a、获取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager,  fragment 中  getChildFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

add   添加fragment

remove 移除fragment,如果fragment没有添加到回退栈,fragment就被销毁了,添加到回退栈,UI视图还是会被销毁

replace 相当于add 和remove的结合体

hide 隐藏fragment,如果想保存fragment视图,则可以配合add、show使用

show 显示fragment 

addToBackStack  添加到回退栈。若是想保存fragment都需要将其添加到回退栈

commit  提交事务管理,添加fragment后必须调用commit提交才会生效

detach   会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

attach   重建view视图,附加到UI上并显示。

在实际使用中想保存fragment实例,就需要先将它添加到回退栈,并且当实例存在时就不能重复commit,否则会报错,下面介绍一下使用bundle跟activity通信。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.fg_one,OneFragment.newInstance("oneFragment",""))
                .commit();
    }
}
public class OneFragment extends Fragment {
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private String mParam1;
    private String mParam2;
    private TextView textView;

    public static OneFragment newInstance(String param1, String param2) {
        OneFragment fragment = new OneFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        textView = view.findViewById(R.id.tv_content);
        textView.setText(mParam1);
        return view;
    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }
    @Override
    public void onDetach() {
        super.onDetach();
    }
}

上面的这种写法是android studio创建fragment时自带的模板,好处是可以让fragment 跟activity没有耦合。

发布了12 篇原创文章 · 获赞 6 · 访问量 933

猜你喜欢

转载自blog.csdn.net/qq_30867605/article/details/87375503