當前位置:首頁 » 安卓系統 » android保存fragment

android保存fragment

發布時間: 2022-08-11 06:55:23

⑴ android的Fragment切換時如何保存狀態

transaction.replace返回之後。重新創建。想保存數據以便重新創建,最好把要保存的數據放入到onSaveInstanceState方法里去,這個是重載fragment的方法。這個不僅適用於返回重建屏幕,也適用於屏幕旋轉重建屏幕。
transaction.add返回之後,原來的fragment原封不動。

⑵ android fragment和activity的區別

Fragment是到Android3.0+ 以後,Android新增了Fragments,在沒有 Fragment 之前,一個屏幕只能放一個 Activity。這是一個起源時間大家要知道是什麼時候開始引入的。
.Activity 代表了一個屏幕的主體,而Fragment可以作為Activity的一個組成元素。
一個Activity可以有若干個(0或n)Fragment構成。你可以把Fragment想像成Activity中的一個控制項,只不過相對於一般控制項,Fragment與Activity聯系更為緊密,隨著Activity的生命周期變化,Fragment也隨之相應不同的生命周期函數。
Fragment 從功能上講相當於一個子活動(Activity),它可以讓多個活動放到同一個屏幕上,也就是對用戶界面和功能的重用,因為對於大屏設備來說,純粹的 Activity 有些力不從心。
Fragment 像是一個子活動,但是 Fragment 不是 Activity 的擴展,因為 Fragment 擴展自 android.app 中的 Object,而 Activity 是 Context 的子類。Fragment 有自己的視圖層級結構,有自己的活動周期,還可以像活動一樣響應後退按鈕,Fragment 還有一個用作其初始化參數的包(Bundle),類似 Activity,Fragment 也可由系統自動保存並在以後還原。當系統還原 Fragment 時,它調用默認的構造函數(沒有參數),然後將此Bundle還原到新創建的 Fragment 中,所以無論新建還是還原 Fragment,都要經過兩個步驟:(1)調用默認構造函數(2)傳入新的或者保存起來的Bundle。
一個Activity可以運行多個 Fragment,Fragment 切換時,由 FragmentTransaction 執行,切換時,上一個 Fragment 可以保存在後退棧中(Back Stack),這里的後退棧由 FragmentManager 來管理,注意 Fragment 和 Activity 的後退棧是有區別的:Activity 的後退棧由系統管理,而 Fragment 的後退棧由所在的Activity 管理。
Fragment不能脫離Activity而存在,只有Activity才能作為接收intent的載體。其實兩者基本上是載體和組成元素的關系。
Fragment用來描述一些行為或一部分用戶界面在一個Activity中,你可以合並多個fragment在一個單獨的activity中建立多個UI面板,同時重用fragment在多個activity中.你可以認為fragment作為一個activity中的一節模塊,fragment有自己的生命周期,接收自己的輸入事件,你可以添加或移除從運行中的activity.一個fragment必須總是嵌入在一個activity中,同時fragment的生命周期受activity而影響,舉個例子吧,當activity暫停,那麼所有在這個activity的fragments將被destroy釋放。然而當一個activity在運行比如resume時,你可以單獨的操控每個fragment,比如添加或刪除。不過因為Fragment和Activity的生命周期都比較復雜,我們分別對比下:創建一個fragment你必須創建一個Fragment的子類或存在的子類,比如類似下面的代碼
public static class AndroidFragment extends Fragment{
@Override
public View onCreateView(LayoutInflaterinflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.android_fragment,container, false);
}
}

Fragment類的一些代碼看起來有些像Activity為了讓大家了解清楚,Android開發網給大家整理下 Fragment的生命周期大家可以參考一下網上關於生命周期的介紹 http://www.cnblogs.com/purediy/p/3276545.html,部分類似Activity的,我們詳細解釋
onCreate()
當fragment創建時被調用,你應該初始化一些實用的組件,比如在fragment暫停或停止時需要恢復的
onCreateView()
當系統調用fragment在首次繪制用戶界面時,如果畫一個UI在你的fragment你必須返回一個View當然了你可以返回null代表這個fragment沒有UI.
那麼如何添加一個Fragment到Activity中呢? Activity的布局可以這樣寫
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="com.android.cwj.ArticleListFragment"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.android.cwj.ArticleReaderFragment"
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>

