<span style="font-family: Arial; font-size: 13.7931032180786px; background-color: rgb(255, 255, 255);">综合了几本书关于Fragment的部分。。</span>
---------------------------------------------------------------------------------------------
一,基础使用
Fragment是Android honeycomb 3.0新增的概念,与Activity相似,可以当成Activity的一个界面的一个组成部分,像类似很多APP下部的菜单,就是由一个Menu的Activity嵌入“首页”,“消息”,“个人”几个Fragment,Fragment的设计能提高性能,并且降低占用内存。 一个fragment必须总是嵌入在一个activity中,同时fragment的生命周期受activity而影响。下面是官网给的图
关于activity和Fragment的综合使用,在网上看到了以下的观点:
单Activity+多Fragment:
一个app仅有一个Activity,界面皆是Frament,Activity作为app容器使用。
优点:性能高,速度最快。参考:新版知乎 、google系app
缺点:逻辑比较复杂,尤其当Fragment之间联动较多或者嵌套较深时,比较复杂。
多模块Activity+多Fragment:
一个模块用一个Activity,比如
1、登录注册流程:
LoginActivity + 登录Fragment + 注册Fragment + 填写信息Fragment + 忘记密码Fragment
2、或者常见的数据展示流程:
DataActivity + 数据列表Fragment + 数据详情Fragment + ...
优点:速度快,相比较单Activity+多Fragment,更易维护。
-----------------------------------------------------------------------------------------------------------------------------
。。好吧对于Fragment我也没太理清楚,先来谈谈一般的使用,
FragmentManager
manager.findFragmentById(); //根据ID来找到对应的Fragment实例,主要用在静态添加fragment的布局中,因为静态添加的fragment才会有ID
manager.findFragmentByTag();//根据TAG找到对应的Fragment实例,主要用于在动态添加的fragment中,根据TAG来找到fragment实例
manager.getFragments();//获取所有被ADD进Activity中的Fragment
FragmentTransaction
用来对当前的Fragment进行管理,包括add,replace,remove//将一个fragment实例添加到Activity的最上层
add(int containerViewId, Fragment fragment, String tag);
//将一个fragment实例从Activity的fragment队列中删除
remove(Fragment fragment);
//替换containerViewId中的fragment实例,注意,它首先把containerViewId中所有fragment删除,然后再add进去当前的fragment
replace(int containerViewId, Fragment fragment);
除此还有 hide()、show()、detach()、attach()等
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
// 初始化控件
initView();
// 初始化底部按钮事件
initEvent();
// 初始化并设置当前Fragment
initFragments();
}
}
private void initFragments() {
// TODO 自动生成
homeFragment=new HomeFragment();
dailFragment=new DailFragment();
maFragment=new MaFragment();
meFragment=new MeFragment();
menuFragment=new MenuFragment();
fragments=new ArrayList<Fragment>();
fragments.add(homeFragment);
fragments.add(dailFragment);
fragments.add(maFragment);
fragments.add(meFragment);
fragments.add(menuFragment);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
hideFragment(transaction);
transaction.add(R.id.content, homeFragment);
transaction.add(R.id.content, dailFragment);
transaction.add(R.id.content, menuFragment);
transaction.hide(dailFragment);
transaction.hide(menuFragment);
transaction.show(homeFragment);
// 提交事务
transaction.commit();
}
private void hideFragment(FragmentTransaction transaction) {
// TODO 自动生成的方法存根
if (homeFragment != null) {
transaction.hide(homeFragment);
}
if (menuFragment != null) {
transaction.hide(menuFragment);
}
if (dailFragment != null) {
transaction.hide(dailFragment);
}
if (maFragment != null) {
transaction.hide(maFragment);
}
if (meFragment != null) {
transaction.hide(meFragment);
}
}
private void initEvent() {
// TODO 自动生成的方法存根
home.setOnClickListener(this);
dail.setOnClickListener(this);
ma.setOnClickListener(this);
me.setOnClickListener(this);
home.setSelected(true);
}
private void initView() {
// TODO 自动生成的方法存根
home=(TextView)findViewById(R.id.home);
dail=(TextView)findViewById(R.id.dail);
ma=(TextView) findViewById(R.id.ma);
me=(TextView) findViewById(R.id.me);
views=new ArrayList<TextView>();
views.add(home);
views.add(dail);
views.add(ma);
views.add(me);
menuIv=(ImageView) findViewById(R.id.menu_iv);
menuIv.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
currentIndex = 4;
v.setSelected(isMenuSelect=(isMenuSelect==true?false:true));
views.get(oldIndex).setSelected(false);
showCurrentFragment(currentIndex);
}
});
}
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
switch (v.getId()) {
case R.id.home:
currentIndex = 0;
break;
case R.id.dail:
currentIndex = 1;
break;
case R.id.ma:
currentIndex = 2;
break;
case R.id.me:
currentIndex = 3;
break;
}
// 规避策略将凸起的view还原
menuIv.setSelected(false);
isMenuSelect = false;
showCurrentFragment(currentIndex);
}
private void showCurrentFragment(int currentIndex) {
// TODO 自动生成的方法存根
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.hide(fragments.get(4));
if (currentIndex != oldIndex&¤tIndex!=4){
views.get(oldIndex).setSelected(false);
views.get(currentIndex).setSelected(true);
ft.hide(fragments.get(oldIndex));
if (!fragments.get(currentIndex).isAdded()){
ft.add(R.id.content,fragments.get(currentIndex));
}
ft.show(fragments.get(currentIndex)).commit();
oldIndex = currentIndex;
}
else if(currentIndex != oldIndex&¤tIndex==4){
ft.hide(fragments.get(oldIndex));
ft.show(fragments.get(currentIndex)).commit();
}
}
public class MeFragment extends Fragment implements OnClickListener {
private View meView;
private TextView unlogin;
private String account=null;
/*public MeFragment( String account) {
// TODO 自动生成的构造函数存根
this.account=account;
}*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 每个Fragment里都只有一个简单的view用于演示界面
meView=inflater.inflate(R.layout.p3, container, false);
// 初始化控件
initView(meView);
// 初始化底部按钮事件
initEvent();
return meView;
}
public interface OnLoginSelectedListener {
public void onLoginSelected();
}
private void initView(View root) {
// TODO 自动生成的方法存根
unlogin=(TextView)root.findViewById(R.id.unlogin);
if(account!=null){
unlogin.setText(account);
}
}
private void initEvent() {
// TODO 自动生成的方法存根
unlogin.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
/*switch (v.getId()) {
case R.id.unlogin:
Intent intent=new Intent(getActivity(),Login.class);
getActivity().startActivity(intent);
}*/
if (getActivity() instanceof OnLoginSelectedListener)
{
((OnLoginSelectedListener) getActivity()).onLoginSelected();
}
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
主Activity中:
public void onLoginSelected() {
// TODO 自动生成的方法存根
Intent intent=new Intent(MainActivity.this,Login.class);
startActivityForResult(intent,REQUEST_CODE);
}