• Android Fragment


    Fragment在3.0后增加:android.app.Fragment

    在v4的兼容包里也有。

    一般为了兼容性还是可能会用:android.support.v4.app.Fragment


    生命周期:

    onAttach,onCreate,onCreateView,onActivityCreated,onStart,onResume,

    onPause,onStop,onDestroyView,onDestroy,onDetach

    三种类别:

    DialogFragment

    对话框式的Fragments,能够将一个fragments 对话框并到activity 管理的fragments back stack 中,同意用户回到 该 dialog     

    ListFragment

    类似于ListActivity 的效果。而且还提供了ListActivity类似的onListItemCLick和setListAdapter等功能。内部维护一个ListView

    使用布局android.R.layout.list_content

    PreferenceFragments

    类似于PreferenceActivity .能够创建类似PAD的设置界面。


    使用Fragment

    1. xml中使用

    <fragment
            class="com.stone.fragment.FragmentDemoActivity$TitlesFragment"   // 用成 android:name 也行
            android:id="@+id/titles"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            />
    

    Fragment派生类 实现onCreateView() {inflater.inflate(... 将一个layout增加到fragment中) 返回View },

    2. 使用代码加入Fragment

    FragmentManager fragmentManager = getFragmentManager(); //3.0以上在Activity中使用

    FragmentManager fragmentManager = getSupportFragmentManager(); //使用V4包,应使用FragmentActivity

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    Fragment01dynamicFragment = new Fragment01();

    fragmentTransaction.add(R.id.ll_frag_two,dynamicFragment); //有 layout---将fragment 增加到layout-ll_frag_two 中

    fragmentTransaction.add(R.id.ll_frag_three,new Fragment01(),"kkk"); // “kkk” -----tag

    fragmentTransaction.add(dynamicFragment,"without_layout"); //无 layout

    fragmentTransaction.commit();//  提交。每段事务 都须要begintransaction

    fragmentManager.findFragmentById();

    fragmentManager.findFragmentByTag("tag"); //无界面的能够用 tag作唯一标识取出

    fragmentManager.popBackStack(); // activity的后退栈中弹出fragment(这能够模拟后退键引发的动作)。返回void

    fragmentManager.addOnBackStackChangedListerner(); // 注冊一个侦听器以监视后退栈的变化

    fragmentManager.executePendingTransactions(); // 马上运行事务

    fragmentTransaction.setTransition(transit); // 设置跳转动画

    fragmentTransaction.addToBackStack("options name"); //将之前的操作增加后退栈中,这时按back键,弹出fragment。恢复到之前的状态

    3. 事务的注意

        通过 add(),remove(), replace() 等 来操作 

    警告:你仅仅能在activity处于可保存状态的状态时,比方running中。onPause()方法和onStop()方法之前提交事务。否则会引发异常。这是由于fragment          

    的状态会丢失。假设要在可能丢失状态的情况下提交事务。请使用commitAllowingStateLoss()

    4.  參数传递

    与Activity交互,在 实现类中,getActivity();  // 得到其所在的activity

    fragment间传參:fragment.setArguments(bundle);

    5. Activity与Fragment共享事件

    在Fragment中定义回调接口,Activity中传入。

    回退栈的说明

    fragmentTransaction.addToBackStack 和fragmentManager.popBackStack 的样例:

    例1

    ft =fm.beginTransaction();

    ft.add(new asdf(),"frag1");

    ft.addToBackStack("back1");

    ft.commit();


    ft.add(new asdff(),"frag2");

    ft.commit(); //这时按back,弹出backStack中的 back1-frag1

    例2

    ft =fm.beginTransaction();

    ft.add(new asdf(),"frag1");

    ft.addToBackStack("back1");

    ft.commit();


    ft.add(new asdff(),"frag2");

    ft.addToBackStack("back2");

    ft.commit();//这时按back,先弹出back2,再按back。才弹出back1

    例3

    ft =fm.beginTransaction();

    ft.add(new asdf(),"frag1");

    ft.addToBackStack("back1");

    ft.commit();

    fm.popBackStack();//这里已经将back1弹出栈


    ft.add(new asdff(),"frag2");

    ft.addToBackStack("back2");

    ft.commit();// 这时按back。仅仅弹出back2


    附 “在同一layout中切换Fragment(不又一次载入fragment)” 代码:

    private FragmentManager manager;
    	private FragmentTransaction transaction;
    	private Fragment currentFrag;
    	/**
    	 * @param displayFrag 要显示的fragment
    	 * 
    	 * @author stone
    	 */
    	private void display(Fragment displayFrag) {
    		if (currentFrag != displayFrag) {
    			transaction = manager.beginTransaction();
    			if (displayFrag == null) return;
    			if (displayFrag.isAdded()) {
    				transaction.show(displayFrag);
    			} else {
    				transaction.add(R.id.fl_content, displayFrag);
    			}
    			if (currentFrag != null) {
    				transaction.hide(currentFrag);
    			}
    			currentFrag = displayFrag;
    			transaction.commit();
    		}
    		
    	}



  • 相关阅读:
    VC C运行时库(CRTL)的几个版本及选用
    gtest的安装和测试[good]
    【nginx】上传文件error报413 Request Entity Too Large
    mysql proxysql的简单部署读写分离
    python入门之进程与线程
    mysql主从复制之同步部分库表
    python入门之paramiko模块
    python入门之socket代码练习
    k8s的ingress使用
    【Jenkins】自动触发部署之插件Generic Webhook Trigger Plugin
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7043921.html
Copyright © 2020-2023  润新知