⑶ 在Android開發中fragment有什麼優缺點

自從Android 3.0中引入fragments 的概念,根據詞海的翻譯可以譯為:碎片、片段。其目的是為了解決不同屏幕分辯率的動態和靈活UI設計。大屏幕如平板小屏幕如手機,平板電腦的設計使得其有更多的空間來放更多的UI組件,而多出來的空間存放UI使其會產生更多的交互,從而誕生了fragments 。
fragments 的設計不需要你來親自管理view hierarchy 的復雜變化,通過將Activity 的布局分散到frament 中,可以在運行時修改activity 的外觀,並且由activity 管理的back stack 中保存些變化。當一個片段指定了自身的布局時,它能和其他片段配置成不同的組合,在活動中為不同的屏幕尺寸修改布局配置(小屏幕可能每次顯示一個片段,而大屏幕則可以顯示兩個或更多)。
Fragment必須被寫成可重用的模塊。因為fragment有自己的layout,自己進行事件響應,擁有自己的生命周期和行為,所以你可以在多個activity中包含同一個Fragment的不同實例。這對於讓你的界面在不同的屏幕尺寸下都能給用戶完美的體驗尤其重要。

Fragment優點
Fragment可以使你能夠將activity分離成多個可重用的組件,每個都有它自己的生命周期和UI。
Fragment可以輕松得創建動態靈活的UI設計,可以適應於不同的屏幕尺寸。從手機到平板電腦。
Fragment是一個獨立的模塊,緊緊地與activity綁定在一起。可以運行中動態地移除、加入、交換等。
Fragment提供一個新的方式讓你在不同的安卓設備上統一你的UI。
Fragment 解決Activity間的切換不流暢,輕量切換。
Fragment 替代TabActivity做導航,性能更好。
Fragment 在4.2.版本中新增嵌套fragment使用方法,能夠生成更好的界面效果。
Fragment做局部內容更新更方便,原來為了到達這一點要把多個布局放到一個activity裡面,現在可以用多Fragment來代替,只有在需要的時候才載入Fragment,提高性能。
可以從startActivityForResult中接收到返回結果,但是View不能。

Fragment的生命周期
你可以把fragment看作是activity的模塊化組件,它擁有自己的生命周期

Fragment是activity的界面中的一部分或一種行為。你可以把多個Fragment們組合到一個activity中來創建一個多面界面並且你可以在多個activity中重用一個Fragment。你可以把Fragment認為模塊化的一段activity,它具有自己的生命周期,接收它自己的事件,並可以在activity運行時被添加或刪除。
Fragment不能獨立存在,它必須嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影響。例如:當activity暫停時,它擁有的所有的Fragment們都暫停了,當activity銷毀時,它擁有的所有Fragment們都被銷毀。然而,當activity運行時(在onResume()之後,onPause()之前),你可以單獨地操作每個Fragment,比如添加或刪除它們。當你在執行上述針對Fragment的事務時,你可以將事務添加到一個棧中,這個棧被activity管理,棧中的每一條都是一個Fragment的一次事務。有了這個棧,就可以反向執行Fragment的事務,這樣就可以在Fragment級支持「返回」鍵(向後導航)。

顯示Fragment時(跟用戶交互)要調用的核心的生命周期方法如下:
1. 把Fragment對象跟Activity關聯時,調用onAttach(Activity)方法;
2. Fragment對象的初始創建時,調用onCreate(Bundle)方法;
3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用於創建和返回跟Fragment關聯的View對象;
4. onActivityCreate(Bundle)方法會告訴Fragment對象,它所依附的Activity對象已經完成了Activity.onCreate()方法的執行;
5. onStart()方法會讓Fragment對象顯示給用戶(在包含該Fragment對象的Activity被啟動後);
6. onResume()會讓Fragment對象跟用戶交互(在包含該Fragment對象的Activity被啟恢復後)。

