android的fragment使用
『壹』 android fragment 刷新功能
本文 介紹兩點 已是fragment的切換 一是fragment刷新
先說第一點 fragment的切換
目前fragment在開發中應用越來越廣泛 當然也非常方便
而我們切換fragment 也有兩中方式
第一種是replace的方法進行的 這種方式要看運用場景 用起來很方便 但是個人感覺效果並不好 因為這種方式進行切換得話 首先他會remove掉當前的fragment,然後在new 一個新的fragment進行add,也就是說當前fragment中的所有東西都是重新載入的 所以個人不建議使用這種方式進行fragment的高頻率切換 這種只適合fragment切換和使用次數比較少的情況
第二種是show+hide 進行fragment切換 這種方式相比第一種可能會復雜一點 首先要建立幾個fragment 開始事務 然後判斷添加 舉個例子
1 創建fragment……
2 添加事務 android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
–#在添加之前先進行判斷隱藏#–
// 這是hide fragment 的方法
onHideFragment(ft);
3 判斷添加
if (homeFragment==null){
homeFragment = new HomeFragment();
ft.add(R.id.content,homeFragment);
}else {
ft.show(homeFragment);
}
4 判斷隱藏
if (homeFragment!=null){
ft.hide(homeFragment);
}
5 添加一個默認顯示fragment 也就是你進入activity需要顯示的那個
好 此時你就完成了使用hide + show 進行fragment切換了
現在我們說第二點 就是fragment的刷新需求
我們可能會需要fragment的刷新功能 例如說是我首頁使用fragment 進行功能切換時 希望返回到之前的fragment可以刷新 或者返回到activity時 fragment也可以刷新 本人使用了 兩種方法進行fragment的刷新 我想大部分應該都會使用第一種 返回activity時 fragment刷新 就是重寫acvitity的onstart() 方法進行刷新fragment的數據 但是這是有弊端的 第一就是假如你使用了listview或者gridview 時會出現重復載入的情況 所以使用這種方法時 你就要進行清空數據並刷新適配器就可以避免了
第二種 就是使用hide+show時 在fragment進行切換時 刷新fragment 此時會有這樣一個這樣的方法 onHiddenChanged(boolean hidden);看方法名 你也可以看出來 就是在hide有變化時使用 hidden參數是boolean 當hidden為true時表示fragment在hide 此時不必更新數據 當hidden為false時 他就不隱藏了 此時更新
if (hidden){
return;
}else {
list.clear();
getSellList();
}
list是要清空的 避免重復載入
–#onHiddenChanged(boolean hidden); 這是fragment的方法哦 !!!#–
本文 到此結束 希望對各位有所幫助 有問題可以評論區提出 大家一起進步
『貳』 Android使用fragment實現底部導航欄切換界面
源碼鏈接
效果圖
創建bottom_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="36dp"
android:layout_height="36dp"
android:id="@+id/bottom_icon"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#565656"
android:textSize="10sp"
android:id="@+id/bottom_text" />
public void setNormalImage(int normalIcon){
this.normalIcon = normalIcon;
ivIcon.setImageResource(normalIcon);
}
public void setFocusedImage(int focusedIcon){
this.focusedIcon = focusedIcon;
}
public void setTvText(String text){
tvText.setText(text);
}
public void setFocused(boolean isFocused){
this.isFocused = isFocused;
if(isFocused){
ivIcon.setImageResource(focusedIcon);
tvText.setTextColor(Color.parseColor("#02b5bc"));
}else{
ivIcon.setImageResource(normalIcon);
tvText.setTextColor(Color.BLACK);
}
}
<FrameLayout
android:id="@+id/frameLayout_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="11"
>
</FrameLayout>
四個如下
<com.example.qiaolulu.qiaofragment.BottomLayout
android:id="@+id/square"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
</com.example.qiaolulu.qiaofragment.BottomLayout>
public class Babyextends Fragment{
@Nullable
@Override
public ViewonCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//載入你設計要顯示的界面
View view = inflater.inflate(R.layout.baby,null);
return view;
}
}
fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction =fragmentManager.beginTransaction();
firstPage =new FirstPage();
transaction.add(R.id.frameLayout_container,firstPage);
transaction.commit();
『叄』 android fragment 怎麼使用
fragment主要是依賴於activity,所以可以在主界面,新建一個framelayout,用來替換fragment的布局,主要是使用framgentmanager來管理切換fragment,網上有很多很好的例子.
『肆』 Android——Fragment
Fragment必須總是被嵌入到一個activity之中,並且fragment的生命周期直接接受其宿主activity的生命周期的影響。你可以認為fragment是activity的一個模塊零件,它有自己的生命周期,接收它自己的輸入的事件,並且可以在activity運行時添加或者刪除。
應該將每一個fragment設計為模塊化和可復用化的activity組件。也就是說,你可以在多個activity中引用同一個fragment,因為fragment定義了它自己的布局,並且使用它本身生命周期回調的行為。
Fragment比Activity多了幾個額外的生命周期回調方法:
管理fragment生命周期與管理activity生命周期很相像,像activity一樣,fragment也有三種狀態:
1、Resumed:
fragment在運行中的activity中可見。
2、Paused:
另一個activity處於前台且得到焦點,但是這個fragment所在的activtiy仍然可見(前台activity部分透明,或者沒有覆蓋全屏)。
3、Stopped:
fragment不可見。要麼宿主activity已經停止,要麼fragment已經從activity上移除,但已被添加到後台棧中。一個停止的fragment仍然活著(所有的狀態和成員信息仍然由系統保留著)。但是,它對於用戶來講已經不再可見,並且如果activity被殺掉,它也將被殺掉。
如果activity的進程被殺掉了,在activity被重新創建時,你恢復fragment狀態。可以執行fragment的onSaveIntanceState()來保存狀態(注意:fragment是在onCreate(),onCreateView()或者onActivityCreate()中進行恢復)。
在生命周期方面,activity和fragment之間一個很重要的不同就是在各自的後台棧中是如何存儲的。當activity停止時,默認情況下activity被安置在由系統管理的activity後台棧中;fragment僅當在一個事務被移除時,通過顯式調用addToBackStack()請求保存的實例,該fragment才被置於由宿主activity管理的後台棧。
類似與Android系統為Activity維護一個任務棧,我們也可以通過Activity維護一個回退棧來保存每次Fragment事務發生的變化。
如果你將Fragment任務添加到回退棧,當用戶點擊後退按鈕時,將看到上一次的保存的Fragment。一旦Fragment完全從後退棧中彈出,用戶再次點擊後退鍵,則退出當前Activity。
通過Arguments創建Fragment,不建議通過為Fragment添加帶參數的構造函數
1、FragmentPagerAdapter:對於不再需要的fragment,選擇調用detach方法,僅銷毀視圖,並不會銷毀fragment實例。
2、FragmentStatePagerAdapter:會銷毀不再需要的fragment,當當前事務提交以後,會徹底的將fragment從當前Activity的FragmentManager中移除。
3、懶載入,核心方法是 setUserVisibleHint()
原因1:橫豎屏切換,造成Fragment重新實例化。
原因2:按下Home鍵,Activity處於後台,由於內存不足被銷毀,重新喚醒時Fragment重新實例化。
註:出現的原因是在 API24 之前的 v4包 的源碼問題,
解決方案:通過檢查onCreate的參數Bundle savedInstanceState就可以判斷,當前是否發生Activity的重新創建:
默認的savedInstanceState會存儲一些數據,只有在savedInstanceState==null時,才進行創建Fragment實例:
『伍』 android 怎麼使用fragment裡面的控制項
一、第一種方法:
(1)Fragment的第一種使用方法是使用fragment載入單獨的布局文件:(也就是xml的方式實現
)activity_main.xml主要是在一個線性布局中添加兩個線性布局
< "http://www.codingke.com" target="_blank"
class="keylink">vcD4KPHA+PHByZSBjbGFzcz0="brush:java;">
right.xml是等會使用fragment的時候,載入的一個布局文件:(由於主要是在界面中載入、所以不作特殊要求)
MyFragment.java就是載入fragment的類,要繼承Fragment類:(要重載父類的下邊三個方法)
二、第二種方法
項目結構和上圖中的差不多:只是在布局文件中,直接使用fragment控制項。
在myfragment.java文件中,只需找到fragment所容納的布局文件即可,不進行業務上的操作。
MainActivity.java文件:進行fragment的業務處理,想了解更多請關注扣丁學堂。
『陸』 Android組件之Fragment(一)---基礎知識與運用
Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大屏幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!想想,如果一個很大的界面,我們 就一個布局,寫起界面來會有多麻煩,而且如果組件多的話是管理起來也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然後進行分組,進行一個模塊化的管理!從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment並不能單獨使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會跟著銷毀!
引用官方的一張圖片,其實已經說明問題了,就是為了更好的適配大屏,在大屏的時候,不需要去在一個activity內部通過復雜的布局和界面去實現,只需要去在一個activity內部,通過多個fragment來做界面布局實現即可,而且針對於多個fragment來說, 每個fragment有單獨的生命周期,
Demo樣例,我們在一個界面中,有上下兩個fragment,如圖所示:
Step 2: Fragment創建,視圖載入,數據賦值
BlankFragment .java
Step 3: Activity在onCreate( )方法中調用setContentView()之後調用FragmentTransaction 進行事務提交
FragmentTestActivity.java
在xml中聲明兩個fragment,指定為具體的fragment
Step 1:定義Fragment的布局,就是fragment顯示內容的
Step 2:自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調用:inflater.inflate()方法載入Fragment的布局文件,接著返回載入的view對象
BlankFragment.java
Step 3:在需要載入Fragment的Activity對應的布局文件中添加fragment的標簽, 記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中調用setContentView()載入布局文件即可!
針對在一個Activity中的某個Layout中切換Fragment,,無非兩種方法:
我們自己看一下方法注釋
源碼方法注釋裡面說的很明白,這個方法會移除所有的fragment,然後添加當前的fragment。
這時分為兩種情況,一種是fragment已有並且在前台展示,一種是未有或者在後台,針對於前者,此時replace,生命周期不會發生變化,針對後者,生命周期會重新走
分為兩種情況,一種fragment已存在,一種未存在,針對於前者,生命周期無變化,但是會回調onHiddenChanged方法,針對於後者,生命周期會創建一次。
1.Fragment是Google官方引入的一個為了適配大屏、多頁面的一個組件。您可以理解為它就是一個類而已,只不過裡麵包含了View,並且與activity的生命周期進行了關聯。
2.動態載入與靜態載入相對來說,建議使用動態載入,靜態載入固定在了xml文件中,永遠不變。
3.replace的fragment如果不在前台,會執行所有生命周期,反之不會執行任何生命周期方法;hide+show生命周期並不會發生變化,但是會回調onHiddenChanged方法,在實際開發中,建議add之後,使用hide+show來操作fragment,一方面減少資源的重復載入和創建,另外一方面提升用戶體驗感。
4.fragment的生命周期大體上和activity一致,但是前期和後期多了一些東西,因為fragment內部有view,那麼這個view需要進行創建、然後添加到activity內部,所以相應的在onCreate與onStart之間就多了幾個方法-onCreateView、onViewCreated。相同的道理,fragment的view與activity解綁,也相應的在onStop與onDestory之間多個方法-onDestroyView。onAttach與onDetach可以理解為視圖與activity產生關聯和接觸關聯,是最開始和最後的步驟。
Demo地址
『柒』 Android Fragment的布局中使用android:onClick 屬性時需要注意的問題
下面是一個在fragment的布局中定義的一個點擊事件
按照常規操作,我們需要在宿主中定義一個名為 onMessageViewClick 的public 方法
這樣看起來沒什麼問題,但是跑起來直接報錯:
在持有fragment的activity中定義改方法即可
1.報錯信息:無法在對應的context中找到名為 onMessageViewClick 的方法(其實這里已經說的很明白了,找不到方法,在view的context中)
那看一下當我們點擊view的時候系統是怎麼尋找對應的方法的:
直接上截圖,下面是view類中的一個內部類
看一下屬性就明白這個類似干什麼的了(膜拜)
mHostView:定義了onClick屬性的view
mMethodName:方法名稱
mResolvedContext:反射對象
mResolvedMethod:反射方法
所以view是通過反射的方式來調用方法的(大家應該不看源碼都知道的),這里的mResolvedContext 是通過View.getContext獲取的
那麼,view的context中為什麼找不到方法呀,我都定義了不是嗎。但是,注意一下,我們定義的方法是在Fragment中,fragment,fragment是context嗎?當然不是,看看fragment class的定義
『捌』 Android回顧--(十七) Fragment的使用與必踩之坑
碎片,抽象的理解就是一個控制項,只是這個控制項內部維護了自身的生命周期。Fragment是依賴於Activity,用於顯示頁面的一部分內容。
這里有的人就會提出疑問了,Android中其他的控制項也能在頁面顯示一部分的內容,為什麼還要引入Fragment?
像控制項一樣,在XML文件裡面聲明控制項 然後控制項就顯示出來了
Fragment中的控制項的事件的處理:
注意:replace()實際是先清除容器裡面的Fragment,調用remove方法,然後再執行添加當前的Fragment,add()方法。如果我們每一次都用replace()的話,那麼會造成一個問題,就是每一次都會先將前一個先刪除,後面一個才能添加上。 造成每一個都需要重新CreatView()那麼這么做的話,如果連續不斷的去切換的話就會造成卡頓現象,為了解決這個問題就引出了一個概念就是Fragment的優化
注意事項:當我們添加進一個Fragment後,然後再向這個container中添加哪個Fragment的話,那麼前一個Fragment沒有被殺掉,只是沒有顯示而已
將當前Fragment的界面顯示至幀布局中
我們一般是在onActivityCreateed()方法中處理一些事務。在使用過程中我們要注意一下幾點、:
使用工廠類
棧的存儲模式:先進後出
Activity也有自己的回退棧
事務:指的是一系列指令的合集,這一系列的指令要麼全部執行,要麼都不執行
這個地方的id是ft.commit()的返回值,不是Fragment得id
『玖』 說說什麼是 Android 的碎片(Fragment)
碎片(Fragment),是一種可以嵌入活動當中的 UI 片段,它能讓程序更加合理和充分地利用大屏幕的空間,因此在平板上應用廣泛。
假設我們正在開發一個新聞應用,其中一個界面使用 RecyclerView 展示一組新聞標題,當點擊了其中一個標題時,就打開了另一個界面用於顯示新聞的詳細內容。
若是在手機中設計,我們可以將新聞標題列表放在一個活動中,而將新聞的詳細內容放在另一個活動中:
這樣的設計方案放在平板上,那麼新聞標題將會被拉長直至填充滿整個平板的屏幕,而新聞的標題一般都不會太長,所以這樣就會導致界面上存在大量的空白區域:
因此,更好的設計方案是將新聞標題列表界面和新聞詳細內容界面分別放在兩個碎片中,然後在同一個活動里引入這兩個碎片,這樣就可以充分利用平板的屏幕空間咯O(∩_∩)O~