Fragment

1. Fragment 是什么

      Fragment是一个类, 它实现了一个Activity的一个部分.

        • Fragment表示运行在一个更大的Activity中的具体的操作或者界面.

        • Fragments使得Activity的设计更加模块化, 让应用程序适配不同的屏幕方向和多屏幕尺寸

          更加容易.

        • Fragments必须要嵌入到Activities中, 它们不能独立于Activities而运行.

        • 大部分的Fragments定义它们自己的视图布局, 这些布局存在于它们所依附的Activities的

          视图层次中.

        然而, Fragment也可以实现没有用户界面组件的行为.

        • Fragment有它们自己的生命周期, 并且它的生命周期与它依附的Activity是紧密关联的.

        • Fragment可以是Activity的静态部分, 在Activity创建的工程中自动的实例化.

        • 或者, 可以在运行时在Activity中动态的创建、添加和移除Fragments.

2. Fragments:在Honeycomb(3.0)或以后版本的实现

       Fragments是在Honeycomb, API 11加到Android API中的.
        与Fragment相关的基础类有:
         android.app.Fragment
             所有Fragment定义的基类
         android.app.FragmentManager
             在Activity中与Fragment对象进行交互的类
         android.app.FragmentTransaction
             对Fragment进行一系列原子操作的类

3. Fragments:在Dotnut(1.6)或以后版本的实现

      Google提供了兼容包, 你可以在应用程序中引入这个Java库, 实现对Fragment和其他
        Honeycomb特性的支持
       • 可以在目标版本为1.6(API 4)或以后的应用程序中使用兼容包
        • 对于兼容包中的每一个类, API与它们在最新Android平台上相应的API的表现几乎是一致的. 
           因此你通常可以查看在线文档以了解support API.
          
        与Fragments相关的基础类:
        android.support.v4.app.FragmentActivity
            所有使用基于兼容包中Fragment的特性的Activity的基类
        android.support.v4.app.Fragment
            所有Fragment定义的基类
        android.support.v4.app.FragmentManager
             在Activity中与Fragment对象进行交互的类
        android.support.v4.app.FragmentTransaction
            对Fragment进行一系列原子操作的类

4. 下载兼容包

         

5. 使用兼容包

     

6. Fragment生命周期

    
    和Activity一样, Fragment基类是一个模板方法设计模式的一个例子
     • Fragment基类定义了一套方法, 用于重写以实现自定义的Fragment的特定行为.

     最重要的就是Fragment生命周期中的回调方法.
     • Fragment所在的Activity的生命周期直接影响Fragment的生命周期.
     • Activity生命周期中的每一个回调会触发每一个Fragment中一个相似的回调.
         举个栗子:当Activity回调onPause(), 这个Activity中的每一个Fragment也会接到onPause()的回调

     Fragments有几个额外的生命周期回调用于管理与Activity的交互:
     onAttach(Activity)
         当Fragment与Activity关联后被调用.
     onCreateView(LayoutInflater, ViewGroup, Bundle)
          调用时, 会创建与该Fragment相关联的视图层次
     onActivityCreated(Bundle)
          当Activity的onCreate()方法返回后被调用
     onDestroyView()
          当与此Fragment相关联的视图层次正在被移除的时候被调用
     onDetach()
          当Fragment与Activity解除关联的时候被调用.

7. 创建Fragment类

    每一个Fragment必须以Fragment的子类来实现.
      Fragment的许多方法与Activity中的都是类似的, 应该以相同的风格使用它们.
      onCreate(Bundle)
          初始化此Fragment使用的除了与用户界面相关的资源.
      onCreateView(LayoutInflater, ViewGroup, Bundle)
           创建并返回与此Fragment相关联的的视图层次.
      onResume()
           分配"昂贵的"资源, 比如注册位置更新, 传感器更新等.
      onPause
           释放"昂贵的"资源, 提交所有在当前会话之外需要持久化的修改.

8. 创建一个Fragment布局

     为了给一个Fragment提供一个布局, 自定义的Fragment必须实现onCreateView回调方法.

       • 当Fragment需要创建它的布局时Android系统会调用这个方法.

       • 这个方法必须返回一个View, 这个View是Fragment的布局的根

       和Activity一样, 可以编程实现直接实例化并配置View对象实现布局或者通过提供一个xml

       布局文件来实现布局.

        声明xml的方式通常更简单和容易

       • 为了辅助声明式的方法, 系统在Activity的布局提供了LayoutInflater和ViewGroup的引用,

         ViewGroup作为自定义Fragment布局的父布局.

