日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

碎片Fragment

發布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 碎片Fragment 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://developer.android.google.cn/guide/components/fragments.html

一、什么是Fragment

Fragment(碎片)就是小型的Activity,它是在Android3.0時出現的。Fragment是表現Activity中UI的一個行為或者一部分。

可以把fragment想象成activity的一個模塊化區域,有它自己的生命周期,接收屬于它自己的輸入事件,并且可以在activity運行期間添加和刪除(有點像一個可以在不同的activity中重用的“子Activity”)。
Fragment必須被嵌入到一個activity中。它們的生命周期直接受其宿主activity的生命周期影響。當一個activity正在運行時,就可以獨立地操作每一個Fragment,比如添加或刪除它們。

Fragment可以定義自己的布局、生命周期回調方法,因此可以將fragment重用到多個activity中,因此可以根據不同的屏幕尺寸或者使用場合改變fragment組合。

二、如何創建一個Fragment

1、為Fragment定義一個布局
2、定義類繼承Fragment
3、重寫類中的onCreateView()方法,返回一個View對象作為當前Fragm
ent的布局。

fragment第一次繪制它的用戶界面的時候,系統會調用onCreateView()方法。為了繪制fragment的UI,此方法必須返回一個作為fragment布局的根的view。如果fragment不提供UI,可以返回null。

