使用Fragment來(lái)處理Andoird app的UI布局的實(shí)例分享
Fragment 的出現(xiàn)一方面是為了緩解 Activity 任務(wù)過(guò)重的問(wèn)題,另一方面是為了處理在不同屏幕上 UI 組件的布局問(wèn)題,而且它還提供了一些新的特性(例如 Retainable)來(lái)處理一些在 Activity 中比較棘手的問(wèn)題。Fragment 擁有和 Activity 一致的生命周期,它和 Activity 一樣被定義為 Controller 層的類(lèi)。有過(guò)中大型項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)者,應(yīng)該都會(huì)遇到過(guò) Activity 過(guò)于臃腫的情況,而 Fragment 的出現(xiàn)就是為了緩解這一狀況,可以說(shuō) 它將屏幕分解為多個(gè)「Fragment(碎片)」(這句話很重要),但它又不同于 View,它干的實(shí)質(zhì)上就是 Activity 的事情,負(fù)責(zé)控制 View 以及它們之間的邏輯。將屏幕碎片化為多個(gè) Fragment 后,其實(shí) Activity 只需要花精力去管理當(dāng)前屏幕內(nèi)應(yīng)該顯示哪些 Fragments,以及應(yīng)該對(duì)它們進(jìn)行如何布局就行了。這是一種組件化的思維,用 Fragment 去組合了一系列有關(guān)聯(lián)的 UI 組件,并管理它們之間的邏輯,而 Activity 負(fù)責(zé)在不同屏幕下(例如橫豎屏)布局不同的 Fragments 組合。這種碎片不單單能管理可視的 Views,它也能執(zhí)行不可視的 Tasks,它提供了 retainInstance 屬性,能夠在 Activity 因?yàn)槠聊粻顟B(tài)發(fā)生改變(例如切換橫豎屏?xí)r)而銷(xiāo)毀重建時(shí),依然保留實(shí)例。這示意著我們能在 RetainedFragment 里面執(zhí)行一些在屏幕狀態(tài)發(fā)生改變時(shí)不被中斷的操作。
下面我們就來(lái)具體看一個(gè)Android Fragment功能的例子。
實(shí)現(xiàn)的功能很簡(jiǎn)單,也是最基本的,上下分別是兩個(gè)Fragment,上面的Fragment中是一個(gè)listview,當(dāng)點(diǎn)擊item時(shí),下面的Fragment顯示對(duì)應(yīng)的文字詳細(xì)信息:


具體的實(shí)現(xiàn)步驟如下:
①創(chuàng)建工程FragmentExam,目錄視圖如下(把之前的FragmentPreference的demo也加到了一起):

②main.xml文件布局,垂直方向上兩個(gè)Fragment,用<Fragment>標(biāo)簽聲明
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:background="#7ecef4">
<fragment
android:name="com.example.fragementexam.FragementList"
android:id="@+id/frag_list"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="2"/>
<fragment
android:name="com.example.fragementexam.FragementDetails"
android:id="@+id/frag_detail"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
③FragmentList.java的代碼,它繼承了ListFragment,注意在onCreateView方法中使用inflater的inflate方法將布局頁(yè)面引進(jìn):
package com.example.fragementexam;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListFragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class FragementList extends ListFragment {
private String[] values = new String[] { "侏儒", "人類(lèi)", "暗夜精靈", "矮人", "德萊尼",
"狼人" };
private int[] images = new int[] { R.drawable.gnome,
R.drawable.human, R.drawable.nightelf,
R.drawable.dwarf, R.drawable.draenei,
R.drawable.werewolf };
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_list, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < values.length; i++) {
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("values", values[i]);
listItem.put("images", images[i]);
listItems.add(listItem);
}
SimpleAdapter adapter = new SimpleAdapter(getActivity(), listItems,
R.layout.list_item, new String[] { "values", "images" },
new int[] { R.id.txt_title, R.id.img });
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// String item = (String) getListAdapter().getItem(position);
FragementDetails frag = (FragementDetails) getFragmentManager()
.findFragmentById(R.id.frag_detail);
if (frag != null && frag.isInLayout()) {
switch (position) {
case 0:
frag.setText(getString(R.string.Gnome));
break;
case 1:
frag.setText(getString(R.string.Human));
break;
case 2:
frag.setText(getString(R.string.NightElf));
break;
case 3:
frag.setText(getString(R.string.Dwarf));
break;
case 4:
frag.setText(getString(R.string.Draenei));
break;
case 5:
frag.setText(getString(R.string.Werewolf));
break;
}
}
Log.i("PDA", "position = " + position);
}
}
④FragementDetails.java的代碼,這個(gè)比較簡(jiǎn)單,里面有一個(gè)設(shè)置TextView內(nèi)容的方法,其布局頁(yè)面也僅僅是一個(gè)TextView
package com.example.fragementexam;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class FragementDetails extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.frag_detail, container,false);
}
public void setText(String item){
TextView txt = (TextView) getView().findViewById(R.id.txt_detail);
txt.setText(item);
}
}
其他的部分就是一些數(shù)組,String的定義了,這個(gè)demo雖然簡(jiǎn)單,卻將Android Fragment方面常用到的做了一個(gè)綜述,如果自己寫(xiě)明白了這個(gè)的話,今后遇到類(lèi)似的項(xiàng)目應(yīng)該要好應(yīng)付的多,好了,收工!
- Android應(yīng)用開(kāi)發(fā)中Fragment間通信的實(shí)現(xiàn)教程
- 淺談Android app開(kāi)發(fā)中Fragment的Transaction操作
- Android app開(kāi)發(fā)中的Fragment入門(mén)學(xué)習(xí)教程
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- 實(shí)例講解Android應(yīng)用開(kāi)發(fā)中Fragment生命周期的控制
- Android中Fragment的生命周期與返回棧的管理
- 實(shí)例探究Android應(yīng)用編寫(xiě)時(shí)Fragment的生命周期問(wèn)題
- Android中Fragment與Activity的生命周期對(duì)比
- Android應(yīng)用開(kāi)發(fā)中Fragment的靜態(tài)加載與動(dòng)態(tài)加載實(shí)例
- FrameLayout和Fragment處理Android應(yīng)用UI布局實(shí)例
- Android應(yīng)用UI開(kāi)發(fā)中Fragment的常見(jiàn)用法小結(jié)
- Android應(yīng)用開(kāi)發(fā)中使用Fragment的入門(mén)學(xué)習(xí)教程
- Android應(yīng)用開(kāi)發(fā)中Fragment存儲(chǔ)功能的基本用法
- 淺談Android App開(kāi)發(fā)中Fragment的創(chuàng)建與生命周期
相關(guān)文章
安卓監(jiān)聽(tīng)屏幕的橫豎翻轉(zhuǎn)實(shí)現(xiàn)方法
這篇文章主要介紹了安卓監(jiān)聽(tīng)屏幕的橫豎翻轉(zhuǎn)實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-12-12
Android開(kāi)發(fā)手冊(cè)TextView控件及陰影效果實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)TextView控件及陰影效果的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android自定義控件實(shí)現(xiàn)時(shí)間軸
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)時(shí)間軸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
超過(guò)百萬(wàn)的StackOverflow Flutter 20大問(wèn)題(推薦)
這篇文章主要介紹了超過(guò)百萬(wàn)的StackOverflow Flutter 問(wèn)題,有的問(wèn)題在stackoverflow上有幾十萬(wàn)的閱讀量,說(shuō)明很多人都遇到了這些問(wèn)題,把這些問(wèn)題整理分享給大家需要的朋友可以參考下2020-04-04
Android常用三方庫(kù)混淆規(guī)則整理(小結(jié))
這篇文章主要介紹了Android常用三方庫(kù)混淆規(guī)則整理(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
淺析Android 手機(jī)衛(wèi)士設(shè)備管理權(quán)限鎖屏
這篇文章主要介紹了淺析Android 手機(jī)衛(wèi)士設(shè)備管理權(quán)限鎖屏的相關(guān)資料,需要的朋友可以參考下2016-04-04
如何在Android Studio下進(jìn)行NDK開(kāi)發(fā)
這篇文章主要介紹了如何在Android Studio下進(jìn)行NDK開(kāi)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Android搭建grpc環(huán)境過(guò)程分步詳解
本篇文章使用的IDE是Android Studio。這里先吐槽一句,安卓項(xiàng)目搭建grpc環(huán)境,不管是引入插件還是引入第三方庫(kù),對(duì)于版本的要求都極為苛刻,一旦版本不匹配就會(huì)報(bào)錯(cuò),所以對(duì)于版本的搭配一定要注意2023-04-04
android使用NotificationListenerService監(jiān)聽(tīng)通知欄消息
本篇文章主要介紹了android使用NotificationListenerService監(jiān)聽(tīng)通知欄消息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01