9. 创建一个Fragment布局(例子)

    可以定义一个简单的布局资源, 如下
      res/layout/first_fragment.xml
      
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/first_fragment_root">
    <TextView android:layout_height="wrap_content"
        android:text="@string/text_first_fragment_title"
        android:layout_width="match_parent"
        android:gravity="center_horizontal" />
    <EditText android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:id="@+id/edit_first_msg" />
    <Button android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:id="@+id/button_first"
        android:text="@string/button_first_text" />
</LinearLayout>
     然后实例化自定义Fragment的布局
public class FirstFragment extends Fragment implements OnClickListener {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_fragment, container, false);
        Button nextButton = (Button) view.findViewById(R.id.button_first);
        nextButton.setOnClickListener(this);
        return view;
    }
// ...
}

10. 在Activity的布局中"静态地"包含Fragment

    把Fragment嵌入到Activity最简单的方式就是在Activity的布局文件中直接包含它.
      当Fragment在布局中总是需要显示的时候效果还不错.
      然后, 这种实现方式不能在运行时动态地移除Fragment.
  

    在Activity的布局文件中, 在你想要包括Fragment的地方使用<fragment>元素(是的, 确实是小写)   .

      使用android:name属性提供Fragment的全限定的类名

      指定布局属性, 以控制Fragment的大小和位置

    

    例如:

    Activity布局

    

<?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>

11. 动态地把Fragment添加到Activity中

    在Activity运行的任何时候, 都可以把Fragment添加到Activity的布局中.

    1. 第一, 使用Activity.getFragmentManager()获得一个FragmentManager的引用.

        如果使用了兼容包, 那么使用Activity.getSupportFragmentManager()

    2. 调用FragmentManager.beginTransaction()获得一个FragmentTransaction实例.

    3. 实例化一个自定义Fragment的实例.

    4. 使用FragmentTransaction.add()方法把Fragment添加到Activity的一个ViewGroup中,

        使用ID来指定Fragment. 或者, 也可以提供一个字符串标签来确定此Fragment.

    5. 使用FragmentTransaction.commit()提交这个事务.

    例如: 

FragmentManager fragmentManager = getFragmentManager()
// Or: FragmentManager fragmentManager = getSupportFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

但是...有一个问题

12. 处理运行时配置更改

   当系统因为运行时配置更改销毁并重建一个Activity时, Activity会自动重新实例化已经

    存在的Fragment.

      对于在Activity布局文件中声明的静态的Fragment不是问题.

      但是对于动态的Fragment, 应该检测这种情况, 并防止自定义Fragment再次实例化.


    为了检查系统是否重建了Activity, 检查Activity的onCreate()方法中传递的Bundle是否为null.

      如果是non-null, 系统正在重新建立Activity, 这种情况下, Activity会自动重新实例化

       已存在的Fragment.

      如果是null的, 就可以安全地重新实例化动态的Fragment. 例如:   

public void onCreate(Bundle savedInstanceState) {
    // ...
    if (savedInstanceState != null) {
        FragmentManager fragmentManager = getFragmentManager()
        // getSupportFragmentManager();<span style="font-family: Arial, Helvetica, sans-serif;">  </span>
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        ExampleFragment fragment = new ExampleFragment();
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
    }
}

13. 保存Fragment的状态

   Fragment类支持onSaveInstanceState(Bundle)方法(而不是onRestoreInstanceState()) , 在很大程度

    上与Activity类是一样的.

      默认的实现保存所有有Id的Fragment中的视图的状态.

      可以重写这个方法, 以保存Fragment的附加的状态信息.

      如果系统从一个之前保存的状态重新创建Fragment, 系统在onCreate(), onCreateView(), 和

        onActivityCreated()方法中都提供了一个Bundle的引用, 这个Bundle引用包含了之前保存的状态.


14. 跨Activity重建时保持Fragment

   默认情况下, 当Activity重建时(比如响应运行时配置更改), 它的Fragment也会被销毁然后自动重建.

    用true调用Fragment.setRetainInstance(boolean)方法请求系统如果重建Activity, 那么保留

    当前Fragment的实例.

      如果被设置了, 当Activity重建时, Fragment的onDestroy和onCreate方法不会被调用.

      Fragment的所有其他生命周期方法都会以他们典型的顺序被调用.


    保留的Fragments对于传播的状态信息是十分有用的, 尤其是跨Activity实例的线程管理.
      例如, 一个Fragment作为一个Thread或者AsyncTask的管理者, 管理它的操作.
      原本用于此目的的方法Activity.onRetainNonConfigurationInstance(), 因为Fragment的方法
        setRetainInstance()的能力, 而在API 11的时候被标记为过时了.

