Android在layout xml中使用ViewStub完成動態載入

来源:http://www.cnblogs.com/Renyi-Fan/archive/2017/08/19/7397385.html
-Advertisement-
Play Games

Android在layout xml中使用ViewStub完成動態載入 一、Layout XML文件常見的兩種模塊載入方式 1、靜態載入:被載入的模塊和其它模塊載入的時間一樣。 <include layout="@layout/otherLayout"/> 2、動態載入:需要被載入的模塊初始時並沒有 ...


Android在layout xml中使用ViewStub完成動態載入

一、Layout XML文件常見的兩種模塊載入方式

  1、靜態載入:被載入的模塊和其它模塊載入的時間一樣。
    <include layout="@layout/otherLayout"/>


  2、動態載入:需要被載入的模塊初始時並沒有被載入進記憶體,在你需要載入這個模塊才會被動態的載入進去。
    <ViewStub android:layout="@layout/otherLayout"/>

    還要把layout width和height加上

  

二、ViewStup完成動態載入

  1、簡介

      

  2、ViewStub類結構圖

    

    從這個圖裡面我們可以發現ViewStub是一個控制項。是控制項那就好辦了,那麼對其它控制項可以進行的操作(例如:初始化,創建對象使用)

    它都可以進行。

    ViewStub是一個控制項,所以屬性都是android下的,包括layout

    所以我們可以實現用一個button控制ViewStub的動態載入。

  3、ViewStub屬性方法

    

    inflate()方法用來載入ViewStub。

    動態功能的實現可以通過在Button的onClick方法裡面添加這個inflate()。


 

三、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的可見性來控制。

下麵來看一個實例

在這個例子中,要顯示二種不同的佈局,一個是用TextView顯示一段文字,另一個則是用ImageView顯示一個圖片。這二個是在onCreate()時決定是顯示哪一個,這裡就是應用ViewStub的最佳地點。

先來看看佈局,一個是主佈局,裡面只定義二個ViewStub,一個用來控制TextView一個用來控制ImageView,另外就是一個是為顯示文字的做的TextView佈局,一個是為ImageView而做的佈局:

 

[html] view plain copy    print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:orientation="vertical"  
  5.   android:layout_width="fill_parent"  
  6.   android:layout_height="fill_parent"  
  7.   android:gravity="center_horizontal">  
  8.   <ViewStub   
  9.     android:id="@+id/viewstub_demo_text"  
  10.     android:layout_width="wrap_content"  
  11.     android:layout_height="wrap_content"  
  12.     android:layout_marginLeft="5dip"  
  13.     android:layout_marginRight="5dip"  
  14.     android:layout_marginTop="10dip"  
  15.     android:layout="@layout/viewstub_demo_text_layout"/>  
  16.   <ViewStub   
  17.     android:id="@+id/viewstub_demo_image"  
  18.     android:layout_width="wrap_content"  
  19.     android:layout_height="wrap_content"  
  20.     android:layout_marginLeft="5dip"  
  21.     android:layout_marginRight="5dip"  
  22.     android:layout="@layout/viewstub_demo_image_layout"/>  
  23. </LinearLayout>  

為TextView的佈局:

 

 

[html] view plain copy    print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:orientation="vertical"  
  5.   android:layout_width="wrap_content"  
  6.   android:layout_height="wrap_content">  
  7.     <TextView  
  8.         android:id="@+id/viewstub_demo_textview"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:background="#aa664411"  
  12.         android:textSize="16sp"/>  
  13. </LinearLayout>  

為ImageView的佈局:

 

 

[html] view plain copy    print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:orientation="vertical"  
  5.   android:layout_width="wrap_content"  
  6.   android:layout_height="wrap_content">  
  7.     <ImageView  
  8.         android:id="@+id/viewstub_demo_imageview"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"/>  
  11. </LinearLayout>  

下麵來看代碼,決定來顯示哪一個,只需要找到相應的ViewStub然後調用其infalte()就可以獲得相應想要的佈局:

 

 

