A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孟凡凯老师 于 2016-4-29 09:50 编辑

【济南校区】凯哥兵法之Fragment
Fragment概述:
       Fragment是Android3.0中引入的,主要是为了解决不同屏幕分辨率的动态和灵活UI设计。Fragment可以使一个App同时运行在小屏手机或者大屏平板上。
Fragment必须被写成可重用的模块。因为fragment有自己的layout,自己进行事件响应,拥有自己的生命周期和行为,所以你可以在多个activity中包含同一个Fragment的不同实例。这对于让你的界面在不同的屏幕尺寸下都能给用户完美的体验尤其重要。

Fragment优点:
       Fragment可以使activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
       Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
       Fragment是一个独立的模块,与activity绑定在一起。可以运行中动态地移除、加入、交换等。
       Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
       Fragment 解决Activity间的切换不流畅,轻量切换。
       Fragment 在4.2.版本中新增嵌套fragment使用方法,能够生成更好的界面效果。
       Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载  Fragment,提高性能。
Fragment的生命周期:
       我们可以把fragment看作是activity的模块化组件。Fragment拥有自己的生命周期和接收、处理用户的事件,可以动态的添加、替换和移除某个Fragment。

       Fragment必须是依存与Activity而存在的,必须要嵌入到Activity中,不能独立存在,因此Activity的生命周期会直接影响到Fragment的生命周期。

上面可以看到,Fragment比Activity多了几个额外的生命周期
onAttach(Activity)
Fragment附加到Activity时调用
onCreateView(LayoutInflater,ViewGroup,Bundle)
Activity需要加载Fragment的界面时调用
onActivityCreated(Bundle)
Fragment所在的Activity创建完成时调用
onDestoryView()
与onCreateView想对应,当Fragment的布局销毁时调用
onDetach()
与onAttach相对应,Fragment从Activity取消附加时调用

Fragment的使用

创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局
  1. public class LeftFragment extends Fragment implements OnClickListener {
  2.      private Button mBtnSet;
  3.      @Override
  4.      public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
  5.      View view = inflater.inflate(R.layout.fragment_left, null);
  6.      return view;
  7.         }
复制代码
使用XML添加FragmentActivity
尽管Fragment可以被多个Activity重用,但是也需要Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联
  1.     <fragment
  2.      android:id="@+id/fragment_left"
  3.      android:name="com.itheima.fragment.LeftFragment"
  4.      android:layout_width="wrap_content"
  5.      android:layout_height="wrap_content" />
复制代码
在Activity的布局文件中,使用<fragment>标签来指定显示是哪个Fragement类的内容。
注意:需要指定一个id属性和name属性,name指向你创建的Fragment类的全类名。
动态的设置Fragment
  1. public class MainActivity extends FragmentActivity {
  2.      private LeftFragment mLeftFragment;
  3.      private RightFragment mRightFragment;
  4.      @Override
  5.      protected void onCreate(Bundle savedInstanceState) {
  6.           super.onCreate(savedInstanceState);
  7.           setContentView(R.layout.activity_main);
  8.           setLeftFragment();
  9.           setRightFragment();
  10.      }

  11.      private void setRightFragment() {
  12.           mLeftFragment = new LeftFragment();
  13.           getSupportFragmentManager().beginTransaction()
  14.           .replace(R.id.fragment_left, mLeftFragment, "Left_Fragment")
  15.           .commit();
  16.      }

  17.      private void setLeftFragment() {
  18.           mRightFragment = new RightFragment();
  19.           getSupportFragmentManager().beginTransaction()
  20.           .replace(R.id.fragment_right, mRightFragment, "Right_Fragment")
  21.           .commit();
  22.      }
  23. }
复制代码
1.使用Context获取一个FragementManager对象
2.使用FragementManager对象开启一个事务并获取一个FragmentTransaction对象
3.创建一个Fragement对象,使用fragmentTransaction对象将一个Activity布局中的Viewgroup控件用Fragement替换
4.commit提交fragmentTransaction
不同版本Fragment的兼容
    由于Fragment是android3.0以后引入的,所以android3.0之前的操作系统是无法使用的,如果使用:
    1.需要导入support_v4.jar,使用其提供的Fragement;
    2.Activity要继承V4包中FragementActivity
    3.获取FragmentManager时需要使用getSupportFragmentManager();

Fragment之间的通信
两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。
1.一个Activity中的多个Fragment的桥梁就是Activity,可以使用Activity进行通讯。
2.在Fragment中获取上下文的方式是:getActivity()。
   注意:用getActivity()时,fragment必须和activity关联(attached to   an activity),否则将会返回一个null。
3.获取共有FragmentManager,然后通过tag标签获取对应的Fragement。就可以调用到另一个Fragement的方法。
  1. public class LeftFragment extends Fragment implements OnClickListener {

  2.      private Button mBtnSet;

  3.      @Override
  4.      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  5.           View view = inflater.inflate(R.layout.fragment_left, null);
  6.           return view;
  7.      }

  8.      @Override
  9.      public void onViewCreated(View view, Bundle savedInstanceState) {
  10.           mBtnSet = (Button) view.findViewById(R.id.btn_set);
  11.           mBtnSet.setOnClickListener(this);
  12.           super.onViewCreated(view, savedInstanceState);
  13.      }

  14.      @Override
  15.      public void onClick(View v) {
  16.           switch (v.getId()) {
  17.                case R.id.btn_set:
  18.                     RightFragment rightFragment = (RightFragment) getActivity()
  19.                .    getSupportFragmentManager().findFragmentByTag("Right_Fragment");
  20.                     rightFragment.setText("我的值被改变了");
  21.                     break;

  22.                default:
  23.                     break;
  24.           }
  25.      }
  26. }
复制代码
  1. public class RightFragment extends Fragment {
  2.      private TextView mTvRight;

  3.      @Override
  4.      public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
  5.           View view = inflater.inflate(R.layout.fragment_right, null);
  6.           return view;
  7.      }

  8.      @Override
  9.      public void onViewCreated(View view, Bundle savedInstanceState) {
  10.           mTvRight = (TextView) view.findViewById(R.id.tv_right_text);
  11.           super.onViewCreated(view, savedInstanceState);
  12.      }

  13.      public void setText(String str) {
  14.           mTvRight.setText(str);
  15.      }
  16. }
复制代码




1 个回复

倒序浏览
谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马