15. 使用不带布局的Fragment

    Fragment不一定必须有用户界面.

    • 例如:如果Fragment的唯一目的就是为了维护状态信息或者管理一个线程, 它就不需要用户界面.

      当使用不带用户界面的Fragment时:

     没有必要覆盖onCreateView()方法

     必须通过FragmentTransaction.add(Fragment, String)把Fragment添加到Activity上, 

      提供一个唯一的String标签用于标识这个Fragment.

     例如:

FragmentManager fragmentManager = getFragmentManager()
// Or: FragmentManager fragmentManager = getSupportFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
BackgroundFragment fragment = new BackgroundFragment();
fragmentTransaction.add(fragment, "thread_manager");
fragmentTransaction.commit();

16. 检索一个Fragment

    FragmentManager类提供了在Activity中查找一个Fragment的方法:

    findFragmentById(int id)

        根据指定的id查找Fragment

    findFragmentByTag(String tag)

        根据指定的tag查找Fragment

    这两个方法返回一个Fragment的引用, 或者null如果没有找到匹配的Fragment.


17. Fragment操作

    对于动态的Fragment除了把他们添加到Activity上, 还有许多其他的操作,如

    移除它们或者改变它们的可见性.

    • 提交到Activity的一系列更改叫做一个事务.

    • 通过FragmentTransaction类中的方法对Fragment进行操作. 包括:

       add()

           把Fragment添加到Activity中.

       remove()

           从Activity中移除Fragment.这个方法会销毁Fragment实例, 除非这个事务被添加到

           事务栈中.

       replace()

           在用户界面上移除一个Fragment并用另一个替换它.

       hide()

            在用户界面上隐藏一个Fragment(设置它的可见性为隐藏, 而不会销毁它的视图层次).

       show()

            显示之前被隐藏的Fragment.

       detach()

             从用户界面分离Fragment, 销毁其视图层次, 但不销毁Fragment实例.

        attach()

             把之前分离的Fragment重新附着到用户界面上, 重建其视图层次.


18. 执行Fragment事务

   为了执行Fragment事务:

    1. 通过调用FragmentManager.beginTransaction()方法获得一个FragmentTransaction实例.

    2. 通过事务实例执行任何数量的Fragment操作.

    3. 调用commit将事务提交到Activity.

    例如:
    
FragmentManager fragmentManager = getFragmentManager()
// Or: FragmentManager fragmentManager = getSupportFragmentManager()
fragmentManager.beginTransaction()
    .remove(fragment1)
    .add(R.id.fragment_container, fragment2)
    .show(fragment3)
    .hide(fragment4)
    .commit();
    对FragmentTransaction的操作顺序不会有影响, 除非:
    • 最后必须调用commit()
    • 如果向一个容器中加入了多个Fragment, 那么添加的顺序决定了它们在视图层次中出现的顺序.

19. 管理Fragment回退栈

   与系统自动维护一个Activity的回退栈类似,  可以选择把Fragment事务保存在一个由Activity

    维护的回退栈.

    • 如果把Fragment事务加到回退栈中, 那么用户可以通过点击设备的Back键导航回Fragment的变化.

    • 一旦所有的Fragment事务都从回退栈移除后, 再次点击Back键将销毁Activity.

    为了把Fragment事务添加到回退栈, 在提交事务之前调用

    FragmentTransaction.addToBackStack(String)方法.

    • String参数是一个可选的名字用于标示回退栈的状态或者是null, FragmentManager有一个

      popBackStack()方法能够返回之前的回退栈状态, 并返回它的名字.

    • 如果在一个事务中提交了多个更改, 并且了addToBackStack(), 那么在调用commit之前的所有更改

      都被作为一个事务添加到回退栈中, 并且Back键会把他们一起回退掉.

       如果在移除或者替换一个Fragment时调用addToBackStack()

    • 当Fragment被放到回退栈后, 系统会调用这个Fragment的onPause(), onStop和onDestroyView.

    • 如果用户点击Back键, 系统会调用onCreateView(),onActivityCreated(), onStart()和onResume().