Fragment對象不再使用時,要反向回調的方法:
1. 因為Fragment對象所依附的Activity對象被掛起,或者在Activity中正在執行一個修改Fragment對象的操作,而導致Fragment對象不再跟用戶交互時,系統會調用Fragment對象的onPause()方法;
2. 因為Fragment對象所依附的Activity對象被終止,或者再Activity中正在執行一個修改Fragment對象的操作,而導致Fragment對象不再顯示給用戶時,系統會調用Fragment對象的onStop()方法。
3. onDestroyView()方法用於清除跟Fragment中的View對象關聯的資源;
4. Fragment對象的狀態被最終清理完成之後,要調用onDestroy()方法;
5. 在Fragment對象不再跟它依附的Activity關聯的時候,onDetach()方法會立即被調用

⑷ 當Android旋轉屏幕導致橫豎屏切換時,如何保存當前Fragment的實例

總結了以下幾種情況:

  • 設備旋轉時保存Activity的交互狀態: onSaveInstanceState();

  • 設備旋轉時保存Fragment的交互狀態: setRetainInstance(true);

  • 設備旋轉時保存WebView的數據:

  • android:configChanges="keyboardHidden|orientation|screenSize";

  • 設備旋轉時保存在自定義View中繪制的圖形。

如果Fragment不包含WebView,只是簡單的UI View,像是TextView, Button, CheckBox, ImageView... 不建議使用setRetainInstance方法,只需要記住當前fragment的index,然後在設備旋轉後根據數據重新實例化一個fragment。因為不包含大量數據,旋轉的過程中幾乎可以用「無縫切換」來形容。
如果包含WebView還是採用針對WebView的方法(題主的情況)。所以要看情況而定。

⑸ 關於Android Fragment的問題

1、概述
首先我們簡單回顧一下,相信大家對Fragment的都不陌生,對於Fragment的使用,一方面Activity需要在布局中為Fragment安排位置,另一方面需要管理好Fragment的生命周期。Activity中有個FragmentManager,其內部維護fragment隊列,以及fragment事務的回退棧。
一般情況下,我們在Activity裡面會這么添加Fragment:
[java] view plain 在CODE上查看代碼片派生到我的代碼片
public class MainActivity extends FragmentActivity
{

private ContentFragment mContentFragment ;

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

FragmentManager fm = getSupportFragmentManager();
mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container);

if(mContentFragment == null )
{
mContentFragment = new ContentFragment();
fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();
}

}

}

針對上面代碼,問兩個問題:
1、為什麼需要判null呢?
主要是因為,當Activity因為配置發生改變(屏幕旋轉)或者內存不足被系統殺死,造成重新創建時,我們的fragment會被保存下來,但是會創建新的FragmentManager,新的FragmentManager會首先會去獲取保存下來的fragment隊列,重建fragment隊列,從而恢復之前的狀態。
2、add(R.id.id_fragment_container,mContentFragment)中的布局的id有何作用?
一方面呢,是告知FragmentManager,此fragment的位置;另一方面是此fragment的唯一標識;就像我們上面通過fm.findFragmentById(R.id.id_fragment_container)查找~~
好了,簡單回顧了一下基本用法,具體的還請參考上面的博客或者其他資料,接下來,介紹一些使用的意見~~

2、Fragment Arguments
下面描述一個簡單的場景,比如我們某個按鈕觸發Activity跳轉,需要通過Intent傳遞參數到目標Activity的Fragment中,那麼此Fragment如何獲取當前的Intent的值呢?
有哥們會說,這個簡單?看我的代碼(問題代碼):
[java] view plain 在CODE上查看代碼片派生到我的代碼片
public class ContentFragment extends Fragment
{

private String mArgument ;
public static final String ARGUMENT ="argument";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);

}

