Presentation與自定義Dialog的使用

来源:http://www.cnblogs.com/xiaoshubao/archive/2016/06/30/5630480.html
-Advertisement-
Play Games

本文為原創文章,轉載請註明出處。 文章最後附帶DEMO,請需要的朋友下載。 從API 17開始,Android提供了Presentation類,為多屏異顯開發提供了官方支持,當然最終需求的實現也需要底層硬體及驅動的支持。 基本需求:控制輔屏全屏顯示與主顯不同的內容,且當主顯全屏顯示的內容變化後對輔屏 ...


本文為原創文章,轉載請註明出處

文章最後附帶DEMO,請需要的朋友下載。 

從API 17開始,Android提供了Presentation類,為多屏異顯開發提供了官方支持,當然最終需求的實現也需要底層硬體及驅動的支持。

基本需求:控制輔屏全屏顯示與主顯不同的內容,且當主顯全屏顯示的內容變化後對輔屏顯示內容的延續性(例如輔屏視頻播放)不產生影響。

本文主要內容有以下幾點:

(1)Presentation的基本用法;

(2)自定義Dialog的使用(全屏);

(3)採用自定義Dialog對話框方式代替Activity間的切換,防止因Activity進入Paused狀態導致Presentation不再顯示或顯示內容不持續的情況,例如想讓輔屏連續播放視頻,如果採用Activity切換方式,在Activity切換後新的Activity控制的Presentation很難延續上一個Presentation的視頻播放位置且用戶體驗不好。

Presentation的高級用法比如硬體狀態改變事件監聽等,請參考官方API或其他文章。

通常,使用Presentation有幾個要點:

(1)生命周期,Android API官方文檔有段原話"A presentation is automatically canceled (see cancel()) when the display to which it is attached is removed. An activity should take care of pausing and resuming whatever content is playing within the presentation whenever the activity itself is paused or resumed.",意思是當與presentation 綁定的Display被移除或Activitiey進入pauseed、resuming狀態時必須由我們自己控制Presentation的生命周期即Activity不在主顯顯示時由其創建的Presentation也將消失。

(2)獲得Display,每個Presentation必須指定單獨的Display用於與主屏幕不同內容的展現。

(3)設置ContentView,與Activity一樣,Presentation也可以通過setContentView方法設置Presentation展現的XML佈局文件。

說明:為了便於代碼重構和邏輯分離,自定義的Presentation和Dialog均定義成單獨的類,如果功能很簡單也可以定義成內部類。

一、自定義Presentation顯示

通常獲得Presentation顯示需要的Display有兩種方法,MediaRouter 和DisplayManager ,本文將採用DisplayManage獲取Display的方式。

(1)創建佈局文件presentation_content.xml,效果如下:

(2)創建XiaoshubaoPresentation.java類文件:

 1 package xiaoshubao.presentationdemo;
 2 
 3 import android.app.Presentation;
 4 import android.content.Context;
 5 import android.os.Bundle;
 6 import android.view.Display;
 7 import android.widget.TextView;
 8 
 9 /**
10  * 作者:xiaoshubao
11  * 時間:2016/06/30
12  * 版本: V1.0
13  * 說明:
14  */
15 public class XiaoshubaoPresentation  extends Presentation {
16     private Display mdisplay;
17     public XiaoshubaoPresentation(Context context, Display display) {
18         super(context, display);
19         this.mdisplay = display;
20     }
21 
22 
23     @Override
24     protected void onStart() {
25         super.onStart();
26         MessageUtils.showInfo("MyPresentation....onStart");
27     }
28 
29     @Override
30     protected void onStop() {
31         super.onStop();
32         MessageUtils.showInfo("MyPresentation....onStop");
33     }
34 
35     @Override
36     public void show() {
37         super.show();
38         MessageUtils.showInfo("MyPresentation....show");
39     }
40 
41     @Override
42     public void hide() {
43         super.hide();
44         MessageUtils.showInfo("MyPresentation....hide");
45     }
46 
47     @Override
48     public void dismiss() {
49         super.dismiss();
50         MessageUtils.showInfo("MyPresentation....dismiss");
51     }
52 
53     @Override
54     protected void onCreate(Bundle savedInstanceState) {
55         super.onCreate(savedInstanceState);
56         setContentView(R.layout.presentation_content);
57         initData();
58         MessageUtils.showInfo("MyPresentation....savedInstanceState");
59     }
60 
61     private void initData() {
62         TextView mPresentationId = (TextView) findViewById(R.id.presentationIdTextView);
63         mPresentationId.setText("" + mdisplay.getDisplayId());
64     }
65 }
View Code

