android之Fragment

来源:互联网 发布:sql语句别名 编辑:程序博客网 时间:2024/04/27 18:53

作为替代TabHost的Fragment,也同样适用于平板开发。不得不说,Fragment的功能确实比TabHost强大,其在性质上相当于一个小型的Activity,和Activity一样具有相似生命周期。而且也是同生共死的,在大部分情况下。

1.Fragmengt的生命周期,和Activity有很多相似。

具体有onCreat这个方法一般用来初始化一些值,在onDestory只会加载一次,最好不要放一些加载网络的代码。onCreatView这里是加载布局的。onPause。onResume。onStop。onDesotoryView销毁视图。onDetach这个是用来和Activity脱离的方法。onDestory最后的销毁。

当Activity加载Fragmengt时,先加载Activity的onCreat,然后是Fragmengt的onCreat和onCreatView。当Fragmengt暂停时,先执行Fragmengt的onPause,然后是Activity的onPause,当Fragmengt回来时,先执行(看清)Activity的onResume,然后才是Fragmengt的onResume。

2.Fragmengt的简单使用。

底下是一个简单的Fragmengt的实现。左边是Activity自带的View,里面有两个按钮右边是一个空的LinearLayout,用来装载Fragmengt。

<span style="font-size:14px;"><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"              android:orientation="horizontal"              tools:context=".MainActivity">    <LinearLayout        android:id="@+id/left"        android:layout_width="0dp"        android:layout_height="fill_parent"        android:layout_weight="1"        android:orientation="vertical">        <Button            android:id="@+id/btn1"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:text="First"/>        <Button            android:id="@+id/btn2"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:text="Second"/>    </LinearLayout>    <LinearLayout        android:id="@+id/right"        android:layout_width="0dp"        android:layout_height="fill_parent"        android:layout_weight="3"        android:orientation="vertical">    </LinearLayout></LinearLayout></span>
Fragment中的代码很简单,就是在onCreatView中返回了一个实例化后的自己定义的视图。

<span style="font-size:14px;">public class MainActivity extends AppCompatActivity {    FragmentManager fragmentManager;    FragmentTransaction fragmentTransaction;    Button btn1, btn2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //实例化按钮并加载监听器        btn1 = (Button) findViewById(R.id.btn1);        btn2 = (Button) findViewById(R.id.btn2);        btn1.setOnClickListener(new BtnListener());        btn2.setOnClickListener(new BtnListener());        //根据当前Activity获得一个FragmentTransaction对象        fragmentManager = getFragmentManager();    }    //自定义按钮的监听器,使得点击按钮加载Fragment控件    class BtnListener implements View.OnClickListener {        @Override        public void onClick(View v) {            //FragmentTransaction类可以完成对Fragment控件的add,remove,replace等功能            fragmentTransaction = fragmentManager.beginTransaction();            switch (v.getId()) {                case R.id.btn1:                    //实例化FirstFragment                    FirstFragment firstFragment = new FirstFragment();                    //加载firstFragment视图,并加入firstFragment回退栈的标记,不能用add方法                    fragmentTransaction.replace(R.id.right, firstFragment, "firstFragment");                    //加入回退栈,必须放在commit方法之前,这个方法使得Activity有序加载Fragment                    fragmentTransaction.addToBackStack("firstFragment");                    break;                case R.id.btn2:                    SecondFragment secondFragment = new SecondFragment();                    fragmentTransaction.replace(R.id.right, secondFragment, "secondFragment");                    fragmentTransaction.addToBackStack("secondFragment");                    break;            }            //fragmentTransaction必须提交才能显示View,一般放于最后            fragmentTransaction.commit();        }    }}</span>

这样点击左面的按钮,右面就会加载出响应的Fragment。

3.Fragment之间的传值,必须同时在同一个Activity中加载出来的时候才能传值。就像上面的模式是不能传的,会报空指针异常。

        fragmentManager = getFragmentManager();        fragmentTransaction = fragmentManager.beginTransaction();        FirstFragment firstFragment = new FirstFragment();        SecondFragment secondFragment = new SecondFragment();        fragmentTransaction.replace(R.id.left, firstFragment, "firstFragment");        fragmentTransaction.replace(R.id.right, secondFragment, "secondFragment");        fragmentTransaction.commit();
<span style="font-size:18px;">底下这是其中一个Fragment中的</span><span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;">onCreateView方法,两个一样。</span>
//给Fragmengt加载UI布局    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_first, container, false);        Button btn = (Button) view.findViewById(R.id.firstBtn);        //点击按钮获得secondFragment中输入框的值        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //根据TAG实例化一个SecondFragment                SecondFragment secondFragment = (SecondFragment) getFragmentManager().findFragmentByTag("secondFragment");                //实例化secondFragment中的EditText                EditText editText = (EditText) secondFragment.getView().findViewById(R.id.secondEt);                //Toast弹出editText的值                Toast.makeText(getActivity(), editText.getText().toString(), Toast.LENGTH_SHORT).show();            }        });        return view;    }

还有一种传值的方法,相当于Activity的Intent传值机制。只不过需要接受值得Fragment来调用setArguments()。在启动接受数据的Fragmengt时调用getArguments().getString(“key”)。等方法来接受值。必须是先setArguments()再加载Fragment,顺序要记好。

4.Fragment和Activity一样也有很多形式,例如ListFragment等。用法和ListActivity一样。记得适配器的初始化一定要在onCreat里,也就是onCreatView方法之前完成,加载完适配器之后记得adapter.notifyDataChanged()????这个方法的功能是通知所依附的View,本身的数据已经改变,要刷新View。


0 0
原创粉丝点击