/*** 定義類繼承Fragment*/public class TitleFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {//使用打氣筒填充生成一個View對象,fragment_title是一個布局的根節點View view = inflater.inflate(R.layout.fragment_title, null);return view;}}

三、如何將Fragment添加到Activity

Activity必須在清單文件中進行聲明,但是Fragment不需要,Fragment只需要在Activity的布局文件中聲明就可以了。

<fragment android:id="@+id/fmt_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:name="com.itheima.fragment.TitleFragment" />

注意:代碼中的四個屬性是必須的要給的,“android:name”屬性:指定了在layout中實例化的Fragment類是哪個。當系統創建這個activity
layout時,它實例化每一個在layout中指定的Fragment,并調用它們的onCreateView()方法,來獲取每一個Fragment的layout,系統將從Fragment返回的View直接插入到<fragment>元素所在的地方每一個fragment都需要一個唯一的標識,如果activity重啟,系統可以用來恢
復Fragment,并且可以用id來捕獲Fragment來處理事務,例如移除它。
有3種方法來為一個fragment提供一個ID,具體如下所示:

  • 為android:id屬性提供一個唯一ID;
  • 為android:tag屬性提供一個唯一字符串;
  • 如果以上2個你都沒有提供,系統將使用容器view的ID;

四、如何切換Fragment

要在activity中管理Fragment,需要使用FragmentManager可以通過調用activity的getFragmentManager()取得它的實例。
案例:點擊不同的按鈕切換到不同的Fragment進行顯示。具體實現步驟:
1、設置布局文件:添加三個按鈕用于切換Fragment,并在按鈕下方
添加一個FrameLayout用來替換成響應的Fragment。
2、創建三個Fragment,SportsFragment、NewsFragment、GameFragment。

public class SportsFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// 使用打氣筒生成一個View對象View view = inflater.inflate(R.layout.fragment_sports, null);return view;}}

其余兩個Fragment跟SportsFragment代碼一致,只是布局文件不同。
3、添加切換Fragment的邏輯,這個是新聞頻道按鈕的點擊事件

public void news(View view){//獲取Fragment管理器對象FragmentManager manager = getFragmentManager();//開啟事務FragmentTransaction transaction = manager.beginTransaction();//將FrameLayout控件替換成Fragment對象transaction.replace(R.id.frame, new NewsFragment());//提交事務transaction.commit();}

sports()方法、games()方法同上,因此不再給出代碼清單。
4、運行程序,效果如下
Fragment的生命周期
Fragment的生命周期和activity生命周期很像,其生命周期方法如下所示。

  • onAttach:綁定到activity
  • onCreate:創建fragment
  • onCreateView: 創建fragment的布局
  • onActivityCreated: activity創建完成后
  • onStart: 可見, 不可交互
  • onResume: 可見, 可交互
  • onPause: 部分可見, 不可交互
  • onStop:不可見
  • onDestroyView: 銷毀fragment的view對象
  • onDestroy: fragment銷毀了
  • onDetach: 從activity解綁了

五、Fragment的向下兼容

Fragment是在Android3.0才推出的,若想在3.0的低版本下使用Fragment,則需要執行下面2步:
1、把所有Fragment和FragmentManager改成support-v4包下的類
2、把Activity的繼承改為FragmentActivity(support-v4包下的)

六、Fragment之間的通信案例

案例:創建一個用于顯示選項卡的Fragment和一個用于顯示內容的Fragment,當選項卡切換時,使內容的Fragment信息跟著一起切換。具體實現步驟如下所示:
1、先創建選項卡Fragment和內容Fragment,并在activity_main.xml布
局文件中進行設置,其布局效果如下:
2、為選項卡Fragment創建布局文件,其布局效果如下:
3、添加內容區域Fragment的代碼邏輯

public class ContentFragment extends Fragment {private TextView tv_title;//標題private ImageView iv_pic;//內容@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroupcontainer, Bundle savedInstanceState) {//使用打氣筒填充布局View view = inflater.inflate(R.layout.fragment_content, null);//獲取布局中的控件tv_title = (TextView)view.findViewById(R.id.tv_title);iv_pic = (ImageView) view.findViewById(R.id.iv_pic);return view;}//定義一個方法,用于改變標題和圖片public void setTitleAndImage(String title, int picId) {tv_title.setText(title);iv_pic.setImageResource(picId);}}

4、添加選項卡區域Fragment的代碼邏輯

public class TabFragment extends Fragment implements OnItemClickListener {private String[] datas;private int[] picIds;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroupcontainer, Bundle savedInstanceState) {//直接使用ListView作為布局,因此不需要布局文件ListView listView = new ListView(getActivity());//定義一些常量數據作為冊數數據datas = new String[]{"新聞", "體育", "財經", "社會", "娛樂", "國際"};picIds = new int[]{R.drawable.a0, R.drawable.a1, R.drawable.a2, R.drawable.a3, R.d rawable.a4, R.drawable.a5};//設置點擊事件listView.setOnItemClickListener(this);//聲明一個ArrayAdapter對象ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_expandable_list_item_1, datas);//給ListView設置AdapterlistView.setAdapter(adapter);//返回視圖return listView;}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//獲取當前的title和圖片idString title = datas[position];int picId = picIds[position];//獲取Fragment管理器FragmentManager manager = getFragmentManager();//通過ID選擇出ContentFragment對象ContentFragment fragment = (ContentFragment) manager.findFragmentById(R.id.fragment_content);//調用ContentFragment的方法,給ContentFragment傳遞參數,實現不同Fragment直接的通信fragment.setTitleAndImage(title, picId);}}

Fragment與Activity如何交互?

這里我不再詳細介紹那寫比較常規的方式,例如靜態變量,靜態方法,持
久化,application全局變量,收發廣播等等。
首先我們來介紹使用Handler來實現Fragment與Activity
的交互。第一步,我們需要在Activity中定義一個方法用來設置Handler對象。
public void setHandler(Handler handler) {
mHandler = handler;
}
第二步,在Fragment中的回調函數onAttach()中得到Fragment所在Activity,并調用setHandler方法,設置Handler。該Handler在Fragment中定義,用來接收消息與Fragment進行交互。

@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mActivity = (MainActivity) activity;mActivity.setHandler(mHandler);}public Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:text.setText((String) msg.obj);break;}};};

然后我們可以在Activity中發送消息給Fragment中的Hanlder進行交互。

public void inter(View view) { Message msg = new Message(); msg.obj = edit.getText().toString(); msg.what = 1; mHandler.sendMessage(msg); }

Fragment回退棧實現