(3)顯示XiaoshubaoPresentation

 1   /**
 2      * 初始化輔屏顯示
 3      */
 4     private void initPresentation() {
 5         DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
 6         if (displayManager != null) {
 7             Display[] displays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
 8             for (Display display : displays) {
 9                 XiaoshubaoPresentation mPresentation = new XiaoshubaoPresentation(this, display);
10                 mPresentation.show();
11                 mPresentationListView.add(mPresentation);
12             }
13         }
14         TextView presentationCount=(TextView)findViewById(R.id.presentationCount);
15         presentationCount.setText("輔屏數量:"+mPresentationListView.size());
16     }
View Code

代碼說明:

  • DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);獲得displayManager對象,以便於獲得顯示屏幕的抽象對象Display。
  • Display[] displays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
    DISPLAY_CATEGORY_PRESENTATION:This category can be used to identify secondary displays that are suitable for
    * use as presentation displays such as HDMI or Wireless displays,即選擇可供Presentation顯示內容的Display。
  • XiaoshubaoPresentation mPresentation = new XiaoshubaoPresentation(this, display);//設置Presentation的呈現Display
  • mPresentation.show();//顯示Presentation

 (4)隱藏Presentation

  presentation.hide();

 (5)釋放Presentation資源

  presentation.dismiss();

、自定義Dialog顯示

大致思路:定義Style控制Dialog全屏顯示->定義Dialog XML佈局文件->自定義Dialog類文件->響應Dialog界面控制項事件。

(1)定義Dialog全屏顯示的Style

1     <style name="XiaoshubaoDialogStyle">
2         <item name="android:windowNoTitle">true</item>
3         <item name="android:windowFullscreen">true</item>
4     </style>
View Code

(2)Dialog佈局文件效果

               Dialog1效果

            Dialog2效果

(3)創建XiaoshubaoFirstDialog.java類文件

 1 package xiaoshubao.presentationdemo;
 2 
 3 import android.app.Dialog;
 4 import android.content.Context;
 5 import android.view.View;
 6 import android.widget.Button;
 7 
 8 /**
 9  * 作者:xiaoshubao
10  * 時間:2016/06/30
11  * 版本: V1.0
12  * 說明:
13  */
14 public class XiaoshubaoFirstDialog extends Dialog {
15     private Context context;
16     private XiaoshubaoFirstDialog dialog;
17 
18     public XiaoshubaoFirstDialog(Context context, int themeResId) {
19         super(context, themeResId);
20         this.context = context;
21         dialog = this;
22     }
23 
24     @Override
25     public void create() {
26         super.create();
27     }
28 
29     @Override
30     public void show() {
31         super.show();
32         initListener();
33     }
34 
35     /**
36      * 初始化控制項事件
37      */
38     private void initListener() {
39         Button createSecondDialogButton = (Button) findViewById(R.id.createSecondDialogButton);
40         createSecondDialogButton.setOnClickListener(btn_createSecondDialog);
41 
42         Button dismmisDialogButton = (Button) findViewById(R.id.dismmisDialogButton);
43         dismmisDialogButton.setOnClickListener(dismmisDialogOnclick);
44     }
45 
46     private View.OnClickListener btn_createSecondDialog = new View.OnClickListener() {
47         @Override
48         public void onClick(View v) {
49             XiaoshubaoSecondDialog secondDialog = new XiaoshubaoSecondDialog(context, R.style.XiaoshubaoDialogStyle);
50             secondDialog.setContentView(R.layout.dialog_second);
51             secondDialog.show();
52         }
53     };
54     private View.OnClickListener dismmisDialogOnclick = new View.OnClickListener() {
55         @Override
56         public void onClick(View v) {
57             dialog.dismiss();
58         }
59     };
60 }
View Code

(4)創建XiaoshubaoSecondDialog.java類文件

 1 package xiaoshubao.presentationdemo;
 2 
 3 import android.app.Dialog;
 4 import android.content.Context;
 5 import android.view.View;
 6 import android.widget.Button;
 7 
 8 /**
 9  * 作者:xiaoshubao
10  * 時間:2016/06/30
11  * 版本: V1.0
12  * 說明:
13  */
14 public class XiaoshubaoSecondDialog extends Dialog {
15     public XiaoshubaoSecondDialog(Context context, int themeResId) {
16         super(context, themeResId);
17         dialog=this;
18     }
19     private XiaoshubaoSecondDialog dialog;
20     @Override
21     public void create() {
22         super.create();
23     }
24 
25     @Override
26     public void show() {
27         super.show();
28         initListener();
29     }
30     /**
31      * 初始化控制項事件
32      */
33     private void initListener() {
34         Button dismmisDialogButton = (Button) findViewById(R.id.dismmisDialogButton);
35         dismmisDialogButton.setOnClickListener(dismmisDialogOnclick);
36     }
37     private View.OnClickListener dismmisDialogOnclick = new View.OnClickListener() {
38         @Override
39         public void onClick(View v) {
40             dialog.dismiss();
41         }
42     };
43 }
View Code

