1. 程式人生 > >New UI-標籤延時載入佈局

New UI-標籤延時載入佈局

New UI-<ViewStub>標籤延時載入佈局

 ——轉載請註明出處:coder-pig,歡迎轉載,請勿用於商業用途!

小豬Android開發交流群已建立,歡迎大家加入,無論是新手,菜鳥,大神都可以,小豬一個人的

力量畢竟是有限的,寫出來的東西肯定會有很多紕漏不足,歡迎大家指出,集思廣益,讓小豬的博文

更加的詳盡,幫到更多的人,O(∩_∩)O謝謝!

小豬Android開發交流群:小豬Android開發交流群群號:421858269


本節引言:

學習完上一節的include佈局複用以後,相信大家都體會到了佈局優化的好處,

不過當我們include的佈局是一些複雜控制元件的話,而這些控制元件我們在實際使用

過程中又用得不多的話,往往會降低頁面的載入速度;雖然,我們也可以為其設定

visibility = "gone"的屬性,但是在inflate佈局的時候,這些控制元件依舊會被inflate,

也就是說依舊會建立物件,會被例項化,設定屬性等,依舊會耗費記憶體資源,

那麼在本節中,我們就來介紹一個輕量級的view:ViewStub

讓你的佈局在你需要的時候再載入(延時載入)

好了,開始本節內容~

本節正文:

什麼是ViewStub?

ViewStub是一個輕量級的View,在佈局中不佔用任何控制元件,也不參加
佈局的計算與繪製(又叫渲染),可以理解為控制元件樹上的一個
佔位符,
僅僅是佔著那個位置,沒有東西,當我們需要的時候,他才會被渲染(載入)


到主介面上,這種行為也叫做延遲載入,也有人稱為"惰性的include"

在什麼地方使用?

當我們的app中某個佈局,我們並不需要把所有的內容都展示出來,可以隱藏一些View檢視,

等需要展示的時候再載入,這個時候就可以用到ViewStub了,有點類似於visibility = "gone",

但是不會隨佈局進行載入,使用例子如下:(點選listview的item後才載入下方的佈局)


怎麼用?

1)佈局中加入<ViewStub標籤>

[html]view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. <ViewStub
  2.         android:id="@+id/stub_add"
  3.         android:layout_width="fill_parent"
  4.         android:layout_height="wrap_content"
  5.         android:layout_gravity="center"
  6.         android:inflatedId="@+id/ly_add"
  7.         android:layout="@layout/ly_test"/>

三個關鍵屬性:

id:設定ViewStub的引用id
inflatedId:設定載入後的佈局對應的id
layout:要載入的那個佈局

ps:第二個屬性是可選的,當我們的ViewStub載入後,我們就可以直接通過findViewById(R.id.~)

找到載入的那個佈局的對應的物件,~是inflatedId的id!因為ViewStub只能用一次!!!!

2)在載入佈局檔案的Activity中:

方法一:通過findViewById找到ViewStub物件後,呼叫該物件的inflate()方法:

ViewStub stub = (ViewStub) findViewById(R.id.stub_add);  

stub.inflate();


方法二:通過改變ViewStub物件的visibility屬性

ViewStub stub = (ViewStub) findViewById(R.id.stub_add);  

stub.setVisibility(View.VISIBLE);

上面寫完後,我們如果獲得載入佈局的對應物件的話,則要通過findViewById(R.id.inflatedId裡的id);

找到對應的佈局物件了:

View ly_add = (View)findViewById(R.id.ly_add);



處了上面這種寫法還,還有一種寫法:

因為ViewStub載入完他引用的佈局後,他會從控制元件樹中移除,

所以如果你想對引入後的佈局進行相關操作的話,那麼還是拿一個View來

放著這個佈局吧!所以也可以用下面這種寫法:

ViewStub stub = (ViewStub) findViewById(R.id.stub_add);  

View view =  stub.inflate(); 

或者:

ViewStub stub = (ViewStub) findViewById(R.id.stub_add);  

View view = stub.setVisibility(View.VISIBLE);

好了,至於用哪種,你自己喜歡了!大笑

使用ViewStub要注意的地方:

1)ViewStub只能inflate一次,之後ViewStub物件會被置空所以在編寫程式碼

的時候,就不要使用生命週期很長的變數來引用ViewStub控制元件了,按照上面的教的寫法即可!

2)ViewStub載入的只能是佈局檔案的id,而非某個View

程式碼示例:

從"惰性include"這個別名,我們就可以知道ViewStub和include其實是類似的

不過前者並不隨著佈局的渲染和渲染,而是,在我們Inflate或設定Visibility為VISIBLE時

才渲染,而且只用一次,針對的是一次性的東西,在ListView那裡用得較多,

當然見仁見智,這裡就演示下簡單的用法吧:

效果圖:


報錯結束了,恩,彆著急,先貼下程式碼:

actvitiy_main.xml:

