關於FragmentActivity中調用fragment中方法

	private void initFragment() {

		mRecommendFragment = new RecommendFragment();
		mInvestFragment = new InvestFragment();
		mCla***oomFragment = new Cla***oomFragment();
		mMineFragment = new MineFragment();

		mBaseFragments = new BaseFragment[] { mRecommendFragment,
				mInvestFragment, mCla***oomFragment, mMineFragment };
	}



	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.llrecommend:
			btStatuas(mRecommendFragment, 0);
			switchContent(mRecommendFragment);
			if(mRecommendFragment.getActivity() != null){
				mRecommendFragment.NetFragment();
			}
			break;
		case R.id.llinvest:
			btStatuas(mInvestFragment, 1);
			switchContent(mInvestFragment);
			break;
		case R.id.llcla***oom:
			btStatuas(mCla***oomFragment, 2);
			switchContent(mCla***oomFragment);
			break;
		case R.id.llmine:
			if (MyApplication.getInstance().getLoginInfo() != null) {
				btStatuas(mMineFragment, 3);
				switchContent(mMineFragment);
				if(mMineFragment.getActivity() != null){
					mMineFragment.refreshTitleData();
				}
			} else {
				Intent intent = new Intent(MainActivity.this,
						LoginActivity.class);
				intent.putExtra("fromact", Constant.FROM_ACT_MAIN);
				startActivityForResult(intent, 0);
			}
			break;
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		switch (resultCode) {
		case 1:
			if (MyApplication.getInstance().getLoginInfo() == null) {
				btStatuas(mCurrentContent, mCurrentLockIndex);
				switchContent(mCurrentContent);
			} else {
				btStatuas(mMineFragment, 3);
				switchContent(mMineFragment);
			}
			break;
		case 2:
			if (MyApplication.getInstance().getLoginInfo() == null) {
				btStatuas(mRecommendFragment, 0);
				switchContent(mRecommendFragment);
			}
			break;
		}

	}
	
	
	public void switchContent(Fragment to) {
		if (mContent != null && mContent != to) {
			FragmentTransaction transaction = fragmentManager
					.beginTransaction().setCustomAnimations(
							android.R.anim.fade_in, android.R.anim.fade_out);
			if (!to.isAdded()) { // 先判斷是否被add過
				transaction.hide(mContent).add(R.id.llfrag, to).commitAllowingStateLoss(); // 隱藏當前的fragment,add下一個到Activity中
			} else {
				transaction.hide(mContent).show(to).commitAllowingStateLoss(); // 隱藏當前的fragment,顯示下一個
			}
			mContent = to;
		}
	}

1、上面代碼是多個fragment之間進行切換顯示,未添加到activity中的需要add、commit,已添加的需要hide,show。

在FragmentActivity啓動時,會加載在Fragment1,當Fragment1--->Activity2----->Activity3---->FragmentActivity(Fragment1)---->Fragment2,時此時Fragmnet屬於未被Add入FragmentActivity中,僅僅通過new創建了實例,內部生命週期不跑,其中getActivity == null,isAdded() == false;commit並沒有立即執行,而是走正常生命週期,所以不能再activity中不能調用fragment內部方法,ui未加載都爲空,不能進行ui刷新。當add過後commit執行完,內部方法可以調用。


2、關於show,hiden時fragment在別的activity中fc後返回會出現fragment顯示show異常

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		if (savedInstanceState == null) {
			initView();
			initClick();
			initFragment();
			initFragmentContent();
			//版本檢測
//			initData();
		} else {
			initView();
			initClick();
			initFragment();
			
			fragmentManager = getSupportFragmentManager();
			FragmentTransaction beginTransaction = fragmentManager
					.beginTransaction();
			btStatuas(mRecommendFragment, 0);
//			findViewById(R.id.llfrag)
			beginTransaction.replace(R.id.llfrag, mRecommendFragment);
//			beginTransaction.add(R.id.llfrag, mRecommendFragment);
			mContent = mBaseFragments[0];
			beginTransaction.commitAllowingStateLoss();
//			Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
		}
			@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		super.onSaveInstanceState(outState);
		outState.putInt("index", 0);
	}

onSaveInstanceState(Bundle outState)保存狀態,當異常重新加載會走onCreate方法,通過保存狀態的參數來判斷



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章