1、android布局LinearLayout、RelateLayout、FrameLayout;三种布局效率从高到底依次为FrameLayout、LinearLayout、RelateLayout。
2、优化布局主要有以下思路:
a、如果同时可以使用FrameLayout、LinearLayout、RelateLayout,则最好使用效率比较高的。但是前提条件就是用三种布局的层次应该是一样,否则使用层次比较少的一种。
b、使用hierarchyviewer对层次分析之后,如果可以压缩层次可以采用merge,例如有两层 FrameLayout,则可以采用merge压缩一层。需要注意的就是merge必须是根节点。
c、尽量使用include,可以让布局重复利用。
d、采用ViewStub,ViewStub是动态加载,初始化的时候尺寸为0,因此可以减少初始化布局文件时间。当需要的时候采用inflate()或者setVisibility(View.VISIBLE)来加载。请参考以下代码:
optimization_layout.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:orientation="vertical">
<TextView
android:id="@+id/opt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="layout优化" />
<Button
android:id="@+id/opt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ViewStub测试" />
<ViewStub
android:id="@+id/opt_view_stub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/view_stub_layout" />
</LinearLayout>
view_stub_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_stub_root"
android:layout_width="200px"
android:layout_height="200px">
<TextView
android:id="@+id/view_stub_explain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这个是用来测试ViewStub的,ViewStub当使用的时候再动态加载!"
android:textAlignment="center" />
</LinearLayout>
public class OptimizationLayout1Activity extends AppCompatActivity {
private Button mButton = null;
private ViewStub mViewStub = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.optimization_layout);
mButton = (Button)findViewById(R.id.opt_button);
mButton.setOnClickListener((v -> {
// Debug.waitForDebugger();
mViewStub = (ViewStub)findViewById(R.id.opt_view_stub);
mViewStub.inflate();
}));
}
}
但是使用ViewStub是有限制的,inflate或者setVisibility只会执行一次,也就是当ViewStub指定的布局文件显示出来之后没有办法再进行控制;如果对于经常显示或者隐藏的控件就无法实现了。
例如单击一次mButton之后再进行单击,此时会抛异常:
06-27 15:37:58.627 24506-24506/com.example.kingsoft.studyproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.kingsoft.studyproject, PID: 24506
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.ViewStub.inflate()' on a null object reference
at com.example.kingsoft.ActivityLibs.OptimizationLayout1Activity.lambda$-com_example_kingsoft_ActivityLibs_OptimizationLayout1Activity_lambda$1(OptimizationLayout1Activity.java:26)
at com.example.kingsoft.ActivityLibs.-$Lambda$0.$m$0(Unknown Source)
at com.example.kingsoft.ActivityLibs.-$Lambda$0.onClick(Unknown Source)
at android.view.View.performClick(View.java:5207)
at android.view.View$PerformClick.run(View.java:21177)
at android.os.Handler.handleCallback(Handler.java:742)
另外,ViewStub所加载的布局控件不能附带高内存对象,例如view_stub_layout.xml增加一个背景图片:
view_stub_layout.xml 中增加一个背景 android:background="@drawable/image1"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_stub_root"
android:layout_width="200px"
android:layout_height="200px">
<TextView
android:id="@+id/view_stub_explain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这个是用来测试ViewStub的,ViewStub当使用的时候再动态加载!"
android:textAlignment="center" />
</LinearLayout>
抛出的异常如下:
Process: com.example.kingsoft.studyproject, PID: 3953
android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>
at android.view.LayoutInflater.inflate(LayoutInflater.java:543)
at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
at android.view.ViewStub.inflate(ViewStub.java:259)
at com.example.kingsoft.ActivityLibs.OptimizationLayout1Activity.lambda$-com_example_kingsoft_ActivityLibs_OptimizationLayout1Activity_lambda$1(OptimizationLayout1Activity.java:26)
at com.example.kingsoft.ActivityLibs.-$Lambda$0.$m$0(Unknown Source)
at com.example.kingsoft.ActivityLibs.-$Lambda$0.onClick(Unknown Source)
at android.view.View.performClick(View.java:5207)
因此,综上所述,如何对布局进行优化,需要根据业务情况来使用。