日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓布局优化详解

發布時間:2024/8/26 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓布局优化详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安卓的布局優化方式目前有三種:使用<Include>標簽、使用<ViewStub>標簽、使用<merge />

★布局重用<include>標簽:
1)使用include標簽進行布局復用,這種方式在我實際開發中是用處最普遍的。
2)使用<include />標簽可以使用單獨的layout屬性,這個也是必須用的,我覺得使用起來非常方便。

上個小圖:

?


★需要時使用<ViewStub />
在開發應用程序的時候,經常會遇到這樣的情況,會在運行時動態根據條件來決定顯示哪個View或某個布局。那么最通常的想法就是把可能用到的View都寫在上面,先把它們的可見性都設為View.GONE,然后在代碼中動態的更改它的可見性。這樣的做法的優點是邏輯簡單而且控制起來比較靈活。但是它的缺點就是,耗費資源。雖然把View的初始可見View.GONE但是在Inflate布局的時候View仍然會被Inflate,也就是說仍然會創建對象,會被實例化,會被設置屬性。也就是說,會耗費內存等資源。

推薦的做法是使用Android.view.ViewStub,ViewStub是一個輕量級的View,它一個看不見的,不占布局位置,占用資源非常小的控件。可以為ViewStub指定一個布局,在Inflate布局的時候,只有ViewStub會被初始化,然后當ViewStub被設置為可見的時候,或是調用了ViewStub.inflate()的時候,ViewStub所向的布局就會被Inflate和實例化,然后ViewStub的布局屬性都會傳給它所指向的布局。這樣,就可以使用ViewStub來方便的在運行時,要還是不要顯示某個布局。
但ViewStub也不是萬能的,下面總結下ViewStub能做的事兒和什么時候該用ViewStub,什么時候該用可見性的控制。

首先來說說ViewStub的一些特點:

1. ViewStub只能Inflate一次,之后ViewStub對象會被置為空。按句話說,某個被ViewStub指定的布局被Inflate后,就不會夠再通過ViewStub來控制它了。

2. ViewStub只能用來Inflate一個布局文件,而不是某個具體的View,當然也可以把View寫在某個布局文件中。

基于以上的特點,那么可以考慮使用ViewStub的情況有:

1. 在程序的運行期間,某個布局在Inflate后,就不會有變化,除非重新啟動。

因為ViewStub只能Inflate一次,之后會被置空,所以無法指望后面接著使用ViewStub來控制布局。所以當需要在運行時不止一次的顯示和隱藏某個布局,那么ViewStub是做不到的。這時就只能使用View的可見性來控制了。

2. 想要控制顯示與隱藏的是一個布局文件,而非某個View。

因為設置給ViewStub的只能是某個布局文件的Id,所以無法讓它來控制某個View。

所以,如果想要控制某個View(如Button或TextView)的顯示與隱藏,或者想要在運行時不斷的顯示與隱藏某個布局或View,只能使用View的可見性來控制。

?

下面看代碼:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns: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"android:orientation="vertical"tools:context="com.example.nanchen.layoutdemo.MainActivity"><include android:layout_height="wrap_content"android:layout_width="wrap_content"layout="@layout/menu_layout"/><ViewStubandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dip"android:layout_marginRight="20dip"android:layout_marginTop="10dip"android:id="@+id/viewstub_demo_text"android:layout="@layout/viewstub_demo_text_layout"/><ViewStubandroid:id="@+id/viewstub_demo_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dip"android:layout_marginRight="5dip"android:layout="@layout/viewstub_demo_image_layout"/> </LinearLayout>

  

viewstub_demo_image_layout

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/viewstub_demo_imageview"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

  

viewstub_demo_text_layout

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/viewstub_demo_textview"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#aa664411"android:textSize="16sp"/></LinearLayout>

  

?

package com.example.nanchen.layoutdemo;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.ViewStub; import android.widget.ImageView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_text); // stub.inflate(); // TextView text = (TextView) findViewById(R.id.viewstub_demo_textview); // text.setText("布局優化之ViewStub標簽");ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_image);stub.inflate();ImageView image = (ImageView) findViewById(R.id.viewstub_demo_imageview);image.setImageResource(R.mipmap.ic_launcher);} }

  

運行圖:

?

?

?

?


使用的時候的注意事項:

1、某些布局屬性要加在ViewStub而不是實際的布局上面,才會起作用,比如上面用的android:layout_margin*系列屬性,如果加在TextView上面,則不會起作用,需要放在它的ViewStub上面才會起作用。而ViewStub的屬性在inflate()后會都傳給相應的布局。
2、 VIewStub中不能嵌套merge標簽。
3、 ViewStub只能用來Inflate一個布局文件,而不是某個具體的View,當然也可以把View寫在某個布局文件中。如果想操作一個具體的view,還是使用visibility屬性吧。


★對于減少視圖層次<merge />標簽我了解較少,待以后清楚些了再來訴說。

轉載于:https://www.cnblogs.com/liushilin/p/5619380.html

總結

以上是生活随笔為你收集整理的安卓布局优化详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。