我們直接在Fragment的onCreate中,拿到宿主Activty,宿主Activity中肯定能通過getIntent拿到Intent,然後通過get方法,隨意拿參數~~
這么寫,功能上是實現了,但是呢?存在一個大問題:我們用Fragment的一個很大的原因,就是為了復用。你這么寫,相當於這個Fragment已經完全和當前這個宿主Activity綁定了,復用直接廢了~~~所以呢?我們換種方式,推薦使用arguments來創建Fragment。
[java] view plain 在CODE上查看代碼片派生到我的代碼片
public class ContentFragment extends Fragment
{

private String mArgument;
public static final String ARGUMENT = "argument";

@Override
public void onCreate(Bun www.hbbz08.com dle savedInstanceState)
{
super.onCreate(savedInstanceState);
// mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);
Bundle bundle = getArguments();
if (bundle != null)
mArgument = bundle.getString(ARGUMENT);

}

/**
* 傳入需要的參數,設置給arguments
* @param argument
* @return
*/
public static ContentFragment newInstance(String argument)
{
Bundle bundle = new Bundle();
bundle.putString(ARGUMENT, argument);
ContentFragment contentFragment = new ContentFragment();
contentFragment.setArguments(bundle);
return contentFragment;
}

給Fragment添加newInstance方法,將需要的參數傳入,設置到bundle中,然後setArguments(bundle),最後在onCreate中進行獲取;
這樣就完成了Fragment和Activity間的解耦。當然了這里需要注意:
setArguments方法必須在fragment創建以後,添加給Activity前完成。千萬不要,首先調用了add,然後設置arguments。

⑹ android的Fragment切換時我用的是replace方法 如何保存狀態,避免重復調用onCreateView()

replace是先move再add,應該保存不了。

⑺ Android:我用RadioGroup在下方做導航欄指向不同的Fragment。我想在切換Fragment時能保存狀態,怎麼辦

在onCreate 方法中先把第一個fragment先裝進去,

後面每次點相應的RadioButton就用transaction.replace方法來裝另一個fragment,具體代碼如下:

public class MainActivity extends Activity {

private FragmentTransaction transaction;

//這是三個fragment
private Homefragment mHomeFragment;
private Mintaofragment mMinTaoFragment;
private Servicefragment mServicefragment;
private RadioGroup mMainRadioGroup;

public View mMainView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
mMainView = new View(this);

transaction = getFragmentManager().beginTransaction();
mHomeFragment = new Homefragment();
transaction.add(android.R.id.tabcontent, mHomeFragment);
transaction.commit();
mMainRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);
mMainRadioGroup.setOnCheckedChangeListener(checkedChangeListener);
}

private OnCheckedChangeListener checkedChangeListener = new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {

case R.id.radio_home:
if (null == mHomeFragment) {
mHomeFragment = new Homefragment();
}
replaceFragment(mHomeFragment);
break;

case R.id.radio_mintao:

if (null == mMinTaoFragment) {
mMinTaoFragment = new Mintaofragment();
}
replaceFragment(mMinTaoFragment);
break;

case R.id.radio_service:
if (null == mServicefragment) {
mServicefragment = new Servicefragment();
}
replaceFragment(mServicefragment);
break;

default:
break;
}
}
};

public void replaceFragment(Fragment fragment) {
transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.tabcontent, fragment);
// Commit the transaction
transaction.commit();
}

}

⑻ 求大神替我想想android fragment如何保存切換狀態!!

如果你用的Fragment嵌套的是ViewPager的話就簡單點,直接mViewpager.setOffscreenPageLimit(4);//裡面額參數幾時你要緩存頁面的個數 建議不要設置太大啊。

熱點內容
全局變數存儲類別 發布:2025-01-18 06:39:29 瀏覽:423
蘋果平板的王者號如何轉移到安卓 發布:2025-01-18 06:37:11 瀏覽:611
圖片訪問量 發布:2025-01-18 06:36:34 瀏覽:497
數據結構與演算法下載 發布:2025-01-18 06:36:32 瀏覽:314
如何租ip伺服器 發布:2025-01-18 06:29:07 瀏覽:117
sql周的第一天 發布:2025-01-18 06:29:05 瀏覽:887
安卓軟體如何看本地視頻 發布:2025-01-18 06:28:24 瀏覽:927
安卓手機如何更換路由器管理員 發布:2025-01-18 05:53:45 瀏覽:615
Js腳本題目收錄 發布:2025-01-18 05:53:35 瀏覽:737
阿里雲伺服器如何使用教程 發布:2025-01-18 05:50:50 瀏覽:853