关于Android中的Fragment个人小结

来源:互联网 发布:淘宝线下代购 编辑:程序博客网 时间:2024/05/17 03:52
首先,需要明白几点:
1、Fragment是基于事务来实现,因为在替换(replace)碎片过程中,首先会把原来的碎片给删除,然后再去添加新的碎片,为了两次的操作的一致性,
所以开启一个事务,是这两个操作作为一个原子操作,从而更好保证一致性。

2、为什么要使用Fragment?

Fragment是Android 3.0出来的,那时候主要为了适应平板的开发,Fragment碎片也是和Activity一样也是

用于显示的界面,但是Fragment是属于轻量级的,而Activity是属于重量级消耗内存较大,Fragment的出现主要是为了分担Activity的负担,

3、实现Fragment和Activity的模块化:

在Activity中无需再针对每一个UI组件加以管理和控制,而是将Activity分为多个碎片,Activity对碎片块进行管理,而碎片块(Fragment)中放入UI组件,然后让碎片中具体对UI组件进行管理。从而实现Fragment和Activity模块化,以及他们各自分工明确。

4、如何实现一个Fragment:
Fragment有两种方法来进行装入,一种是静态装入,另一种就是动态Java代码的添加。
注意:
  1、在静态装入的时候:是在相关联的Activity中的布局文件中添加一个<fragment />UI布局组件容器,通过指定name属性即可,指定到相应的碎片。并且静态装入的时候可以直接通过findViewById方法获取相关联的Activity布局中的UI组件。
  2、在动态装入的时候:首先是在关联的Activity中的布局文件中获取到碎片容器的id,然后在关联的Activity中启动一个事务,来对动态装入碎片对象即可,
从碎片之间传递数据是通过setArgument方法实现
/***************个人对Fragment使用的总结*******************/
利用一个"先整体,后局部"思想。
1、首先、判断我关联的Activity中有几个Fragment碎片,也是我关联的Activity被划分几个碎片,有几个碎片就有几个碎片容器。
2、然后、再判断碎片是静态装入还是动态装入呢?? 若随着宿主Activity一同初始化显示的碎片,则为静态装入,若是经过触发哪个事件才会产生另一个碎片
则为动态装入。
3、得知装入方式后,若是静态装入的,则只需要指定关联的Activity中布局文件碎片容器为<fragment />,并且记住要指定name属性,指定指向的碎片对象
若是动态装入的,则需要到关联的Activity中去开启一个事务,动态将碎片对象装入到我们指定id布局文件的容器中即可
代码如下:
//1、创建FragmentManager对象
fManager=getFragmentManager();
//2、开启事务,Fragment是基于事务的
ft=fManager.beginTransaction();
//3、操作片段,添加,替换,删除
Fragment fragment=new FirstFragment();
ft.add(R.id.left_fragment,fragment, "first");//tag起到了标识的作用,标识不同的Fragment,第一个参数是表示把该片段放在Activity的


哪个位置,也就是在Fragment所关联的Activity布局文件的中某个指定位置的容器的id,
//例如我是把该碎片放在我的Activity_main中的左边的单帧布局容器中内容
//4、提交事务
ft.addToBackStack("two");//把添加碎片的事务也保存到回退栈中,实现按钮推到原先未修改的页面
ft.commit();
4、确定了怎么装入后,然后就是简单创建我们的碎片对象然后绑定布局即可
                              1、创建一个class去继承Fragment及子类

                              2、然后去重写OnCreateView方法,通过Inflate方法,将我们绑定的布局文件转化成一个View对象,并显示来即可。


Fragment测试案例:

MainActivity.java(会发现关联的Activity代码很少,因为模块化带来好处,将Activity的负担分开了)

package com.zhongqihong.testfragmentapp;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
FirstFragment.java

package com.zhongqihong.testfragmentapp;import android.annotation.SuppressLint;import android.app.Fragment;import android.app.FragmentManager;import android.app.FragmentTransaction;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;@SuppressLint("NewApi")public class FirstFragment extends Fragment{private FragmentManager fManager;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View v=inflater.inflate(R.layout.left_fragment, container,false);Button btn=(Button) v.findViewById(R.id.display);Button btn2=(Button) v.findViewById(R.id.nodisplay);fManager=getFragmentManager();btn2.setOnClickListener(new  OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubFragmentTransaction ft=fManager.beginTransaction();ft.remove(fManager.findFragmentByTag("center"));ft.commit();}});btn.setOnClickListener(new OnClickListener() {@SuppressLint("NewApi")@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//在左边的碎片中获取按钮去动态的装入第二碎片FragmentTransaction ft=fManager.beginTransaction();ft.replace(R.id.center_fragment, new CenterListFragment(), "center");ft.commit();}});return v;}}

CenterListFragment.java

package com.zhongqihong.testfragmentapp;import android.annotation.SuppressLint;import android.app.FragmentManager;import android.app.FragmentTransaction;import android.app.ListFragment;import android.os.Bundle;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ListView;@SuppressLint("NewApi")public class CenterListFragment extends ListFragment{@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {//该方法是监听ListFragment中每个Item点击事件    RightFragment fRightFragment=new RightFragment();       String content=l.getAdapter().getItem(position).toString();             Bundle bundle=new Bundle();             bundle.putString("item", content);             fRightFragment.setArguments(bundle);             FragmentManager fm=getFragmentManager();             FragmentTransaction ft=fm.beginTransaction();             ft.replace(R.id.right_fragment, fRightFragment, "right");             ft.commit();}@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);String [] data=new String[30];for (int i = 0; i < data.length; i++) {data[i]="item"+i;}ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data);setListAdapter(adapter);}}
RightFragment.java

package com.zhongqihong.testfragmentapp;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class RightFragment extends Fragment{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View v=inflater.inflate(R.layout.right_fragment, container, false);TextView tv=(TextView) v.findViewById(R.id.tv);Bundle bundle=getArguments();String str= bundle.get("item").toString();tv.setText(str);return v;}}


测试结果:



0 0