网站里宣传视频怎么做,遂宁企业网络推广方案,购物网站开发步骤视频演示,义乌企业网站设计转载出处#xff1a;http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现#xff0c;曾经有段时间#xff0c;感觉大家谈什么都能跟Fragment谈上关系#xff0c;做什么都要问下Fragment能实现不~~~哈哈#xff0c;是不是有点过~~~ 本篇博客力求… 转载出处http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现曾经有段时间感觉大家谈什么都能跟Fragment谈上关系做什么都要问下Fragment能实现不~~~哈哈是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产生什么是FragmentFragment生命周期如何静态和动态的使用FragmentFragment回退栈Fragment事务以及Fragment的一些特殊用途例如没有布局的Fragment有何用处Fragment如何与Activity交互Fragment如何创建对话框Fragment如何与ActionBar集成等等。 1、Fragment的产生与介绍 Android运行在各种各样的设备中有小屏幕的手机超大屏的平板甚至电视。针对屏幕尺寸的差距很多情况下都是先针对手机开发一套App然后拷贝一份修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么当然了必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分甚至Activity的界面可以完全有不同的Fragment组成更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是你可以动态的添加、替换和移除某个Fragment。
2、Fragment的生命周期 Fragment必须是依存与Activity而存在的因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系 最后一个是onDetach(); 可以看到Fragment比Activity多了几个额外的生命周期回调方法 onAttach(Activity) 当Fragment与Activity发生关联时调用。 onCreateView(LayoutInflater, ViewGroup,Bundle) 创建该Fragment的视图 onActivityCreated(Bundle) 当Activity的onCreate方法返回时调用 onDestoryView() 与onCreateView想对应当该Fragment的视图被移除时调用 onDetach() 与onAttach相对应当Fragment与Activity关联被取消时调用 注意除了onCreateView其他的所有方法如果你重写了必须调用父类对于该方法的实现 3、静态的使用Fragment 嘿嘿终于到使用的时刻了~~ 这是使用Fragment最简单的一种方式把Fragment当成普通的控件直接写在Activity的布局文件中。步骤 1、继承Fragment重写onCreateView决定Fragemnt的布局 2、在Activity中声明此Fragment就当和普通的View一样 下面展示一个例子我使用2个Fragment作为Activity的布局一个Fragment用于标题布局一个Fragment用于内容布局 TitleFragment的布局文件:
?xml version1.0 encodingutf-8?
RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_height45dpandroid:backgrounddrawable/title_bar ImageButtonandroid:idid/id_title_left_btnandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_centerVerticaltrueandroid:layout_marginLeft3dpandroid:backgrounddrawable/showleft_selector /TextViewandroid:layout_widthfill_parentandroid:layout_heightfill_parentandroid:gravitycenterandroid:text我不是微信android:textColor#fffandroid:textSize20spandroid:textStylebold //RelativeLayout
TitleFragment package com.zhy.zhy_fragments;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.Toast;public class TitleFragment extends Fragment
{private ImageButton mLeftMenu;Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){View view inflater.inflate(R.layout.fragment_title, container, false);mLeftMenu (ImageButton) view.findViewById(R.id.id_title_left_btn);mLeftMenu.setOnClickListener(new OnClickListener(){Overridepublic void onClick(View v){Toast.makeText(getActivity(),i am an ImageButton in TitleFragment ! ,Toast.LENGTH_SHORT).show();}});return view;}
}同理还有ContentFragment的其布局文件?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationvertical TextViewandroid:layout_widthfill_parentandroid:layout_heightfill_parentandroid:gravitycenterandroid:text使用Fragment做主面板android:textSize20spandroid:textStylebold //LinearLayoutpackage com.zhy.zhy_fragments;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class ContentFragment extends Fragment
{Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){return inflater.inflate(R.layout.fragment_content, container, false);}}MainActivitypackage com.zhy.zhy_fragments;import android.app.Activity;
import android.os.Bundle;
import android.view.Window;public class MainActivity extends Activity
{Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);}}Activity的布局文件RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent fragmentandroid:idid/id_fragment_titleandroid:namecom.zhy.zhy_fragments.TitleFragmentandroid:layout_widthfill_parentandroid:layout_height45dp /fragmentandroid:layout_belowid/id_fragment_titleandroid:idid/id_fragment_contentandroid:namecom.zhy.zhy_fragments.ContentFragmentandroid:layout_widthfill_parentandroid:layout_heightfill_parent //RelativeLayout是不是把Fragment当成普通的View一样声明在Activity的布局文件中然后所有控件的事件处理等代码都由各自的Fragment去处理瞬间觉得Activity好干净有木有~~代码的可读性、复用性以及可维护性是不是瞬间提升了~~~下面看下效果图4、动态的使用Fragment 上面已经演示了最简单的使用Fragment的方式~下面介绍如何动态的添加、更新、以及删除Fragment 为了动态使用Fragment我们修改一下Actvity的布局文件中间使用一个FrameLayout下面添加四个按钮~~~嘿嘿~~不是微信的按钮- -
RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent fragmentandroid:idid/id_fragment_titleandroid:namecom.zhy.zhy_fragments.TitleFragmentandroid:layout_widthfill_parentandroid:layout_height45dp /includeandroid:idid/id_ly_bottombarandroid:layout_widthfill_parentandroid:layout_height55dpandroid:layout_alignParentBottomtruelayoutlayout/bottombar /FrameLayoutandroid:idid/id_contentandroid:layout_widthfill_parentandroid:layout_heightfill_parentandroid:layout_aboveid/id_ly_bottombarandroid:layout_belowid/id_fragment_title //RelativeLayout底部四个按钮的布局就不贴了到时看效果图就明白了~~ 下面主Activity package com.zhy.zhy_fragments;import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.LinearLayout;public class MainActivity extends Activity implements OnClickListener
{private LinearLayout mTabWeixin;private LinearLayout mTabFriend;private ContentFragment mWeixin;private FriendFragment mFriend;Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);// 初始化控件和声明事件mTabWeixin (LinearLayout) findViewById(R.id.tab_bottom_weixin);mTabFriend (LinearLayout) findViewById(R.id.tab_bottom_friend);mTabWeixin.setOnClickListener(this);mTabFriend.setOnClickListener(this);// 设置默认的FragmentsetDefaultFragment();}private void setDefaultFragment(){FragmentManager fm getFragmentManager();FragmentTransaction transaction fm.beginTransaction();mWeixin new ContentFragment();transaction.replace(R.id.id_content, mWeixin);transaction.commit();}Overridepublic void onClick(View v){FragmentManager fm getFragmentManager();// 开启Fragment事务FragmentTransaction transaction fm.beginTransaction();switch (v.getId()){case R.id.tab_bottom_weixin:if (mWeixin null){mWeixin new ContentFragment();}// 使用当前Fragment的布局替代id_content的控件transaction.replace(R.id.id_content, mWeixin);break;case R.id.tab_bottom_friend:if (mFriend null){mFriend new FriendFragment();}transaction.replace(R.id.id_content, mFriend);break;}// transaction.addToBackStack();// 事务提交transaction.commit();}}可以看到我们使用FragmentManager对Fragment进行了动态的加载这里使用的是replace方法~~下一节我会详细介绍FragmentManager的常用API。 注如果使用Android3.0以下的版本需要引入v4的包然后Activity继承FragmentActivity然后通过getSupportFragmentManager获得FragmentManager。不过还是建议版Menifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上这样就不必引入v4包了。 代码中间还有两个Fragment的子类ContentFragment上面已经见过FriendFragment其实类似
package com.zhy.zhy_fragments;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class FriendFragment extends Fragment
{Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){return inflater.inflate(R.layout.fragment_friend, container, false);}}效果图可以看到很好的实现了效果其实这个效果以前的博客中也出现过在博客Android项目Tab类型主界面大总结 FragmentTabPageIndicatorViewPager有兴趣可以看看。ps:为了代码的简洁就不添加按钮的点击变化什么的了主要讲解功能了~~~
5、Fragment家族常用的API Fragment常用的三个类 android.app.Fragment 主要用于定义Fragment android.app.FragmentManager 主要用于在Activity中操作Fragment android.app.FragmentTransaction 保证一些列Fragment操作的原子性熟悉事务这个词一定能明白~ a、获取FragmentManage的方式 getFragmentManager() // v4中getSupportFragmentManager b、主要的操作都是FragmentTransaction的方法 FragmentTransaction transaction fm.benginTransatcion();//开启一个事务 transaction.add() 往Activity中添加一个Fragment transaction.remove() 从Activity中移除一个Fragment如果被移除的Fragment没有添加到回退栈回退栈后面会详细说这个Fragment实例将会被销毁。 transaction.replace() 使用另一个Fragment替换当前的实际上就是remove()然后add()的合体~ transaction.hide() 隐藏当前的Fragment仅仅是设为不可见并不会销毁 transaction.show() 显示之前隐藏的Fragment detach() 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。 attach() 重建view视图附加到UI上并显示。 transatcion.commit()//提交一个事务 注意常用Fragment的哥们可能会经常遇到这样Activity状态不一致State loss这样的错误。主要是因为commit方法一定要在Activity.onSaveInstance()之前调用。 上述基本是操作Fragment的所有的方式了在一个事务开启到提交可以进行多个的添加、移除、替换等操作。 值得注意的是如果你喜欢使用Fragment一定要清楚这些方法哪个会销毁视图哪个会销毁实例哪个仅仅只是隐藏这样才能更好的使用它们。 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。 上述已经介绍完成了Fragment常用的一些方法相信看完大家一定清楚了Fragment的产生理由以及如何使用Fragment再根据API的讲解也能明白曾经为何觉得Fragment会出现一些列乱七八槽的问题终究是因为没有弄清楚其生命周期。 由于篇幅原因剩下的内容留到下一篇了。在下一篇会介绍 1、如何管理Fragment回退栈 2、Fragment如何与Activity交互 3、Fragment与Activity交互的最佳实践 4、没有视图的Fragment的用处 5、使用Fragment创建对话框 6、如何与ActionBarMenuItem集成等~~