FragmentTabHost中的tab对应的Fragment不被OnDestoryView

2014-11-24 00:57:57 · 作者: · 浏览: 4

问题:

\

从上图的这个界面跳转到某个联系人的具体界面,但是上图中的fragment没有执行onPause(),onStop(),onDestoryView()方法,于是这个为被销毁的界面会影响联系人具体界面的操作。

所以不得不,手动摧毁这个界面,于是,在载入联系人具体界面之前,现将上图界面hide()

fragment = fm.findFragmentByTag("0").getChildFragmentManager().findFragmentByTag("contacts");
		if(fragment!=null){
			Log.e(TAG, "contacts已存在");
//			fragment.onPause();
//			fragment.onStop();
//			fragment.onDestroyView();
			fm.beginTransaction().hide(fragment).commit();
		}

此时,如果在联系人具体界面点击返回按钮,上面中的界面会为空,是因为,界面没有被show()出来,所以监听返回按钮,show()这个界面。

// 监听实体回退按钮,只有对view设置了焦点,回退按钮 和 向上导航才能被监听到
		view.setFocusableInTouchMode(true);
		view.requestFocus();
		view.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {

				switch (keyCode) {
				case KeyEvent.KEYCODE_BACK:
					fragment = (ContactsFragmentTab) fm.findFragmentByTag("0").getChildFragmentManager().findFragmentByTag("contacts");					
					fm.beginTransaction().show(fragment).commit();
					break;

				default:
					break;
				}

				return false;
			}
		});
监听向上导航

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		Log.e(TAG, "onOptionsItemSelected");

		switch (item.getItemId()) {
		case android.R.id.home:

			fragment = (ContactsFragmentTab) fm.findFragmentByTag("0").getChildFragmentManager().findFragmentByTag("contacts");					
			fm.beginTransaction().show(fragment).commit();
			// called when the up affordance/carat in actionbar is pressed
			 getActivity().onBackPressed();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}

	}


注:为了fragment的重用,fragment与其他fragment的交互最好都放在他们的activity中进行,使用接口来实现之间的相互操作,见另外几篇博文:

http://blog.csdn.net/zqx198810/article/details/9401475