20. 集成Fragment ActionBar/Options Menu Items

    Fragment可以在Activity的ActionBar或者Options Menu中添加它自己的项目
    • 首先必须在Fragment的onCreate方法中调用Fragment.setHasOptionsMenu()。
    • 然后可以提供Fragment的onCreateOptionsMenu() 和 onOptionsItemSelected()
      方法, 可选的, 还有onPrepareOptionsMenu(), onOptionsMenuClosed()
      和 onDestroyOptionsMenu()
    • 你实现这些方法就好像它们是在Activity的类定义中一样.

    在Activity基类(或者FragmentActivity基类)中相应的方法会被自动的调用它包含的每一个
    Fragment中的 这些方法.
    • 如果在Activity中重写了这些方法, 你可以处理由Activity直接管理的任何菜单项
    • 如果合适的话调用super的这些方法向这个Activity中的Fragment传递这个调用.
      不要忘了这点, 否则Fragment中的项目将被忽略.

    Activity会根据它的Fragment的动态状态自动地更新ActionBar或者Options Menu
    • 如果有需要当Fragment被添加、显示或者附着后项目也会被添加.
    • 当Fragment被移除、隐藏或者分离的时候项目会被移除掉.

21. 集成Fragment ActionBar/Options Menu Items(例子)

    Activity 源代码    

public class MyActivity extends Activity {
    // ...
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.activity_options, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_activity_info:
            // Handle activity menu item
            return true;
        default:
           // Handle fragment menu items
            return super.onOptionsItemSelected(item);
        }
    }
    // ...
}
    Fragment 源代码

public class MyFragment extends Fragment {
    // ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setHasOptionsMenu(true);
    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.myfragment_options, menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_first_info:
            // Handle fragment menu item
            return true;
        default:
            // Not one of ours. Perform default menu processing
            return super.onOptionsItemSelected(item);
        }
    }
    // ...
}

22. Fragment与Activity之间的通信

    一个给定的Fragment实例与包含它的Activity是直接绑定的.
    • Activity可以通过Fragment对象的引用直接调用Fragment的public方法.
      如果创建Fragment时如果没有到此Fragment的引用, 可以通过FragmentManager.findFragmentById或者
      FragmentManager.findFragmentByTag()来获得它的引用.
    • Fragment可以通过Fragment.getActivity()方法获得包含它的Activity的引用.
      例如, 可以获得一个Activity布局中的View的引用
      
View listView = getActivity().findViewById(R.id.list);

23. 最佳实践:Activities与Fragments松耦合

    避免Activity与Fragment紧耦合

    • 尤其是, 当你让Fragment太关心它的宿主Activity或者其他Fragment时, 就会增加它的复杂性,

      同时降低了复用性.

    • 另一方面, Activity需要对它持有的Fragments更加的关注.

24. 最佳实践:定义Fragment接口调用Activity的行为

    在Fragment中定义接口, 然后在它们的宿主Activity中回调.
    • 而不是让Fragment直接访问其宿主Activity内部. 在Fragment中创建一个嵌套的接口定义
      一组回调方法.
    • 宿主Activity就可以实现接口, 或者提供另一个监听对象实现接口.
    • 如果打算总是让Activity作为事件监听者, 那么可以再Fragment的onAttach()方法中注册它.
      否则可以提供一个 注册监听器的方法. 
    • 例如:
    Fragment 源代码   
public class TitlesFragment extends ListFragment {
    private OnTitleSelectedListener listener;
    public interface OnTitleSelectedListener {
        public void onTitleSelected(int index);
    }
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            showSecondFragmentListener = (OnTitleSelectedListener) activity;
        } catch (ClassCastException e) {
           throw new ClassCastException(activity.toString()
                   + " must implement OnTitleSelectedListener");
        }
    }
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        listener.onTitleSelected(position);
    }
    // ...
}
    Activity源代码  
public class MyActivity extends Activity
    implements TitlesFragment.OnTitleSelectedListener {
    public void onTitleSelected(int index) {
        // ...
    }
    // ...
}

25. 最佳实践:Activity作为切换器

    让Activity作为Fragments的中介
    • Fragment没有Intent过滤器, Intent不能直接的触发Fragment.
    • 让Activity对Intent做出响应, 然后Fragment进行回调.
    • Activity知道它是否可以把某一事件发到一个它包含的Fragment, 或者是否需要启动另一个Activity
      处理这个事件.

26. Fragment高级初始化

    每一个Fragment都必须有一个默认的空构造函数.
    • 当恢复Activity状态时系统会调用默认构造函数重新实例化Fragment.

    Fragments通常不应该实现其他的构造函数, 也不应该重写默认构造函数.
    • 当Fragment可用后, 应用程序代码能够运行的第一个位置就是

27. Fragment高级初始化:参数

    • 实例化一个Fragment之后, 可以给他提供一系列的参数

        创建一个Bundle对象, 把要作为参数传递给Fragment的任何值放到Bundle中.

        在这个Fragment中调用setArguments(Bundle), 传递这个Bundle.

    • 在Fragment内, 当准备好接受参数的时候调用getArguments().

    • 通常, 尤其是Fragment支持仅1个或者2个参数时, 定义一个静态的工厂方法实例化Fragment

      并传递参数是最简单的方法.

