Android Fragment应用(一)

原博文:http://blog.csdn.net/lmj623565791/article/details/37992017

1.Fragment(碎片)类

  

  Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期

  多个Fragment可以放在一个Activity中(所以上面讲到类似一个嵌套Activity),

  而这个类可以对这些Fragment进行配置以适应不同屏幕尺寸(比如平板和手机)

  注意:Fragment是在3.0版本引入的,如果你使用的是3.0之前的系统,需要先导入android-support-v4的jar包才能使用Fragment功能。

2.生命周期(方法)


新方法,这里需要重点介绍一下:

  • onAttach方法:Fragment和Activity建立关联的时候调用。
  • onCreateView方法:为Fragment加载布局时调用。
  • onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
  • onDestroyView方法:Fragment中的布局被移除时调用。
  • onDetach方法:Fragment和Activity解除关联的时候调用。

3.定义Fragment类  :Tag为自己定义,用来标识该Fragment,方便找到它的示例

public class Fragment1 extends Fragment {
    public static final String  Tag=Fragment1.class.getSimpleName();
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //创建自己的用户界面,为该fragment指定布局文件“R.layout.fragment1”
        return inflater.inflate(R.layout.fragment1,container,false);

    }

  

4.使用Fragment指定的界面布局

  4.1在布局文件(activity_main.xml)上直接使用(较死板)

<?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.Fragment1"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.Fragment2"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

  4.2在MainActivity.class中动态加载Fragment

public class MainActivity extends ActionBarActivity {

    private Fragment2 fragment2=new Fragment2();
    private Fragment1 fragment1=new Fragment1();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.linearlayout);
        //判读屏幕是否为横屏、竖屏,变换不同的界面
        if(getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE)
        {
            //横屏时:添加fragment2
            //步骤:
            /*
            * 1.获取fragment管理器:FragmentManager
            * 2.获取开始任务:beginTransaction
            * 3.任务操作:add,replace,show,hide等等
            * 4.提交任务:commit();
            * */
            getFragmentManager().beginTransaction().add(android.R.id.content, fragment2).commit();

        }else{
            //竖屏时:添加fragment1
            getFragmentManager().beginTransaction().add(android.R.id.content, fragment1).commit();
           // getFragmentManager().beginTransaction().replace()
        }

    }}

5.与activity间的交流

    5.1 Activity与Fragment交流

        a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法

        b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,

             可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。

        c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

        注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。

       findFragmentById()示例:R.id.fragment和getId()的值是指xml文件里添加的id:fragment1的值

                        Fragment1 fragment=(Fragment1)getFragmentManager().findFragmentById(R.id.fragment1);
                        Fragment1 fragment=(Fragment1)getFragmentManager().findFragmentByTag(Fragment1.Tag);
                        String Tag=fragment.getId();
<fragment
       android:name="com.example.hq.fragments.Fragment1"
       android:id="@+id/fragment1"
       android:layout_width="match_parent"
       android:layout_height="match_parent"></fragment>

  findFragmentByTag()示例:Fragment1.Tag已经在该类里定义了而且要在add方法中添加进去才能findByTag

 //动态添加fragment1
  getFragmentManager().beginTransaction().add(R.id.linear,fragment1,Fragment1.Tag).commit()

  根据在Fragmen1类里定义的Tag,获取该它的示例

 //获取fragment1
                        Fragment1 fragment=(Fragment1)getFragmentManager().findFragmentByTag(Fragment1.Tag);
                        String Tag=fragment.getTag()+":";

  

 

 

  

遗留的地方:任务操作:add,replace,show,hide等等

a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。

c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

 

 

posted @ 2015-04-27 16:53  beyondbycyx  阅读(206)  评论(0编辑  收藏  举报