編輯:關於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,符合我的需要~~~
記錄。
private TextView tvTime; private EditText inputTv; private Button btnHQ,btnBG,
廣播是一種廣泛運用在應用程序之間傳輸信息的機制,android中的廣播用於監聽系統事件或應用程序事件!android中的廣播包括普通廣播、有序廣播以及異步廣播(粘性廣播)
年末較閒,就上個星期查找各方面的資料關於android截圖事情,自已也測試一些代碼,已改改進或者優化。接下來進行總結一下。其實,如果真正android系統截屏是需要roo
Android是在Android 3.0(API level 11)開始引入Fragment的(為了兼容較低版本的設備使用支持庫類)。可以把Fragment看