不依賴具體activity彈出全域性性彈窗
阿新 • • 發佈:2019-02-14
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(R.drawable.ic); builder.setTitle("標題"); builder.setMessage("訊息"); builder.setPositiveButton(R.string.btn_update, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //增加按鈕,回撥事件 } ); builder.setCancelable(false);//彈出框不可以換返回鍵取消 AlertDialog dialog = builder.create(); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//將彈出框設定為全域性 dialog.setCanceledOnTouchOutside(false);//失去焦點不會消失 dialog.show();
3.利用WindowManager彈出懸浮窗
通過Context.getSystemService(Context.WINDOW_SERVICE)
可以獲得WindowManager物件。
每一個WindowManager物件都和一個特定的Display繫結。
想要獲取一個不同的display的WindowManager,可以用 createDisplayContext(Display)
來獲取那個display的Context,之後再使用:Context.getSystemService(Context.WINDOW_SERVICE)
來獲取WindowManager。
呼叫的是WindowManager繼承自基類的addView方法和removeView方法來顯示和隱藏視窗。
下面是簡單例項:
package com.mg.view.manager; import java.util.HashMap; import java.util.Map; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.FrameLayout; import com.mg.common.dispath.CommonAdvController; public abstract class BaseWindowManager { public WindowManager manager; public Context context; public LayoutParams params; public int PARAMS_TYPE; public boolean isFinish = false; public static Map<View, Integer> showViewMap = new HashMap<View, Integer>(); public String imagePath = ""; public Bitmap bitmap, bitmapCorner; public FrameLayout mContainer; public BaseWindowManager(Context context) { this.context = context; if (android.os.Build.VERSION.SDK_INT >= 19) { PARAMS_TYPE = LayoutParams.TYPE_TOAST; } else { PARAMS_TYPE = LayoutParams.TYPE_PHONE; } if (manager == null) { manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); } if (params == null) { params = new LayoutParams(); switch (getManagerType()) { case fallType: params.width = LayoutParams.WRAP_CONTENT; params.height = LayoutParams.WRAP_CONTENT; params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_LAYOUT_NO_LIMITS | LayoutParams.FLAG_NOT_FOCUSABLE; params.gravity = Gravity.TOP | Gravity.LEFT; params.format = PixelFormat.TRANSLUCENT; params.windowAnimations = android.R.style.Animation_Translucent; break; case floatType: params.width = LayoutParams.MATCH_PARENT; params.height = LayoutParams.WRAP_CONTENT; params.flags = LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | LayoutParams.FLAG_NOT_FOCUSABLE; params.format = PixelFormat.TRANSLUCENT; params.windowAnimations = android.R.style.Animation_Translucent; break; case coverType: params.width = LayoutParams.MATCH_PARENT; params.height = LayoutParams.MATCH_PARENT; params.gravity = Gravity.CENTER; params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL; params.format = PixelFormat.TRANSLUCENT; params.windowAnimations = android.R.style.Animation_Translucent; break; default: break; } params.type = PARAMS_TYPE; } } /** * 顯示View * */ public void onShowView(Intent intent) { CommonAdvController.getInstance(context).onStart(); isFinish = false; } /** * 獲取加入WindowManager的view * * @return */ public abstract View getShowView(); /** * */ public void finish() { onAdvFinish(); if (bitmapCorner != null) { bitmapCorner.recycle(); bitmapCorner = null; } if (bitmap != null) { bitmap.recycle(); bitmap = null; } View view = (View) getShowView(); if (view != null && showViewMap.containsKey(view)) { try { manager.removeViewImmediate(view); } catch (IllegalArgumentException e) { e.printStackTrace(); } showViewMap.remove(view); view = null; } clearManagerAllView(); System.gc(); } /** * 清楚所有managerview */ public synchronized void clearManagerAllView() { if (!showViewMap.isEmpty() && showViewMap.size() > 0) { for (View baseView : showViewMap.keySet()) { if (baseView != null) { manager.removeViewImmediate(baseView); } } showViewMap.clear(); } } /** * 結束顯示 * * @param intent */ public void onAdvFinish() { CommonAdvController.getInstance(context).onStop(); } /** * @author ChenDs floatType:浮窗型別 coverType:覆蓋型別 fallType:下墜型別 */ public enum ManagerType { floatType, coverType, fallType } public abstract ManagerType getManagerType(); }
4.利用透明樣式的activity實現全域性彈窗樣式
把activity樣式在AndroidManifest.xml中設定android:theme="@android:style/Theme.Translucent"樣式,然後通過啟動該activity即可,啟動activity程式碼例項如下:package com.mg.view.utils;
import android.content.Context;
import android.content.Intent;
import com.mg.view.ui.BaseUiActivity;
public class IntentUtils {
/**
* 獲取一個帶baseui的intent
*
* @param Context
* @return
*/
public static Intent getBaseUiIntent(Context Context, Class<?> cls) {
Intent intent = new Intent(Context, BaseUiActivity.class);
intent.putExtra(BaseUiActivity.EXTRA_KEY_UI_CLASS, cls.getName());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
return intent;
}
}
activity具體封裝程式碼樣例:
package com.mg.view.ui;
import java.lang.reflect.Constructor;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import com.mg.common.dispath.CommonAdvController;
import com.mg.view.manager.ActivityManager;
public class BaseUiActivity extends Activity {
public static String EXTRA_KEY_UI_CLASS = new String(new byte[] { 99, 108, 97, 115, 115, 86, 105, 101, 119, 78, 97, 109, 101 }); // classViewName
private BaseUiView mBaseUIVIew;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
// 反射建立物件
try {
Class<?> classType = Class.forName(intent.getStringExtra(EXTRA_KEY_UI_CLASS));
Constructor<?> con = classType.getConstructor(Context.class, Intent.class);
mBaseUIVIew = (BaseUiView) con.newInstance(this, intent);
} catch (Exception e) {
e.printStackTrace();
}
if (mBaseUIVIew == null) {
finish();
} else {
requestWindowFeature(Window.FEATURE_NO_TITLE);
if (mBaseUIVIew.setFullScreenSwitch()) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
setContentView(mBaseUIVIew);
ActivityManager.getManager().addActivity(this);
mBaseUIVIew.getIntentData(getIntent());
mBaseUIVIew.onCreate();
}
}
@Override
protected void onStart() {
super.onStart();
CommonAdvController.getInstance(this).onStart();
if (mBaseUIVIew != null) {
mBaseUIVIew.onStart();
}
}
@Override
protected void onResume() {
super.onResume();
if (mBaseUIVIew != null) {
mBaseUIVIew.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if (mBaseUIVIew != null) {
mBaseUIVIew.onPause();
}
}
@Override
protected void onStop() {
super.onStop();
CommonAdvController.getInstance(this).onStop();
if (mBaseUIVIew != null) {
mBaseUIVIew.onStop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mBaseUIVIew != null) {
mBaseUIVIew.onDestroy();
}
if (ActivityManager.getManager().hasActivity()) {
ActivityManager.getManager().removeCurrentActivityStack();
}
System.gc();
mBaseUIVIew = null;
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (mBaseUIVIew != null) {
mBaseUIVIew.onNewIntent(intent);
}
}
@Override
public void onBackPressed() {
if (mBaseUIVIew != null && mBaseUIVIew.setBackPressedSwitch()) {
super.onBackPressed();
return;
}
if (mBaseUIVIew != null) {
mBaseUIVIew.onBackPressed();
}
}
@Override
public void finish() {
super.finish();
}
}
轉載請說明出處:http://blog.csdn.net/u012438830/article/details/78451575以上是全部事例,具體實現請根據各自的需求實現。 下面是本人的具體程式碼事例demo,需要的到請下載