android Fragment基础

 创建一个Fragment

         如果要创建一个Fragment,必须创建一个Fragment的子类(或者已经存在的子类)。一个Fragment看起来像一个activity。它包括和activity相似的回调方法,例如 onCreate(), onStart(), onPause(), and onStop()。

        实时上,如果你要使用fragment转化一个已经存在的Android应用,你也许只要简单的将activity中回调函数中的代码复制到fragment的回调方法中。

       一般情况下,你应该实现至少以下几种方法:

       onCreate()

                创建fragment的时候系统会调用这个方法。在你的实现中,你可以进行一些初始化工作。

      onCreateView()

                当fragment首次要draw 他自己的用户界面的时候,系统会调用这个方法。这个方法必须返回一个  View,这个veiw也就是fragment的根布局。如果这个fragment不提供UI,你可以返回null。

      onPause()

               当用户离开这个fragment的时候,会首先调用这个方法。

       一般情况下大多数程序都会实现这三个方法,但是还有几个其他的回调方法,他们用来处理fragment生命周期的各个阶段。

      当然,你也可以继承一些Fragment已经存在的子类来代替继承Fragment类:

      DialogFragment

      ListFragment

      PreferenceFragment

  •   添加一个用户界面

        为fragment供一个布局,你必须实现onCreateView()   回调方法,当fragment要显示界面的时候会调用这个方法,然后这个方法必须返回一个View对象。

       如果你的fragment是 ListFragment 的子类,onCreatView()默认情况下会返回一个 ListView 类的对象,所以,你没有必要去实现它。

      例子:

     

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

    这有有一点需要说明的,那就是inflate(int resource, ViewGroup root, boolean attachToRoot)方法的三个参数。

  1. 第一个参数代表的是一个资源的id,也就是代表你即将inflate的资源文件。
  2. 第二个参数是你需要将inflate的视图添加到的Viewgroup,在上面的例子中是把R.layout.example_fragment inflate后代表的视图添加到container中。
  3. 第三个参数表示是否把inflate的视图添加到container中,如果是false,代表不添加到container中,只是返回一个视图和视图的layoutparams,如果是true,代表会添加到container中去。

   

  •   添加一个Fragment到activity中

        一般情况下,一个fragment为一个activity贡献了一部风UI,他会嵌入一个activity中作为其中的一部分。有两种方法江一个fragment添加到一个activity中:

         在activity的layout文件中声明fragment

        在这种情况下,你可以为这个fragment指定布局属性,就像一个普通的view一样。例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

         通过代码方式添加fragment

         在你activity运行的任何时间内,你可以添加fragments到你的activity的布局中,你只需要指定一个 ViewGroup 用来放置fragment。

         为了在activity中进行事务管理(例如 add,remove,or replace 一个fragment),你必须使用FragmentTransaction.你可以从activity中获取一个 FragmentTransaction 的实例,例如:

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

 然后你就可以使用 add() 方法,添加一个fragment到一个activity布局中。

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
  •  添加一个没有UI的fragment

       上面的例子展示了如何江一个fragment的界面添加到activity的布局中。但是,你也可以使用一个后台的fragment,也就是说他没有界面。

       添加一个没有UI的fragment会使用add(Fragment, String) 方法,因为他不是一个界面。所以只能是用tag作为唯一标识。

  • 管理fragments

        在activity中管理fragments,你需要用到FragmentManager. ,在activity中通过getFragmentManager()来获取它。

        通过FragmentManager. 你可以做的事情包括:

  •  获取activity中包含的fragments,通过方法 findFragmentById() 或者 findFragmentByTag() 
  • 使用popBackStack (),使Fragmnet出栈操作,类似用户按回退键。
  • 注册一个back Stack change事件监听,方法为addOnBackStackChangedListener().
  • Fragment事务

       在你的activity中,你可以增加、移除、替换fragment。你提交的没一组变换都叫一个事务(transaction),你需要用到 FragmentTransaction. 你还可以保存每一个事务到一个栈中,这个栈是于activity管理的。你可以从FragmentManager中获取一个 FragmentTransaction 的实例,例如:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

 每个事务就是你想同时进行的一系列的变化,你可以进行所有你想进行的变化,例如 add(), remove(), and replace().完成以后你必须调用commit().来提交事务。证明这个事务完成。    

         在你调用commit()方法前,你可以调用addToBackStack(), 目的是把这个事务添加到一个栈中。这个栈是有activity来管理的,他允许你返回上一个fragmeng的状态,你只要按返回按钮就可以。

  • 和activity进行交互

         虽然Fragment是不依赖activity而独立实现的,并且可以在多个activity中使用,但是,一个Fragment的对象还是和包含他的actvity有绑定关系的。

        特别需要指出的就是,fragment可以通过 getActivity() 来访问activity实例,并很容易执行一些操作,例如查找一个视图在activity的layout中:

      

View listView = getActivity().findViewById(R.id.list);

        同样,你的activity也可以通过FragmentManager  的 findFragmentById() or findFragmentByTag(). 来获取一个Fragment对象,例如:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

         actvity向Fragment传递数据:

         activity像Fragment传递数据的方法通过在Actvity中创建Bundle数据包,并调用Fragment的setArguments方法即可将数据传递给Fragment,例如:

FragmentB fragmentB = new FragmentB();
Bundle bundle = new Bundle();
bundle.putString("fragmentTest", "the data is passed in by activity");
fragmentB.setArguments(bundle);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.ln1,fragmentB, "fragmentB");
transaction.commit();

 在Fragment中,就可以调用getArguments()获取参数。

          Fragment向activity传递参数

          在fragement中定义一个回调接口,再让包含Fragment的activity实现该接口,这样Fragment即可以调用该回调方法将数据传递给activity。

 创建一个Fragment          如果要创建一个Fragment,必须创建一个Fragment的子类(或者已经存在的子类)。一个Fragment看起来像一个activity。它包括和activity相似的回调方法,例如   onCreate() ,  onStart() ,  onPause() , and  onStop()。         实时上,如果你要使用fragment转化一个已经存在的Android应用,你也许只要简单的将activity中回调函数中的代码复制到fragment的回调方法中。        一般情况下,你应该实现至少以下几种方法:        onCreate():                 创建fragment的时候系统会调用这个方法。在你的实现中,你可以进行一些初始化工作。       onCreateView():                 当fragment首次要draw 他自己的用户界面的时候,系统会调用这个方法。这个方法必须返回一个  View,这个veiw也就是fragment的根布局。如果这个fragment不提供UI,你可以返回null。       onPause():                当用户离开这个fragment的时候,会首先调用这个方法。        一般情况下大多数程序都会实现这三个方法,但是还有几个其他的回调方法,他们用来处理fragment生命周期的各个阶段。       当然,你也可以继承一些Fragment已经存在的子类来代替继承Fragment类:       DialogFragment       ListFragment       PreferenceFragment
  •   添加一个用户界面

猜你喜欢

转载自deep-fish.iteye.com/blog/2054609