读书笔记(五)Fragment相关

<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 

是用来管理Fragment的, 每个Fragment以及宿主Activity(继承自FragmentActivity)都会在创建时,初始化一个FragmentManager对象,处理好Fragment嵌套问题的关键,就是理清这些不同阶级的栈视图,通过getFragmentManager()或getSupportFragmentManager()获得。
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()等
show(),hide()最终是让Fragment的View setVisibility(true还是false),不会调用生命周期;
replace()的话会销毁视图,即调用onDestoryView、onCreateView等一系列生命周期;
add()和 replace()不要在同一个阶级的FragmentManager里混搭使用。
-------------------------------------------------------------------------------------------
下面是实践中一段使用四个Fragment作为下部菜单的部分代码
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();
		 }
	}

--------------------------------------------------------------------------------------------------------
二,交互问题
从当前的fragment跳转到另一个fragment ,
比较简单。跟上面没有区别,唯一可以说的一点是传值的问题。
一般传值我们会写构造函数,但关于Fragment,各种建议是使用 setArguments()和getArguments()。
把值放入一个bundle对象中,用setArguments()方法绑定bundle对象传递到另外一个fragment中, 另外一个fragment中使用getArguments()可以拿到bundle对象
对应fragment和activity的跳转,
为了良好的藕合性,看书上说合理的做法应该在在fragment对应的.java文件,即那个自定义的fragment类中声明一个接口,然后在主Activity中实现这个接口,接下来就是两个Activity直接的跳转了,需要传值的话就使用startActivityForResult(),
下面实例
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);
	}


基本使用就这些叻。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值