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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

安卓布局优化详解

發(fā)布時(shí)間:2024/8/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓布局优化详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

安卓的布局優(yōu)化方式目前有三種:使用<Include>標(biāo)簽、使用<ViewStub>標(biāo)簽、使用<merge />

★布局重用<include>標(biāo)簽:
1)使用include標(biāo)簽進(jìn)行布局復(fù)用,這種方式在我實(shí)際開(kāi)發(fā)中是用處最普遍的。
2)使用<include />標(biāo)簽可以使用單獨(dú)的layout屬性,這個(gè)也是必須用的,我覺(jué)得使用起來(lái)非常方便。

上個(gè)小圖:

?


★需要時(shí)使用<ViewStub />
在開(kāi)發(fā)應(yīng)用程序的時(shí)候,經(jīng)常會(huì)遇到這樣的情況,會(huì)在運(yùn)行時(shí)動(dòng)態(tài)根據(jù)條件來(lái)決定顯示哪個(gè)View或某個(gè)布局。那么最通常的想法就是把可能用到的View都寫(xiě)在上面,先把它們的可見(jiàn)性都設(shè)為View.GONE,然后在代碼中動(dòng)態(tài)的更改它的可見(jiàn)性。這樣的做法的優(yōu)點(diǎn)是邏輯簡(jiǎn)單而且控制起來(lái)比較靈活。但是它的缺點(diǎn)就是,耗費(fèi)資源。雖然把View的初始可見(jiàn)View.GONE但是在Inflate布局的時(shí)候View仍然會(huì)被Inflate,也就是說(shuō)仍然會(huì)創(chuàng)建對(duì)象,會(huì)被實(shí)例化,會(huì)被設(shè)置屬性。也就是說(shuō),會(huì)耗費(fèi)內(nèi)存等資源。

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

首先來(lái)說(shuō)說(shuō)ViewStub的一些特點(diǎn):

1. ViewStub只能Inflate一次,之后ViewStub對(duì)象會(huì)被置為空。按句話說(shuō),某個(gè)被ViewStub指定的布局被Inflate后,就不會(huì)夠再通過(guò)ViewStub來(lái)控制它了。

2. ViewStub只能用來(lái)Inflate一個(gè)布局文件,而不是某個(gè)具體的View,當(dāng)然也可以把View寫(xiě)在某個(gè)布局文件中。

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

1. 在程序的運(yùn)行期間,某個(gè)布局在Inflate后,就不會(huì)有變化,除非重新啟動(dòng)。

因?yàn)閂iewStub只能Inflate一次,之后會(huì)被置空,所以無(wú)法指望后面接著使用ViewStub來(lái)控制布局。所以當(dāng)需要在運(yùn)行時(shí)不止一次的顯示和隱藏某個(gè)布局,那么ViewStub是做不到的。這時(shí)就只能使用View的可見(jiàn)性來(lái)控制了。

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

因?yàn)樵O(shè)置給ViewStub的只能是某個(gè)布局文件的Id,所以無(wú)法讓它來(lái)控制某個(gè)View。

所以,如果想要控制某個(gè)View(如Button或TextView)的顯示與隱藏,或者想要在運(yùn)行時(shí)不斷的顯示與隱藏某個(gè)布局或View,只能使用View的可見(jiàn)性來(lái)控制。

?

下面看代碼:

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("布局優(yōu)化之ViewStub標(biāo)簽");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);} }

  

運(yùn)行圖:

?

?

?

?


使用的時(shí)候的注意事項(xiàng):

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


★對(duì)于減少視圖層次<merge />標(biāo)簽我了解較少,待以后清楚些了再來(lái)訴說(shuō)。

轉(zhuǎn)載于:https://www.cnblogs.com/liushilin/p/5619380.html

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。