【include+LinearLayout】的使用例子
AndroidIncludeLayout.java
package com.AndroidIncludeLayout; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class AndroidIncludeLayout extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); View subLayout1 = (View)findViewById(R.id.main1); View subLayout2 = (View)findViewById(R.id.main2); Button myButton_main1 = (Button)subLayout1.findViewById(R.id.mybutton); Button myButton_main2 = (Button)subLayout2.findViewById(R.id.mybutton); Button startAnotherActivity = (Button)findViewById(R.id.startanotheractivity); startAnotherActivity.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(AndroidIncludeLayout.this, AnotherActivity.class); startActivity(intent); }}); myButton_main1.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(AndroidIncludeLayout.this, "Button 1 Pressed", Toast.LENGTH_LONG).show(); }}); myButton_main2.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(AndroidIncludeLayout.this, "Button 2 Pressed", Toast.LENGTH_LONG).show(); }}); } }
mail.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <include android:id="@+id/main1" layout="@layout/sublayout" /> <include android:id="@+id/main2" layout="@layout/sublayout" /> <Button android:id="@+id/startanotheractivity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" Start Another Activity " /> </LinearLayout>
sublayout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#505050" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="SubLayout" /> <Button android:id="@+id/mybutton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" A Button " /> </LinearLayout>
【include+merge】 //与上面的include用法有点不一样
LightActivity.java
/** * Copyright(c) 2014-2015 ChinaYong Hotel Media Technology Co.,Ltd. * All Rights Reserved. * * Filename : LightActivity.java * Author : Seldy lipeineng * Creation time : 上午10:58:53 - 2015-6-4 * Description : */ package com.hysmarthotel.roomcontrol; import com.hysmarthotel.util.LogUtil; import com.hysmarthotel.view.Temperature; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; //灯光控制 public class LightActivity extends Activity { public static Temperature temp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.light); temp = (Temperature)findViewById(R.id.temperature_light); //特殊的地方是,可以直接一步调用merge中的id,不用通过include,再去调用 log("layout1"+temp); init(); } private void init() { temp.setTemperature(MainActivity.mTemp+""); } private void log(String msg) { LogUtil.info(this.getClass(), this + ":" + msg,"i"); } }
light.xml
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg1" > <TextView android:id="@+id/lightctrl" android:layout_x="91.5px" android:layout_y="93.0px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:textSize="42.0px" android:textColor="#fff3e3d1" android:text="@string/light_ctrl" android:drawableLeft="@drawable/ic_light_t" android:drawablePadding="6px"/> <include android:id="@+id/include1" layout="@layout/time_temp"/> </AbsoluteLayout>
time_temp.xml
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:hyhotel="http://schemas.android.com/apk/res/com.hysmarthotel.roomcontrol" > <com.hysmarthotel.view.Temperature android:id="@+id/temperature_light" android:layout_x="1545.0px" android:layout_y="109.5px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22.5px" android:textColor="#fff3e3d1" hyhotel:prefix="@string/room_temp" hyhotel:unit="@string/celsius" /> </merge>
Android 布局优化 include+merge+ViewStub标签详解
merge标签
merge用于消除视图层次结构中的冗余视图,例如根布局是Linearlayout,那么我们又include一个LinerLayout布局就没意义了,反而会减慢UI加载速度。
又或者根布局是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity的ContentView父元素就是FrameLayout,所以可以用merge消除只剩一个
ViewStub标签
ViewStub 标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局比如进度条、显示错误消息等可以使用<ViewStub />标签,以减少内存使用量,加快渲染速度。
由于ViewStub第一次inflate的时候,就已经将需要显示的布局替换掉自己了,所以第二次inflate的时候,getParent()是null,所以就会报异常。解决方法是inflate()的时候将view保存起来,然后下次判断这个View是否为NUll,如果是null就inflate().否则就直接使用这个view。