当前位置: 首页 > 科技观察

AndroidFragment使用全分辨率

时间:2023-03-21 00:40:52 科技观察

Fragment的使用是家常便饭~~~1.概述自从API11引入Fragment以来,Fragment可以说是风靡一时。现在大部分项目都或多或少的使用了Fragment,具有更轻、更适合屏幕、更方便UI设计等优点。说了这么多,什么是Fragment?Fragment:片段,片段是一个应用程序的用户界面和行为,可以放在一个activity上。在其核心,它代表一个特定的操作或界面,运行在一个更大的活动之上。它代表界面,因为它可以作为布局中的一个View,代表一个具体的操作,因为它包含了逻辑操作的生命周期。简而言之,Fragment是一个有生命周期的组件。(有问题请指正!)Fragment特性:生命周期必须依赖于Activity。当Activity被销毁时,所有的片段都会被销毁。(曾经踩过坑)轻量级,轻量级切换。方便处理平板和手机的界面差异。2、继承结构和生命周期继承结构:Fragment直接继承Object,有四个直接子类。就个人而言,我很少使用它的子类。生命周期:Fragment的生命周期在图上标注的很清楚,就不细说了。这张图是很久以前收集的了,原出处忘记了。在此感谢原作者!3.基本使用1).静态使用静态使用是指Fragment像控件一样用在布局中。TestFragment.java继承Fragment重写onCreateView方法/***Createdbymagicon2016年9月27日.*/publicclassTestFragmenttextendsFragment{@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.fragment_main,ImageViewimgcontainer);=(ImageView)view.findViewById(R.id.img);img.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Toast.makeText(getActivity(),"这是一个片段",Toast.LENGTH_SHORT).show();}});returnview;}}fragment_main.xmlMainActivity.java实际上什么也没做/***CreatedbymagiconSeptember27,2016.*/publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}activity_main.xml使用fragment标签添加fragment,通过class指定fragment的完整类名。运行效果:2).动态使用动态使用就是动态添加,替换,移除,隐藏和显示分段。CommonFragment.java/***由magicon2016年9月27日创建。CommonFragment*/@SuppressLint("ValidFragment")publicclassCommonFragmentextendsFragment{Stringdesc;publicCommonFragment(Stringdesc){super();this.desc=desc;}@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.fragment_common,container,false);TextViewtev=(TextView)视图。findViewById(R.id.tev);System.out.println(desc);tev.setText(desc);returnview;}}通过构造方法以传递数据的形式设置TextView上的内容。fragment_common.xmlMainActivity.java/***Createdbymagicon2016年9月27日.底部tab+fragment*/publicclassMainActivityextendsActivityimplementsOnClickListener{TextViewtev_tab1,tev_tab2,tev_tab3,tev_tab4;//fragment事务类ft;/FragmentTransaction/fragmentCommonFragmenttabFragment1,tabFragment2,tabFragment3,tabFragment4;@SuppressLint("CommitTransaction")@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);initView();ft=getFragmentManager().beginTransaction();tabFragment1=newCommonFragment("Tab1");//替换ft.replace(R.id.container,tabFragment1);//提交ft.commit();}//初始控制privatevoidinitView(){tev_tab1=(TextView)findViewById(R.id.tev_tab1);tev_tab2=(TextView)findViewById(R.id.tev_tab2);tev_tab3=(TextView)findViewById(R.id.tev_tab3);tev_tab4=(TextView)findViewById(R.id.tev_tab4);tev_tab1.setOnClickListener(这个);tev_tab2.setOnClickListener(这个);tev_tab3.setOnClickListener(这个);tev_tab4.setOnClickListener(这个);}@OverridepublicvoidonClick(Viewv){FragmentTransactionft=getFragmentManager().beginTransaction();switch(v.getId()){caseR.id.tev_tab1:ft.replace(R.id.container,tabFragment1);break;caseR.id.tev_tab2:if(tabFragment2==null){tabFragment2=newCommonFragment("Tab2");}ft.replace(R.id.container,tabFragment2);break;caseR.id.tev_tab3:if(tabFragment3==null){tabFragment3=newCommonFragment("Tab3";);}ft.replace(R.id.container,tabFragment3);break;caseR.id.tev_tab4:if(tabFragment4==null){tabFragment4=newCommonFragment("Tab4");}ft.replace(R.id.container,tabFragment4);break;}//提交ft.commit();}}activity_main2.xml通过FrameLayout标签创建一个Fragment容器,为最下面的四个Tab添加监听事件动态替换FrameLayout容器中的Fragment运行效果:4、相关类及主要方法FragmentManagerFragmentManager,一个抽象类,具体实现在Android-support-v4.jar中的FragmentManagerImpl类中//获取FragmentManager对象FragmentManagermanager=getFragmentManager();FragmentTransaction片段事务类,抽象class,具体是在BackStackRecord类中实现的,实际上增删改查等操作的最终实现还是在FragmentManagerImpl类中。//获取FragmentTransaction对象FragmentTransactiontransaction=manager.beginTransaction();//添加fragmenttransaction.add();transaction.add(containerViewId,fragment,tag);//将添加到容器中的现有片段替换transaction.replace();//删除现有片段transaction.remove();//保存当前片段数据以避免视图重绘transaction.hide();//显示thepreviouslyhiddenfragmenttransaction.show();//这两个方法会触发fragment中的onHiddenChanged(booleanhidden)回调//数据实例在显示之前不会被销毁,但是视图层还是会被销毁,即onDestoryViewandonCreateViewtransaction.addToBackStack(null);//事务提交transaction.commit();FragmentFragmentclassFragmentfragment=newFragment();//返回当前与该fragment关联的Activity.getActivity();//设置数据fragment.setArguments(newBundle());//获取数据fragment.getArguments();//返回andFragmentManagerfragment.getFragmentManager();//获取标签名fragment.getTag();//隐藏状态改变时回调//onHiddenChanged(true);有兴趣的可以去阅读TheFuckingSource,反正我看到头大了...5.其他未完待续...