Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發中如何實現外部其他Activity類與指定fragment碎片的相互跳轉

Android開發中如何實現外部其他Activity類與指定fragment碎片的相互跳轉

編輯:關於Android編程

先說一下這個問題產生的背景

Activity A中有四個fragment,分別是 a b c d,默認顯示的是fragment a。在開發過程中,fragment d中需要和外部Activity進行跳轉,將這個外部Activity命名為B吧...

我需要從d中跳轉到B中,完成一些設置,然後再從B中的返回按鈕回到d。但是使用startActivity()方法的結果是:可以實現從d到B的跳轉,但是從B跳到d出現了問題。

網上搜索了一下相關問題的解決方案(博文)

方案一:

要考慮fragment的復用,必須要降低fragment和activity之間的耦合,就是說fragment不應該直接影響到其他的fragment,也不應該直接和其他的外部activity進行聯系。fragment所在的activity應當起到一個中間橋梁的作用,負責和外部的activity聯系。這位博主給出了兩種解決方法。下面是他的代碼

FragmentOne

package com.zhy.zhy_fragments;

import android.app.Fragment;
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;

public class FragmentOne extends Fragment implements OnClickListener
{
	private Button mBtn;

	/**
	 * 設置按鈕點擊的回調
	 * @author zhy
	 *
	 */
	public interface FOneBtnClickListener
	{
		void onFOneBtnClick();
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState)
	{
		View view = inflater.inflate(R.layout.fragment_one, container, false);
		mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);
		mBtn.setOnClickListener(this);
		return view;
	}

	/**
	 * 交給宿主Activity處理,如果它希望處理
	 */
	@Override
	public void onClick(View v)
	{
		if (getActivity() instanceof FOneBtnClickListener)
		{
			((FOneBtnClickListener) getActivity()).onFOneBtnClick();
		}
	}

}
FragmentTwo

package com.zhy.zhy_fragments;

import android.app.Fragment;
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;

public class FragmentTwo extends Fragment implements OnClickListener
{

	
	private Button mBtn ;
	
	private FTwoBtnClickListener fTwoBtnClickListener ;
	
	public interface FTwoBtnClickListener
	{
		void onFTwoBtnClick();
	}
	//設置回調接口
	public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener)
	{
		this.fTwoBtnClickListener = fTwoBtnClickListener;
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState)
	{
		View view = inflater.inflate(R.layout.fragment_two, container, false);
		mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);
		mBtn.setOnClickListener(this);
		return view ; 
	}
	@Override
	public void onClick(View v)
	{
		if(fTwoBtnClickListener != null)
		{
			fTwoBtnClickListener.onFTwoBtnClick();
		}
	}

}
下面是Activity的

package com.zhy.zhy_fragments;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Window;

import com.zhy.zhy_fragments.FragmentOne.FOneBtnClickListener;
import com.zhy.zhy_fragments.FragmentTwo.FTwoBtnClickListener;

public class MainActivity extends Activity implements FOneBtnClickListener,
		FTwoBtnClickListener
{

	private FragmentOne mFOne;
	private FragmentTwo mFTwo;
	private FragmentThree mFThree;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);

		mFOne = new FragmentOne();
		FragmentManager fm = getFragmentManager();
		FragmentTransaction tx = fm.beginTransaction();
		tx.add(R.id.id_content, mFOne, "ONE");
		tx.commit();
	}

	/**
	 * FragmentOne 按鈕點擊時的回調
	 */
	@Override
	public void onFOneBtnClick()
	{

		if (mFTwo == null)
		{
			mFTwo = new FragmentTwo();
			mFTwo.setfTwoBtnClickListener(this);
		}
		FragmentManager fm = getFragmentManager();
		FragmentTransaction tx = fm.beginTransaction();
		tx.replace(R.id.id_content, mFTwo, "TWO");
		tx.addToBackStack(null);
		tx.commit();
	}

	/**
	 * FragmentTwo 按鈕點擊時的回調
	 */
	@Override
	public void onFTwoBtnClick()
	{
		if (mFThree == null)
		{
			mFThree = new FragmentThree();

		}
		FragmentManager fm = getFragmentManager();
		FragmentTransaction tx = fm.beginTransaction();
		tx.hide(mFTwo);
		tx.add(R.id.id_content, mFThree, "THREE");
		// tx.replace(R.id.id_content, fThree, "THREE");
		tx.addToBackStack(null);
		tx.commit();
	}

}
附上原文鏈接

方案一的做法我覺得是最清晰的,但是不適合我現在做的項目,因為我負責的模塊不包括我寫的fragment所在的activity,我不能修改那個activity...所以這個方案被pass


方案二:

和方案一類似,利用intent附加參數的方式,在fragment所在的activity中判斷一下intent的附加參數,從而設置顯示哪個fragment,這個比方案一要簡單明了一些。大概思路如下

你可以在你startactivity的地方,對intent加入一個參數,例如,intert.putExtra("fragid",1);然後再你的fragment的主activity中的oncreate或者Onresume函數中獲得這個id,例如int id = intert.getIntegerExtra("fragid",-1);然後根據這個id跳轉即可

if(id > 0) {

if(id == 目標id) myfragment.setvisible(true);

}

用類似方法即可

比較簡單,但是也不適用我的情況,理由同方案一。


方案三:

我查了一下Fragment和Acitvity的生命周期,沒啥頭緒。突然看到了startActivityForResult()這個方法,結合其他的關鍵字一搜索,還真找到了相關的東西,下面是原文。

最近在一個項目中,遇到了一種情況,即fragment中在開啟一個新的activity的時候調用startactivityResult()。我們都知道在執行完那個新創建的activity後,會回來執行fragment或fragment所在的activity的onResultActivity()函數。但是究竟執行誰的呢?或者先執行誰?

首先應該明確的是在fragment中,也是可以定義onResultActivity()函數。我們先來重新定義一下這個場景。activity A創建了fragment B,在fragment B中用startactivityResult()函數跳轉到activity C。

首先,肯定不會執行activity C中的onResultActivity()函數。

其次,首先肯定會去執行activity A中的onResultActivity()函數,不管你在fragment B中是用的getactivity().onResultActivity(),還是直接使用onResultActivity()。

而且,如果你重寫了activity A的onActivityResult方法
而沒有super.onActiivtyResult(),那麼你在fragment B裡的onActivityResult不會被調用。因為super.onActiivtyResult()裡面會去找當前activity A中的fragment,並去調用fragment 的onActiivtyResult。

這個方案只需要修改我的fragment d和跳轉的Activity B,不需要修改Activity A,符合我的需要~~~


記錄。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved