Android LayoutInflater 和 Fragment

LayoutInflater亿柑,在學習Android之后匠襟,我相信大家對它都有過一點了解祟敛,甚至有的說偶80%的Android程序員對它不了解猫态,甚至用的時候會出錯佣蓉。在今天我就看了一下一些關(guān)于Android LayoutInflater的介紹和資料,在這里和大家分享一下亲雪。Fragment我們只是暫時借助一下用它編寫案例勇凭。

吃驚

說白了,LayoutInflater 的作用就是加載布局义辕,和setContentView()的作用是一樣的虾标,在Activity中通常使用setContentView()方法來加載布局。其實setContentView()方法的內(nèi)部也是使用LayoutInflater來加載布局的灌砖,只不過這部分源碼是 internal 的璧函,不太容易查看到。

在使用 LayoutInflater 時首先要創(chuàng)建他的實例基显,在創(chuàng)建他的實例的時候有兩種方式:

一蘸吓、

    LayoutInflater inflater=LayoutInflater.from(MainActivity.this);

二、

    LayoutInflater inflater= (LayoutInflater) MainActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

其實這兩種方法實現(xiàn)的是一樣的效果撩幽。第一種方法就是第二種方法的簡寫库继。

我們在使用LayoutInflater 時就需要使用他的 inflate() 方法,其實inflate()方法在重載時會有四種調(diào)用方式:

1窜醉、public View inflate(int resource, ViewGroup root)

2制跟、public View inflate(int resource, ViewGroup root, boolean attachToRoot)

3、public View inflate(XmlPullParser parser, ViewGroup root)

4酱虎、public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)

這四種使用方式中雨膨,我們最常用的是第一種方式,inflate方法的主要作用就是將xml轉(zhuǎn)換成一個View對象读串,用于動態(tài)的創(chuàng)建布局聊记。雖然重載了四個方法撒妈,但是這四種方法最終調(diào)用的,還是第四種方式排监。第四種方式也很好理解狰右,內(nèi)部實現(xiàn)原理就是利用Pull解析器,對Xml文件進行解析舆床,然后返回View對象棋蚌。

在第一種方法中里面有兩個參數(shù),這兩個參數(shù)分別代表的是:需要加載的布局文件 id 和 給該布局的外部嵌套一層父布局挨队,如果不需要時直接傳null即可谷暮。

我們就用QQ的界面做一個小小的樣式案例:
首先我們先建立一個新的項目在布局activity_main.xml中寫入如下控件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.a16783.testfragment.MainActivity">

    <FrameLayout
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

    <android.support.v4.app.FragmentTabHost
    android:id="@+id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/colorAccent"/>
</LinearLayout>

然后在創(chuàng)建一個新的xml布局文件,命名為tab_content.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:gravity="center"
android:orientation="vertical">

    <ImageView
    android:id="@+id/btn_icon"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="@null" />
</LinearLayout>

在項目drawable文件中盛垦,導入事先準備好的圖標湿弦,然后在創(chuàng)建三個樣式文件,對其選中時的樣式和未選中時的樣式進行修改腾夯,最后完成之后目錄為:

目錄結(jié)構(gòu)-1

在drawable文件里的xml文件內(nèi)容為(只列舉其中一個):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/skin_tab_icon_conversation_selected" android:state_selected="true"/>
    <item android:drawable="@drawable/skin_tab_icon_conversation_normal" android:state_selected="false"/>

</selector>

然后我們就開始編寫按鈕所對應(yīng)的布局的Java代碼颊埃,(在這里用到了Fragment。Fragment是android.support.v4.app.Fragment; 包里面的蝶俱。所以在編寫程序時班利,需要導入所需的jar包。)我們在這里創(chuàng)建三個.java榨呆。分別取名為RedFragment.java,GreenFragment.java,BlueFragment.java.我們就拿其中一個代碼作為案例肥败,其余都一樣,只是為了區(qū)分其對應(yīng)的頁面愕提,其背景顏色不一樣:

public class RedFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view =new View(getActivity());
    view.setBackgroundColor(Color.RED);
    return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

}

創(chuàng)建完成后的目錄結(jié)構(gòu)為:

目錄結(jié)構(gòu)-2

最后,我們在MainActivity.java 中繼承的一定要是 FragmentActivity 皿哨,其代碼是:

public class MainActivity extends FragmentActivity {

private FragmentTabHost tabHost;
private LayoutInflater inflater;
private Class[] fragments={RedFragment.class,GreenFragment.class,BlueFragment.class};
private String[] names={"消息","聯(lián)系人","動態(tài)"};
private int[] icons={R.drawable.tab_msg,R.drawable.tab_friend,R.drawable.tab_plugin};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tabHost= (FragmentTabHost) findViewById(R.id.tabhost);
    inflater=LayoutInflater.from(MainActivity.this);
    LayoutInflater inflater= (LayoutInflater) MainActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    //把TabHost和FragmeLayout綁定起來
    tabHost.setup(MainActivity.this,getSupportFragmentManager(),R.id.content);

    //給TabHost添加標簽
    for (int i=0;i<names.length;i++){
        tabHost.addTab(tabHost.newTabSpec(names[i]).setIndicator(GetView(i)),fragments[i],null);
    }
    //去除TabHost之間的分割線(必須放在添加標簽后浅侨,否則包空指針)
    tabHost.getTabWidget().setDividerDrawable(null);
}
//獲取每個標簽的布局
public View GetView(int index){
    View view=inflater.inflate(R.layout.tab_content,null);
    ImageView imageView= (ImageView) view.findViewById(R.id.btn_icon);
    imageView.setImageResource(icons[index]);
    return view;
}

}

我們來看一下這個最終的效果圖案吧:

消息界面
聯(lián)系人界面
動態(tài)界面
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市证膨,隨后出現(xiàn)的幾起案子如输,更是在濱河造成了極大的恐慌,老刑警劉巖央勒,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件不见,死亡現(xiàn)場離奇詭異,居然都是意外死亡崔步,警方通過查閱死者的電腦和手機稳吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來井濒,“玉大人灶似,你說我怎么就攤上這事列林。” “怎么了酪惭?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵希痴,是天一觀的道長。 經(jīng)常有香客問我春感,道長砌创,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任鲫懒,我火速辦了婚禮嫩实,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刀疙。我一直安慰自己舶赔,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布谦秧。 她就那樣靜靜地躺著竟纳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疚鲤。 梳的紋絲不亂的頭發(fā)上锥累,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音集歇,去河邊找鬼桶略。 笑死,一個胖子當著我的面吹牛诲宇,可吹牛的內(nèi)容都是我干的际歼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼姑蓝,長吁一口氣:“原來是場噩夢啊……” “哼鹅心!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纺荧,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤旭愧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宙暇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體输枯,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年占贫,在試婚紗的時候發(fā)現(xiàn)自己被綠了桃熄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡型奥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情往扔,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布收夸,位于F島的核電站,受9級特大地震影響血崭,放射性物質(zhì)發(fā)生泄漏卧惜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一夹纫、第九天 我趴在偏房一處隱蔽的房頂上張望咽瓷。 院中可真熱鬧,春花似錦舰讹、人聲如沸茅姜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钻洒。三九已至,卻和暖如春锄开,著一層夾襖步出監(jiān)牢的瞬間素标,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工萍悴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留头遭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓癣诱,卻偏偏與公主長得像计维,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撕予,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容