android Fragment

经验1:

移除backstack所有fragment:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

第二个参数:只能是 0 或者 1(POP_BACK_STACK_INCLUSIVE);

    第一个参数为null时,第二个参数为0时:

    会弹出回退栈中最上层的那一个fragment。

    因为经测试,回退栈中的fragment个数减少了一个。

第二个参数为1时:

会弹出所有回退栈中的fragment。

因为经测试,回退栈中的fragment个数变为0了。


注:

You can pop the fragment by name. While adding fragments to the back stack, just give them a name.

fragmentTransaction.addToBackStack("fragB"); fragmentTransaction.addToBackStack("fragC");

Then in Fragment_C, pop the back stack using the name ie.. fragB and include POP_BACK_STACK_INCLUSIVE

 someButtonInC.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fm = getActivity() .getSupportFragmentManager(); fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE); } });



首先 介绍一段关于ActivityGroup的API文档:

This class was deprecated in API level 13.
Use the new Fragment andFragmentManager APIs instead; these are also available on older platforms through the Android compatibility package.

也就是说ActivityGroup现在要用Fragment代替。

 

接下来,介绍Fragment:

This document describes how to build your application to use fragments, including how fragments can maintain their state when added to the activity's back stack, share events with the activity and other fragments in the activity, contribute to the activity's action bar, and more.

这份文档描述了如何应用fragment来创建你的应用法度,包含fragment在添加到幕后栈时如何保护他们的状况,如何同activity和其他同属于该activityfragment们共享事务,构建到activity动作槽(action bar)中去,等等。

首先要创建一个Fragment子类。

然后至少重写一下三个方法:

onCreate()
在创建fragment时系统会调用此方法。在实现代码中,你可以初始化想要在fragment中保持的那些必要组件,当fragment处于暂停或者停止状态之后可重新启用它们。

onCreateView()
在第一次为fragment绘制用户界面时系统会调用此方法。为fragment绘制用户界面,这个函数必须要返回所绘出的fragment的根View。如果fragment没有用户界面可以返回空。

onPause()
系统回调用该函数作为用户离开fragment的第一个预兆(尽管这并不总意味着fragment被销毁)。在当前用户会话结束之前,通常要在这里提交任何应该持久化的变化(因为用户可能不再返回)。
android Fragment_第1张图片

1、添加一个用户界面

A fragment is usually used as part of an activity's user interface and contributes its own layout to the activity.

fragment通常被当做activity的用户界面的一部分来使用,并可以导入自己的布局到activity中。

To provide a layout for a fragment, you must implement the onCreateView() callback method, which the Android system calls when it's time for the fragment to draw its layout. Your implementation of this method must return aView that is the root of your fragment's layout.

Note: If your fragment is a subclass of ListFragment, the default implementation returns aListView fromonCreateView(), so you don't need to implement it.

ListFragment就不用实现onCreateView方法了。

To return a layout from onCreateView(), you can inflate it from a layout resource defined in XML. To help you do so, onCreateView() provides a LayoutInflater object.

 

The inflate() method takes three arguments:

  • inflate的布局的资料ID
  • inflate布局的父ViewGroup。传入container很首要,这是为了让体系将布局参数应用到inflate布局的根view中去,由其将要嵌入的父view指定。
  • 一个布尔值,注解在inflate时代infalte布局是否应当附上ViewGroup(第二个参数)。(在这个例子的是false,因为体系已经将inflate布局插入到容器中(container)——传true会在终极的布局里创建一个多余的ViewGroup。)

     

    添加Fragment的两种方式:

    1、布局添加

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

    2、代码添加:

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

    若是你正将多个fragment添加到同一个容器中,那么添加次序决意了它们在视图层次(view
    hierarchy
    )里显示的次序。

    在履行删除fragment事务时若是没有调用addToBackStack(),那么事务提交fragment会被烧毁,而且用户也无法回退。然而,当移除一个fragment时,若是调用了addToBackStack(),那么之后fragment会被停止若是用户回退,它将被恢复过来。

    提示:对每一个fragment事务,在提交之前经由过程调用setTransition()来应用一个事务动画

    调用commit()并不立即履行事务,相反而是采取预约体式格式,一旦activity的界面线程(主线程)筹办好便可运行起来。然而,若是有须要的话,你可以从界面线程调用executePendingTransations()立即履行由commit()提交的事务。如许做凡是是没有须要的,除非其它线程的工作依附与该项事务。

    警告:只能在activity保存状况(当用户分开activity时)之前commit()提交事务。若是你测验测验在那时之后提交,会抛出一个异常。这是因为若是activity须要恢复提交后的状况会被丧失。对于这类丧失提交的景象,可应用commitAllowingStateLoss()

     

    Fragment与Activity交互:

    1、fragment访问activity:

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

    2、activity访问fragment:

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

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

     


     

  • 你可能感兴趣的:(android Fragment)