Fragment源代码

public static class DetailsFragment extends Fragment {
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();
        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }
    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }
    // ...
}
Activity源代码

DetailsFragment detail = DetailsFragment.newInstance(2);

28. 用Fragment实现对话框

    在Honeycomb(API 11)中, Activity类管理的对话框因为Fragment而标记为过时.
    DialogFragment类作为基于Fragment的对话框的基类.
    • DialogFragment实现了一个显示对话框窗体的Fragment, 悬浮在Activity的窗口之上.
    • 这个Fragment包含一个Dialog对象, 它基于Fragment的状态进行显示.
    • 使用DialogFragment的方法控制对话框(显示或者消失), 而不是直接调用对话框.

   也可以实现一个DialogFragment让它只被用于对话框, 这样的话, 它就可以在作为一个Dialog
   或者普通的
    Fragment显示, 并且由Activity中的ViewGroup进行管理.
    • 如果只想当成一个Dialog来使用, 那么覆盖onCreateDialog()方法, 然后返回一个Dialog
      或其子类的实例.
    • 如果想用作一个Dialog或者一个普通的Fragment, 覆盖onCreateDialog()方法, 
      然后返回一个视图层次.

29. 使用基于Fragment的Dialog

    DialogFragment类提供了一个重载方法show(), 它把显示对话框作为事务的一部分.
    • 如果提供了一个FragmentManager的引用, show()方法将创建一个事务, 添加Fragment,然后提交.
      当对话框消失的时候, 一个把对话框从Activity移除的新的事务将会被自动执行.
    • 如果提供了一个FragmentTransaction的引用, show()方法添加这个Fragment并且提交这个事务.
      这种情况下, 在调用show()之前可以将这个事务放到回退栈上.
    • 无论哪个版本的重载, 第二个参数是一个String类型的tag, 用于识别DialogFragment.

    DialogFragment提供dismiss()方法显示地让对话框消失.
    • 如果Fragment被添加到了回退栈, 所有的回退栈状态包括当前的都将出栈. 
      否则, 一个移除此Fragment的 新的事务将被提交.
    • 典型的用例是, 当对话框消失的时候, Fragment会让它自己消失.

30. 例子: 一个简单的确认DialogFragment

    Fragment源代码
public class ConfirmationDialogFragment extends DialogFragment
        implements DialogInterface.OnClickListener {
    private ConfirmationDialogFragmentListener listener;
    public static ConfirmationDialogFragment newInstance(int title) {
        ConfirmationDialogFragment frag = new ConfirmationDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }
    public interface ConfirmationDialogFragmentListener {
        public void onPositiveClick();
        public void onNegativeClick();
    }
    public void setConfirmationDialogFragmentListener(
        ConfirmationDialogFragmentListener listener) {
        this.listener = listener;
    }
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");
        return new AlertDialog.Builder(getActivity())
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(title)
                .setPositiveButton(android.R.string.ok, this)
                .setNegativeButton(android.R.string.cancel, this)
                .create();
     }
    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (listener != null) {
            switch (which) {
            case DialogInterface.BUTTON_POSITIVE:
                listener.onPositiveClick();
            default:
                listener.onNegativeClick();
            }
        }
    }
}
Activity源代码
public class SimpleConfirmationDialogFragmentActivity
     extends FragmentActivity
     implements OnClickListener, ConfirmationDialogFragmentListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button buttonPostDialog = (Button) findViewById(R.id.button_post_dialog);
        buttonPostDialog.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        ConfirmationDialogFragment confirmationDialog
            = ConfirmationDialogFragment.newInstance(R.string.dialog_format_title);
        confirmationDialog.setConfirmationDialogFragmentListener(this);
        confirmationDialog.show(getSupportFragmentManager(), null);
    }
    @Override
    public void onPositiveClick() {
        Toast.makeText(this, android.R.string.ok, Toast.LENGTH_LONG).show();
    }
    @Override
    public void onNegativeClick() {
        Toast.makeText(this, android.R.string.cancel, Toast.LENGTH_LONG).show();
    }
}

31. 其他的Fragment的子类

    还有一些为通用行为设计的Fragment的子类:
    ListFragment
        一个自动管理一个ListView的Fragment, 与ListActivity类似.
    PreferenceFragment
        一个自动管理一系列Preference对象的Fragment.使用xml Preference资源,Fragment
        能够自动创建界面 用于显示和编辑一系列Preferences.与PreferenceActivity类似.
    WebFragment
        一个自动创建并管理WebView的Fragment.
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值