[html]view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:id="@+id/LinearLayout1"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     android:orientation="vertical"
  7.     tools:context="com.jay.example.test.MainActivity">
  8.     <Button
  9.         android:id="@+id/btnLoad"
  10.         android:layout_width="wrap_content"
  11.         android:layout_height="wrap_content"
  12.         android:text="載入ViewStub"/>
  13.     <Button
  14.         android:id="@+id/btnHide"
  15.         android:layout_width="wrap_content"
  16.         android:layout_height="wrap_content"
  17.         android:text="隱藏載入的佈局"/>
  18.     <Button
  19.         android:id="@+id/btnShow"
  20.         android:layout_width="wrap_content"
  21.         android:layout_height="wrap_content"
  22.         android:text="顯示載入的佈局"/>
  23.     <ViewStub
  24.         android:id="@+id/stub_add"
  25.         android:layout_width="match_parent"
  26.         android:layout_height="match_parent"
  27.         android:layout_gravity="center"
  28.         android:inflatedId="@+id/ly_add"
  29.         android:layout="@layout/ly_test"/>
  30. </LinearLayout>

引入的佈局:ly_test.xml: [html]view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:id="@+id/LinearLayout1"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     android:orientation="vertical"
  7.     tools:context="com.jay.example.test.MainActivity"
  8.     android:gravity="center">
  9.     <TextView
  10.         android:layout_width="wrap_content"
  11.         android:layout_height="wrap_content"
  12.         android:background="@drawable/back"
  13.         android:text="用於測試的ViewStub引入的佈局"
  14.         android:textColor="#FFFFFF"
  15.         android:gravity="center_vertical"
  16.         android:textSize="18sp"/>
  17. </LinearLayout>