public class MainActivity extends FragmentActivity implements OnClickListener {private FragmentA fragmentA;private FragmentB fragmentB;private FragmentC fragmentC;private List<Fragment> fragmentsList = new ArrayList<Fragment>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnA).setOnClickListener(this);findViewById(R.id.btnB).setOnClickListener(this);findViewById(R.id.btnC).setOnClickListener(this);fragmentA = new FragmentA();fragmentB = new FragmentB();fragmentC = new FragmentC();//將三個Fragment添加到幀布局中/** 1. 獲取FragmentManger*/FragmentManager fragmentManager = getSupportFragmentManager();/** 2. 通過FragmentManager獲取到事務管理器*/FragmentTransaction transaction = fragmentManager.beginTransaction();/** 3. 將Fragment添加到幀布局中*/transaction.add(R.id.fl, fragmentA, "FragmentA").add(R.id.fl, fragmentB,"FragmentB").add(R.id.fl, fragmentC,"FragmentC").hide(fragmentB).hide(fragmentC).commit();addToBackStack(fragmentA);}private void addToBackStack(Fragment fragment) {if (fragmentsList.contains(fragment)) {//先將老的對象移除fragmentsList.remove(fragment);//將Fragment添加到集合的最后fragmentsList.add(fragment);}else {fragmentsList.add(fragment);}}@Overridepublic void onBackPressed() { // super.onBackPressed();if (fragmentsList.size()>1) {//移除最頂端的FragmentfragmentsList.remove(fragmentsList.size()-1);//將下一個Fragment給顯示出來showFragment(fragmentsList.get(fragmentsList.size()-1));}else {//如果當前棧中沒有Fragment或者只有一個Fragment,直接退出Activityfinish();}}private void showFragment(Fragment fragment) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.hide(fragmentA).hide(fragmentB).hide(fragmentC).show(fragment).commit();}@Overridepublic void onClick(View v) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.hide(fragmentA).hide(fragmentB).hide(fragmentC);switch (v.getId()) {case R.id.btnA:transaction.show(fragmentA);addToBackStack(fragmentA);break;case R.id.btnB:transaction.show(fragmentB);addToBackStack(fragmentB);break;case R.id.btnC:transaction.show(fragmentC);addToBackStack(fragmentC);break;default:break;}//把當前事務添加到會退棧中 // transaction.addToBackStack(null);transaction.commit();}}

總結

以上是生活随笔為你收集整理的碎片Fragment的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91在线精品秘密一区二区 | 在线观看日韩av电影 | 狠狠操天天射 | 久久综合国产精品 | 国产精品免费一区二区三区都可以 | 国产精选第一页 | av男人的天堂在线观看 | 韩国美女一区二区 | 无码精品国产一区二区三区 | 永久免费黄色片 | 免费特级黄色片 | 国产精品69久久久久孕妇欧美 | 精品无码久久久久久久 | 五月深爱 | 国产久久精品 | 国产精品日韩精品 | 黄色日韩视频 | 国产午夜一级一片免费播放 | 国语对白一区二区三区 | 色网址在线观看 | 最新国产黄色网址 | 色丁香久久| 加勒比一区在线 | 国产a国产片 | 欧美激情日韩 | 大奶一区 | 黄91在线观看| 久久蜜桃av一区二区天堂 | 欧美a级片视频 | 国产视频一区二区不卡 | 视频一区二区三 | av视 | 538国产视频 | 在线一区二区三区四区五区 | 欧美另类在线播放 | 日韩精品一区二区三区无码专区 | 午夜亚洲aⅴ无码高潮片苍井空 | 国产一区二区欧美日韩 | 无码国产色欲xxxx视频 | 日韩亚洲精品在线 | 怡春院一区二区 | 亚洲品质自拍 | 亚洲av永久无码精品一区二区国产 | 亚洲精品视频一区二区三区 | 一级黄色性视频 | 国产欧美日韩久久 | 免费在线观看黄色网址 | 国产av无码专区亚洲av毛片搜 | 国产肥熟 | 91精品国产成人www | 蜜桃av在线播放 | 老熟妻内射精品一区 | 在线精品自拍 | 自拍偷拍激情视频 | 青青草成人在线 | 国产视频资源 | 韩国三级一区 | 国产精品久久亚洲7777 | 男女午夜视频在线观看 | 九九热免费精品视频 | av在线男人天堂 | 亚洲天堂日韩在线 | 五月婷婷激情综合 | 美女在线不卡 | 国产成人专区 | 久久11 | 在线免费黄色网址 | 国产在线日本 | 亚洲精品男人天堂 | 免费人成视频在线播放 | 国产最爽的乱淫视频国语对白 | 亚洲精品国产成人 | 黑丝美女一区二区 | 日本免费a视频 | 九九九九九热 | wwwxx日本| 欧美性猛交xx乱大交 | 寻找身体恐怖电影免费播放 | 中出一区| 国产精品一区二 | 国产日韩欧美精品一区 | av一二三四| 黄色av一区二区 | 深爱激情综合 | 久久国产网站 | 一本一道久久综合狠狠老精东影业 | 99视频99 | 国产一级免费在线观看 | 中文字幕亚洲无线码在线一区 | 日韩av在线看免费观看 | av不卡高清 | a级大片免费看 | 在线精品一区二区三区 | 黄视频国产 | 日韩精品卡通动漫网站 | 久久视频中文字幕 | 免费看a级黄色片 | 欧美日韩视频 | 日韩激情啪啪 |