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?- <ViewStub
-
android:id="@+id/stub_add"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:inflatedId="@+id/ly_add"
- 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?- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context="com.jay.example.test.MainActivity">
- <Button
- android:id="@+id/btnLoad"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="載入ViewStub"/>
- <Button
- android:id="@+id/btnHide"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="隱藏載入的佈局"/>
- <Button
- android:id="@+id/btnShow"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="顯示載入的佈局"/>
- <ViewStub
- android:id="@+id/stub_add"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:inflatedId="@+id/ly_add"
- android:layout="@layout/ly_test"/>
- </LinearLayout>
引入的佈局:ly_test.xml: [html]view plaincopyprint?
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context="com.jay.example.test.MainActivity"
- android:gravity="center">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/back"
- android:text="用於測試的ViewStub引入的佈局"
- android:textColor="#FFFFFF"
- android:gravity="center_vertical"
- android:textSize="18sp"/>
- </LinearLayout>
MainActivity.java中的程式碼: [java]view plaincopyprint?
- package com.jay.example.test;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewStub;
- import android.widget.Button;
- publicclass MainActivity extends Activity {
- private Button btnLoad;
- private Button btnHide;
- private Button btnShow;
- private MyClick myClick;
- private ViewStub viewStub;
- private View view;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- findViews();
- setUpViews();
- }
- privatevoid findViews() {
- btnLoad = (Button) findViewById(R.id.btnLoad);
- btnHide = (Button) findViewById(R.id.btnHide);
- btnShow = (Button) findViewById(R.id.btnShow);
- }
- privatevoid setUpViews() {
- myClick = new MyClick();
- btnLoad.setOnClickListener(myClick);
- btnHide.setOnClickListener(myClick);
- btnShow.setOnClickListener(myClick);
- }
- privateclass MyClick implements OnClickListener {
-
相關推薦
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