MainActivity.java中的程式碼: [java]view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.jay.example.test;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.view.ViewStub;  
  7. import android.widget.Button;  
  8. publicclass MainActivity extends Activity {  
  9.     private Button btnLoad;  
  10.     private Button btnHide;  
  11.     private Button btnShow;  
  12.     private MyClick myClick;  
  13.     private ViewStub viewStub;  
  14.     private View view;  
  15.     @Override
  16.     protectedvoid onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_main);  
  19.         findViews();  
  20.         setUpViews();  
  21.     }  
  22.     privatevoid findViews() {  
  23.         btnLoad = (Button) findViewById(R.id.btnLoad);  
  24.         btnHide = (Button) findViewById(R.id.btnHide);  
  25.         btnShow = (Button) findViewById(R.id.btnShow);  
  26.     }  
  27.     privatevoid setUpViews() {  
  28.         myClick = new MyClick();  
  29.         btnLoad.setOnClickListener(myClick);  
  30.         btnHide.setOnClickListener(myClick);  
  31.         btnShow.setOnClickListener(myClick);  
  32.     }  
  33.     privateclass MyClick implements OnClickListener {  
  34.         

    相關推薦

    New UI-標籤載入佈局

    New UI-<ViewStub>標籤延時載入佈局  ——轉載請註明出處:coder-pig,歡迎轉載,請勿用於商業用途! 小豬Android開發交流群已建立,歡迎大家加入,無論是新手

    基於浮動的移動端兩列可載入的瀑布流佈局

    由於工作需要需要寫一個移動端可以延時載入的瀑布流佈局頁面,於是開始查資料,百度,對瀑布流有了一些理解,一直以來都有寫部落格的想法,於是有了這篇博文! 幾點說明 1.本文所說的瀑布流指的是等寬不等高的瀑布流 2.本問純屬記錄用,筆者水平有限,如有錯誤歡迎指正

    Hibernate對映關係之載入

    當一個主物件中包涵從物件時,不同關心 配置會有不同的結果 各個關係之前的區別: one-to-one             查詢主物件:                 預設的不是延時載入,查詢主物件時也會把從物件查詢出來                 當

    什麼是Hibernate載入

    1、延遲載入,也叫懶載入,它是Hibernate為提高程式執行效率而提供的一種機制,即只有真正使用該物件的資料時才會建立。 2、Hibernate中主要是通過代理(proxy)機制來實現延遲載入。它的具體過程:Hibernate從資料庫獲取某一個物件資料時,或獲取某一個物件的集合屬性值時

    hibernate 懶載入載入

    一、延時載入配置: 下面把Customer.hbm.xml檔案的<class>元素的lazy屬性設為true,表示使用延遲檢索策略: Xml程式碼 <class name="mypack.Customer" table="CUSTOMERS" lazy="

    Hibernate中的即時載入(get)和載入(load)

    一,即時載入     Student student = session.get(Student.class, 22);     System.out.println(student);       &nb

    ionic入門教程第十五課-ionic效能優化之圖片載入

    週五的時候有個朋友讓我寫一個關於圖片延時載入的教程, 直到今天才有空編輯,這階段真的是很忙,公眾號都變成殭屍號了。 實在是對不起大家。 有人喜歡我的教程,可能我總習慣了用比較簡單容易理解的方式去描述這些東西。 別的就不多說了,大家遇到什麼問題。 可以直接聯絡我,不是一句話兩

    1、單例模式(立即載入載入

    A、餓漢模式 package demo; /** * Created by sunyifeng on 17/10/19. */ public class ObjectA { // 餓汗模式

    什麼是hibernate的延遲載入,什麼時候使用載入,為什麼要用載入

    所謂懶載入(lazy)就是延時載入,延遲載入。 什麼時候用懶載入呢,我只能回答要用懶載入的時候就用懶載入。 至於為什麼要用懶載入呢,就是當我們要訪問的資料量過大時,明顯用快取不太合適, 因為記憶體容量有限 ,為了減少併發量,減少系統資源的消耗, 我們讓資料在需要的時候才進行載入,這時我們就用到了懶載入。 比

    jquery外掛圖片載入例項詳解

    $("img").lazyload(); 這將會使所有的圖片都延遲載入。 當然外掛還有幾個配置項可供設定。 1.改變threshold $(“img”).lazyload({ threshold : 200 }); 把閥值設定成200 意思就是當圖片沒有看到之前先load 200畫

    Android 網路載入

    在進行網路訪問等耗時操作的時候,我們經常會用到載入框,也提高了使用者體驗。 一、顯示載入框: ProgressDialog progressDialog = ProgressDialog.show(LoginActivity.this,"Loading.

    自己動手,寫自己的lazyload,讓外掛涼快去——網站優化之圖片載入

    最近一個專案裡,遇到一個這樣的需求:這是一個WEBAPP應用,應用所有的邏輯都聚焦在一個頁面內,客戶要求1.頁面載入速度要快,2頁面響應要快。3.這個頁面只能一屏,不能出現滾動條。因此這個頁面包含了大量的彈出層的操作。 由於這個頁面中,坑爹地包含了136張圖片,主要是很多L

    jquery載入動畫焦點圖- 有點類似視差動畫

    <script type="text/javascript">$('.DB_tab25').DB_tabMotionBanner({key:'b28551',autoRollingTime:10000,                            bgSpeed:500,motion:{

    ViewPager+fragment載入,懶載入(資料快取)

    今天開發遇到資料快取的問題, ViewPager+2個fragment,大家都知道ViewPager有預載入的功能,每次都會把下一個頁面同時載入,這樣雖然有時很好,但是使用者只需看一個Fragment

    ScheduledThreadPoolExecutor實現定時器和載入功能

    java.util.concurrent.ScheduledThreadPoolExecutor 是 JDK1 .6之後自帶的 包,功能強大,能實現定時器和延時載入的功能 各類功能和處理方面優於Timer 1、定時器: ScheduledThreadPoolExecut

    mybatis3.2.7學習筆記2_一對一、一對多、多對多、載入、快取

    參考源:   我對比了一下mybatis和hibernate的一對一 一對多 多對多的概念   mybatis的要比hibernate簡單的多  更加突出了mybatis注重sql的概念 * resuType--將sql的列名和pojo的屬性進行一一的對映 *

    Android最佳效能實踐——佈局優化技巧之、標籤及僅在需要載入佈局的:ViewStub

    在前面幾篇文章當中,我們學習瞭如何通過合理管理記憶體,以及高效能編碼技巧的方式來提升應用程式的效能。然而實際上介面佈局也會對應用程式的效能產生比較大的影響,如果佈局寫得糟糕的話,那麼程式載入UI的速度就會非常慢,從而造成不好的使用者體驗。那麼本篇文章我們就來學習一

    關於Class物件、類載入機制、虛擬機器執行記憶體佈局的全面解析和推測

    簡介: 本文是對Java的類載入機制,Class物件,反射原理等相關概念的理解、驗證和Java虛擬機器中記憶體佈局的一些推測。本文重點講述瞭如何理解Class物件以及Class物件的作用。 歡迎探討,如有錯誤敬請指正 如需轉載,請註明出處 http://www.cnblogs.com/nul

    使用函式 initializer 介面優化深度學習場景下模型載入的冷啟動

    背景 深度學習場景使用函式計算典型案例 阿里雲 函式計算 客戶 碼隆科技 是一家專注於深度學習與計算機視覺技術創新的公司。當碼隆的客戶上傳大量影象資料後,需要儘快把影象按照客戶指定的方式處理,包括商品識別,紡織面料等柔性材質識別分析,內容審查,以圖搜圖等等。影象處理基於碼隆預先訓練好的深度學習模型,要求在

    C++程式執行記憶體佈局之----------區域性變數,全域性變數,靜態變數,函式程式碼,new出來的變數

    宣告兩點: (1)開發測試環境為VS2010+WindowsXP32位; (2)記憶體佈局指的是虛擬記憶體地址,不是實體地址。   1.測試程式碼 #include <iostream> using namespace std; int g_int_a; i