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)建三個樣式文件,對其選中時的樣式和未選中時的樣式進行修改腾夯,最后完成之后目錄為:
在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)為:
最后,我們在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;
}
}
我們來看一下這個最終的效果圖案吧: