1. 程式人生 > >Android彈出Window提示框(基於Android6.0)

Android彈出Window提示框(基於Android6.0)

在專案中經常會需要應用彈出一些自定義的視窗,這時候Android自帶的系統Dialog就無法滿足我們的需求了,為了滿足專案需求,我們可以使用Window來滿足這一需求。

首先我們新建一個專案,來到MainActivity的佈局檔案,在這裡新建一個按鈕用於彈出Window

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height
="match_parent">
<Button android:id="@+id/btn_window" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="open window"/> </LinearLayout>

接著我們完成window的佈局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout android:paddingLeft="10dp" android:background="@android:color/darker_gray" android:orientation="vertical" android:layout_width
="300dp" android:layout_height="200dp">
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="發件人——13110203356" android:textSize="18sp" android:textColor="@color/colorPrimary"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:layout_marginTop="5dp" android:text="這裡是內容" android:textSize="15sp" android:textColor="@color/colorAccent"/> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="按鈕" android:layout_gravity="right"/> </LinearLayout> </LinearLayout>

這個佈局實際上類似於簡訊提示框,效果如下
這裡寫圖片描述
之後在MainActivity中完成彈出Window的邏輯,首先我們要知道在Android6.0之前,使用Window只需要宣告許可權<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>即可,但是從Android6.0開始,應用要想彈出一個懸浮在任意App上的Window的話需要使用者手動為這個應用設定overlays許可權,這個許可權就連執行時許可權也無法拿到,必須要使用者前往手機的許可權介面為應用設定該許可權,因此在彈出window之前我們首先要進行一個邏輯判斷,判斷使用者是否已經獲取過overlays許可權,如果獲取了許可權就直接彈出window,若沒有獲取過overlays許可權則會自動將介面跳轉到許可權設定介面,讓使用者決定是否提供該許可權,最後,程式碼如下

public class MainActivity extends AppCompatActivity
{
    private Button btn_window;
    private Button btn_send;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_window= (Button) findViewById(R.id.btn_window);
        btn_window.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M)
                {
                    //版本大於6.0則需要判斷是否獲取了overlays許可權
                    if (!Settings.canDrawOverlays(MainActivity.this))
                    {
                        startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                Uri.parse("package:"+getPackageName())),1);
                    }
                    else
                    {
                        openWindow();
                    }
                }
            }
        });
    }

    private void openWindow()
    {
        //獲取WindowManager例項
        final WindowManager windowManager= (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        //獲取窗口布局引數例項
        WindowManager.LayoutParams params=new WindowManager.LayoutParams();
        //設定窗口布局引數屬性
        params.width= WindowManager.LayoutParams.MATCH_PARENT;
        params.height=WindowManager.LayoutParams.MATCH_PARENT;
        //設定window的顯示特性
        params.flags=WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
        //設定視窗半透明
        params.format= PixelFormat.TRANSLUCENT;
        //設定視窗型別
        params.type=WindowManager.LayoutParams.TYPE_PHONE;
        //獲取窗口布局例項
        final View windowView=View.inflate(this,R.layout.window,null);
        //獲取窗口布局中的按鈕例項
        btn_send= (Button) windowView.findViewById(R.id.btn_send);
        //設定點選事件
        btn_send.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                windowManager.removeView(windowView);
            }
        });
        //顯示視窗
        windowManager.addView(windowView,params);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        switch (requestCode)
        {
            case 1:
            {
                if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M)
                {
                    if (Settings.canDrawOverlays(this))
                    {
                        //若使用者開啟了overlay許可權,則開啟window
                        openWindow();
                    }
                    else
                    {
                        Toast.makeText(this,"不開啟overlay許可權",Toast.LENGTH_SHORT).show();
                    }
                }
                break;
            }
        }
    }
}

最後的效果如下,當然別忘了在Android6.0後也是需要在Manifest檔案中宣告許可權的

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

這裡寫圖片描述

相關推薦

AndroidWindow提示(基於Android6.0)

在專案中經常會需要應用彈出一些自定義的視窗,這時候Android自帶的系統Dialog就無法滿足我們的需求了,為了滿足專案需求,我們可以使用Window來滿足這一需求。 首先我們新建一個專案,來到MainActivity的佈局檔案,在這裡新建一個按鈕用於彈出W

delphi messagebox 資訊提示大全

1. 警告資訊框 MessageBox(Handle,'警告資訊框','警告資訊框',MB_ICONWARNING); 2.疑問資訊框 MessageBox(Handle,'疑問資訊框','疑問資訊框',MB_ICONQUESTION); 3.錯誤提示框 MessageBox(Handle,'錯誤資訊框'

android多選

JAVA程式碼: package com.meiguihuayu; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterfa

解決PL/SQL Dev連線Oracle空白提示

第一次安裝Oracle,裝在虛擬機器中,用PL/SQL Dev連線遠端資料庫的時候老是彈出空白提示框,網上找了很久,解決方法也很多,可是就是沒法解決我這種情況的。 沒辦法,只能自己研究,經過大概一天時間吧,還是搞好了,寫個總結。 出現這種問題,解決方法大概有這幾

ajax呼叫後臺實現檔案下載,不下載提示,無法下載

在做ajax呼叫後臺實現檔案下載時,出現了後臺返回前端正確資料,但前臺就是不提示下載框,且沒有下載檔案 $.ajax({ "url" : urlStr + 'exportFile', "method" : "POST", "data" : { "list

下載檔案,並儲存提示,選擇位置,絕對路徑 or相對路徑

1.因為Aiax不能返回流 所以用js表單提交發送請求 var form = document.createElement("form");document.body.appendChild(form);var nameInput = document.createEle

java Swing提示

package com.sanguo.test; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; imp

訊息提示確認取消,物品獲得提示

一、 彈出提示框 Globals.MUIManager.CreatMessageLabel("支付失敗"); public T GetUI<T>() where T : HotFix_Project.UI.UI_Logic

css實現熱點地圖map,滑鼠移到熱點提示

標籤: <div class="ConDiv"> <img border="0" usemap="#Map" src="images/dt_04.png" />

cell上 button點選資訊提示

-(IBAction)onWarnInfo:(id)sender{ <span style="white-space:pre"> </span>UIButton *btn=(UIButton *)sender; N

[UWP]在應用退出時確認提示

1. 需求 在應用退出時(點選右上角的關閉按鈕)彈出一個確認按鈕可以說是一個最常見的操作了,例如記事本的“你是否儲存”: 但這個功能在UWP上居然有點小複雜。這篇文章將解釋如何實現這個功能。 2. CloseRequested 為了監視應用退出事件,我本來使用了CoreApplication.Exitin

Android LemonBubble提示控制元件

簡介:這是一個完全Made in China的炫酷彈出指示層Android版本(-_-#意思就是還有iOS的),他能讓你快速的自定義任何樣式的彈出框 最新更新記錄: 捕捉了LemonBubble.forceHide()中的空指標異常,保證開發者在onDestroy

Android EditText軟鍵盤實現頁面標題頭不動,軟鍵盤在編輯下面

為了實現EditText編輯的時候彈出軟鍵盤標題頭不動,底部編輯框上移,想了好多種方法,也百度,問同事每種辦法都有問題,在這總結一下,希望能幫助到大家。 上圖看下效果: 可以看到彈出鍵盤的時候,只有EditText在軟鍵盤上面,還有一個藍色點,這個隨後再說。 用Relative

android webview無法select選擇

問題描述: h5頁面裡面有個select標籤,安卓app裡的webview裡面點選的時候預設會拉起一個原生的框,但是在筆者的app上,怎麼點都沒反應,控制檯也沒日誌,也不報錯,經過一段時間的的排查,

android-鍵盤以及輸入的設定

1、開啟Activity時先不彈出鍵盤 解決方案: 在AndroidManifest.xml中設定Activity與鍵盤的互動模式,即android:windowSoftInput屬性,它能影響兩個地方:  1、產生焦點時,軟鍵盤是否隱藏;  2、是否減少活動主視窗大小以

java中如何實現在手機裡安卓,提示

public void onClick(View v) {       // TODO Auto-generated method stub       new AlertDialog.Builder(this).setTitle("請遵守華為遊戲中心服務條款,安裝華為遊戲

Android中webview無法檔案選擇,點選按鈕沒反應的問題

以前寫的專案時,遇到過這樣一個問題,在ios和微信都可以,就是android不行,尷尬的,無論你多使勁點都發現無法彈出安卓原生檔案選擇介面,簡直要崩潰了最後通過一番資料查詢,發現要重寫WebChrome

Android安卓WebApp中 全屏和普通模式下 webview中軟鍵盤擋住輸入 解決方案

最近公司開發的WEBAPP遇到了一個比較噁心的問題。就是在webview中當需要輸入內容時,軟鍵盤彈起後,擋住了輸入框,試了很多辦法都不太滿意。(這裡要吐槽下,人家IOS端,蘋果系統都給直接封裝好了,

android 選擇,簡單通用選擇

LinearLayout ll =(LinearLayout)getActivity().findViewById(R.id.log_sel_qyport); ll.setOnClickListener(new View.OnClickListener() {

delphi信息大全

show question 修改 可選參數 說明 mask lose itl 位置 1. 警告信息框 MessageBox(Handle,‘警告信息框‘,‘警告信息框‘,MB_ICONWARNING);2.疑問信息框 MessageBox(Handle,‘疑問信息框‘,‘疑