[java] view plain copy    print?
  1. package com.effective;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.ViewStub;  
  6. import android.widget.ImageView;  
  7. import android.widget.TextView;  
  8.   
  9. public class ViewStubDemoActivity extends Activity {  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.viewstub_demo_activity);  
  14.         if ((((int) (Math.random() * 100)) & 0x01) == 0) {  
  15.             // to show text  
  16.             // all you have to do is inflate the ViewStub for textview  
  17.             ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_text);  
  18.             stub.inflate();  
  19.             TextView text = (TextView) findViewById(R.id.viewstub_demo_textview);  
  20.             text.setText("The tree of liberty must be refreshed from time to time" +  
  21.                     " with the blood of patroits and tyrants! Freedom is nothing but " +  
  22.                     "a chance to be better!");  
  23.         } else {  
  24.             // to show image  
  25.             // all you have to do is inflate the ViewStub for imageview  
  26.             ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_image);  
  27.             stub.inflate();  
  28.             ImageView image = (ImageView) findViewById(R.id.viewstub_demo_imageview);  
  29.             image.setImageResource(R.drawable.happy_running_dog);  
  30.         }  
  31.     }  
  32. }  

運行結果:

 

使用的時候的註意事項:

1. 某些佈局屬性要加在ViewStub而不是實際的佈局上面,才會起作用,比如上面用的android:layout_margin*系列屬性,如果加在TextView上面,則不會起作用,需要放在它的ViewStub上面才會起作用。而ViewStub的屬性在inflate()後會都傳給相應的佈局。

參考:http://blog.csdn.net/hitlion2008/article/details/6737537/

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Windows下的Android遠程桌面助手(Android Remote Displayer and Controller),增加了輸入法的快速切換功能,支持通過Google拼音輸入法在PC端快速輸入中文,支持通過ARDC輸入法複製粘貼文本到Android端。 ...
  • 歡迎各位同學加入: React-Native群:397885169 大前端群:544587175 大神超多,熱情無私幫助解決各種問題。 最近項目需求需要用到輪播圖,所以寫兩Demo練練手,不過效果不太理想,希望大牛予以指正。 不多說,先上圖。 這種輪播很常見,但是一個問題是,總感覺有點卡的感覺,最氣 ...
  • 說明: ^.*[\u4e00-\u9fa5].*$ 是否包含中文^[\u4E00-\u9FA5]+$ 是否全中文 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range repla ...
  • 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/76165252 本文出自 "【趙彥軍的博客】" 一:什麼是路由? 說簡單點就是映射頁面跳轉關係的,當然它也包含跳轉相關的一切功能。 二:為什麼需要路由 Android系統已經給我們提供 ...
  • 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/75578109 本文出自 "【趙彥軍的博客】" 起因 最近在項目中遇到需要在界面上顯示一個本地的 GIF 圖。按照慣例我直接用了 Glide 框架來實現。 Glide 地址: http ...
  • 在瞭解`Masonry`框架之前,有必要先瞭解一下**自動佈局**的概念。在`iOS6`之前,`UI`佈局的方式是通過`frame`屬性和`Autoresizing`來完成的,而在`iOS6`之後,蘋果公司推出了`AutoLayout`的佈局方式,它是一種基於約束性的、描述性的佈局系統,尤其是蘋果的... ...
  • 在 Kotlin1.1.4版本 發佈後,原作者依據 Kotlin 新版本的一系列新特性和讀者的提問對幾個月前寫文章進行更新。這篇是重寫的KAD04。在這篇重寫的文章中,他涵蓋了所有KAE(1.1.4版本前後)可以完成的事情。現在你會喜歡在任何類(不只是activity, fragment 或 vie... ...
  • 1.應用 Assets.xcassets :用來存放圖像資源文件 好處: 自動管理圖片,如@1x,@2x圖片,使用的時候使用Asset 名字即可 管理應用的Icon和Default圖片,這個挺方便的,可以完全拋開以前規範命名如Icon.png,[email protected],Xcode會自動識別尺寸然後匹配 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...