您的位置:首页 > 移动开发 > Android开发

关于Android中的Fragment个人小结

2015-12-23 23:58 537 查看
首先,需要明白几点:

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 {

@Override
protected 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;
@Override
public 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() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
FragmentTransaction ft=fManager.beginTransaction();
ft.remove(fManager.findFragmentByTag("center"));
ft.commit();
}
});
btn.setOnClickListener(new OnClickListener() {

@SuppressLint("NewApi")
@Override
public 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{
@Override
public 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();
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.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{
@Override
public 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;
}
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: