一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android中Fragment的基本用法示例總結

Android中Fragment的基本用法示例總結

2022-02-15 17:14loading Android

Fragment是activity的界面中的一部分或一種行為,下面這篇文章主要給大家介紹了關于Android中Fragment的基本用法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

fragment 可認為是一個輕量級的Activity,但不同與Activity,它是要嵌到Activity中來使用的,它用來解決設備屏幕大小的不同,主要是充分利用界面上的空間,如平板上多余的空間。一個Activity可以插入多個Fragment,可以認為Fragment就是Activity上的一個View。

Android中Fragment的基本用法示例總結

本文主要介紹了關于Android中Fragment的基本用法,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

一、fragment管理

在activity動態加載fragment

加載fragment的布局不限,并不局限于FrameLayout

加載方法:(只有導入的fragment是v4包,才有getSupportFragmentManager())

?
1
2
3
4
5
FragmentA fragment = new FragmentA();
 getSupportFragmentManager().beginTransaction()
  .add(R.id.XXX, fragment, "fragment")
//  .addToBackStack("") //加入回退棧
  .commit;

或者

?
1
2
3
4
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fragment_container, fragment, "fragment");
transaction.commit();

但是第二種方法要注意,導包須一致

?
1
2
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

而除了使用add方法,我們也可以使用replace方法添加fragment

?
1
2
3
4
FragmentA fragment = new FragmentA();
getSupportFragmentManager().beginTransaction()
 .replace(R.id.XXX, fragment,"fragment")
 .commit();

add和replace的區別是:

①add 是往container容器里堆加fragment View;replace是將container容器里之前添加的View全部清除,然后再添加當前fragment View

一定要記住,replace清除的是container的視圖,而不是fragment實例, remove移除的才是fragment實例

②add后期可以使用show,hide操作,但是replace不可以,原因見①

③使用add,回滾時,fragment不會重新加載,曾經的操作痕跡還存在,使用replace回滾時,之前的fragment會重新加載,原因見①

使用add的時候還有一點需要注意的是,視圖重疊的問題,記得設置背景色

add 和 replace 千萬不要混合使用,否則會出錯

在進行remove,hide,show之前要記得判斷fragment.isAdded();下面的代碼我就不提示了

移除fragment實例

?
1
2
3
4
Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");
getSupportFragmentManager().beginTransaction()
 .remove(fragment)
 .commit();

隱藏fragment

?
1
2
3
4
Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");
getSupportFragmentManager().beginTransaction()
 .hide(fragment)
 .commit();

顯示fragment

?
1
2
3
4
Fragment fragment = getSupportFragmentManager().findFragmentByTag("fragment");
getSupportFragmentManager().beginTransaction()
 .show(fragment)
 .commit();

拓展:

在fragment里刷新(即從頭加載fragment數據,且不影響后續的回退棧)

?
1
2
3
4
5
Fragment replaceFragment = getActivity().getSupportFragmentManager().findFragmentByTag("first_fragment");
    getActivity().getSupportFragmentManager().beginTransaction()
    .detach(replaceFragment)
    .attach(replaceFragment)
    .commit();

簡單的講,detach是銷毀View,而不是fragment實例,attach是重建視圖View,attach后的視圖會位于視圖最前面,具體的可以自己去查看資料

二、回滾操作

最常用:依次回滾

?
1
2
3
4
5
6
7
8
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() <= 1) { //這里是取出我們返回棧存在Fragment的個數
 finish();
} else { //取出我們返回棧保存的Fragment,這里會從棧頂開始彈棧
 getSupportFragmentManager().popBackStack();
}
}

拓展:指定回滾

?
1
void popBackStack(String name, int flags);

參數string name是transaction.addToBackStack(String tag)中的tag值;

至于int flags有兩個取值:0或FragmentManager.POP_BACK_STACK_INCLUSIVE

      當取值0時,表示除了參數一指定這一層之上的所有層都退出棧,指定的這一層為棧頂層;

      當取值POP_BACK_STACK_INCLUSIVE時,表示連著參數一指定的這一層一起退出棧;

退回棧頂:

?
1
2
3
while (getSupportFragmentManager().getBackStackEntryCount()>1) {
 getSupportFragmentManager().popBackStackImmediate();
}

三、重點來了,在fragment里面加載fragment 顯示問題

1.顯示不出來:

加載fragment的布局不要使用LinearLayout,不要使用LinearLayout,不要使用LinearLayout,重要的事情說三遍,否則很有可能加載的fragment顯示不出來

2.顯示不完全:在onCreateView使用方式一,不要使用方式二

?
1
2
3
4
5
6
7
8
9
@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
 // 方式一
 View view = inflater.inflate(R.layout.XXX, container, false);
  // 方式二
// View view = inflater.inflate(R.layout.XXX, null);
 return view;
 }

3.點擊事件透傳

①如果加載的fragment的布局為ScrollView,不會發生透傳事件

②如果存在透傳事件,在fragment的根布局加上android:clickable="true" ,即可簡單粗暴的解決點擊事件穿透的問題

4.獲取回退棧中fragment的數量

方式一:activity如繼承FragmentActivity,可通過getSupportFragmentManager().getBackStackEntryCount()判斷activity中棧內已存的fragment的數量,不包括通過方式二加載進去的fragment(在fragment中加載子fragment)

方式二:此方式是在fragment中通過getChildFragmentManager().getBackStackEntryCount()判斷此fragment棧內已存的fragment的數量

?
1
2
3
4
getChildFragmentManager().beginTransaction()
 .replace(R.id.XXX, fragment)
 .addToBackStack(null)
 .commit();

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.androidchina.net/8365.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 热久久最新| 175m美女被网友灌醉啪啪玩脚 | 美女下面揉出水免费视频 | 亚洲国产精品一在线观看 | 美女被上漫画 | 国产精品一区二区久久不卡 | 国产123区在线视频观看 | 娜娜啪| 操美女bb| 亚洲男人天堂2023 | 本土自拍 | 国产一级精品高清一级毛片 | 日韩免费视频播播 | 毛片视频网站在线观看 | 超级乱淫伦短篇小说做车 | 亚洲AV久久无码精品九号 | 99资源站| 91免费在线播放 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 青青草成人在线 | 国产一级片在线 | 国自产精品手机在线视频 | 黄a一级 | 95视频免费看片 | α级毛片 | 欧美成人aaaa免费高清 | 国产成人黄网在线免 | 视频在线网站 | 成人福利免费视频 | 国产高清不卡码一区二区三区 | a亚洲视频| 疯狂伦交1一6 小说 风间由美在线 | 99精品在线视频 | 久久99精国产一区二区三区四区 | 亚洲激情偷拍 | 亚洲av欧美在我 | 娇小异类videos | 疯狂刺激的3p国产在线 | 四神集团1涨奶是第几章 | 亚洲国产精品网站久久 | 亚洲嫩模吧粉嫩粉嫩冒白浆 |