(5)設置Dialog控制項響應事件

 1  /**
 2      * 初始化控制項事件
 3      */
 4     private void initListener() {
 5         Button createSecondDialogButton = (Button) findViewById(R.id.createSecondDialogButton);
 6         createSecondDialogButton.setOnClickListener(btn_createSecondDialog);
 7 
 8         Button dismmisDialogButton = (Button) findViewById(R.id.dismmisDialogButton);
 9         dismmisDialogButton.setOnClickListener(dismmisDialogOnclick);
10     }
11 
12     private View.OnClickListener btn_createSecondDialog = new View.OnClickListener() {
13         @Override
14         public void onClick(View v) {
15             XiaoshubaoSecondDialog secondDialog = new XiaoshubaoSecondDialog(context, R.style.XiaoshubaoDialogStyle);
16             secondDialog.setContentView(R.layout.dialog_second);
17             secondDialog.show();
18         }
19     };
20     private View.OnClickListener dismmisDialogOnclick = new View.OnClickListener() {
21         @Override
22         public void onClick(View v) {
23             dialog.dismiss();
24         }
25     };
View Code

(6)顯示Dialog

1  public void btn_createDialogBtnClick(View v) {
2         mainDialog = new XiaoshubaoFirstDialog(this, R.style.XiaoshubaoDialogStyle); //設置全屏樣式
3         mainDialog.setContentView(R.layout.dialog_first); //設置dialog的佈局
4         mainDialog.show();//顯示dialog界面
5     }
View Code

(7)釋放Dialog資源

dialog.dismiss();
三、綜述
項目最終呈現的效果如上面預覽圖,重點是給初學Android的朋友瞭解多屏異顯及Dialog全屏顯示和事件響應。
DEMO下載地址

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

-Advertisement-
Play Games
更多相關文章
  • 使用AsyncTask開啟子線程獲取伺服器數據,更新界面UI 使用Thread和Handler非同步獲取信息 ...
  • 創建定時器會在一定的間隔後執行某些操作,一般大家會這樣創建定時器,這樣創建的定時,self對定時器有個引用,定時器對self也有個引用,造成了迴圈引用,最終造成了記憶體泄漏,如果定時器在做下載的操作就會一直下載。 解決辦法:首先創建NSTimer的這樣的一個分類:NSTimer+eocBlockSup ...
  • 9.Vsync第二部分 在上一篇中我們講到,視圖的刷新需要很多步驟, 本文將繼續分析這些過程。 9.1 handlerMessageInvalidate invalidate 字面意思就是使無效,更進一步就是當前的buffer已經無限,請刷新界面。 啥也沒乾,buffer已經無效,我換下一個,就是h ...
  • 交叉編譯 在一個平臺上去編譯另一個平臺上可以執行的本地代碼 cpu平臺 arm x86 mips 操作系統平臺 windows linux mac os 原理 模擬不同平臺的特性去編譯代碼 jni開發工具: ndk native develop kit NDK目錄 docs--幫助文檔 platfo ...
  • 1.編碼不對 a.對某文件或某工程更改編碼: 滑鼠移到工程名或文件名,右鍵->Properties->Resource->Text file enCoding ->更改編碼(GBK、UTF-8等)->Apply->OK退出 b.修改整個命名空間的編碼 eclipse菜單欄->Window->Pref ...
  • 看這篇博客時 "最快讓你上手ReactiveCocoa之基礎篇" 看到作者介紹鏈式編程那一塊,發現自己的鑽研精神不足。想想自己使用鏈式編程也有段時間了,對,就是 Masonry 庫。自己一直享受點語法帶來的效率提升,卻沒想過自己去照著實現一下,真是慚愧。 好吧,本著發現問題就要立即解決問題的一貫原則 ...
  • 工程在經過多人後,往往會出現較多的垃圾,導致打包出來的ipa文件偏大,有時候我們會通過清理代碼來給程式瘦身,而瘦身ipa效果明顯的,主要通過清理程式里的無用圖片。 推薦一個清理圖片的應用 https://github.com/tinymind/LSUnusedResources 直接打開運行,點擊B ...
  • JNI簡介 JNI (Java Native Interface),Java的本地介面 JNI是Java眾多開發技術中的一門,意在利用本地代碼,為Java程式提供 更高效,更靈活的拓展。應用場景包括:對運行效率敏感的演算法實現、跨平臺應用移植、調用系統的底層驅動、調用硬體等。儘管Java一貫以其良好的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...