用Dialog实现的主动弹出式气泡

       最近项目中需要做一个异常处理,就是在用户上次异常退出程序后下次进入时给出一个气泡提示。网上有很多气泡的实现方式是基于地图开发时的,也有是基于popwindow来做的,基于map做的是不适用于我这种情况的,开始先用popwindow做了一个,但发现它只能被动的调出。不满足当前需求。通过研究自己用dialog实现了一个主动弹出的气泡,与大家分享下~~先上图哈~~无图无真相~~

用Dialog实现的主动弹出式气泡_第1张图片

实现思路:

这个主要就是给Dialog定义了一个样式,然后利用TextView的setMinWidth()和setMaxWidth()来限制弹出气泡的大小,再通过获取Dialog所在window来设置它的LayoutParams中的x y坐标来控制在屏幕中显示的位置。


package com.ayj.bubble;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.text.Html;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView;

public class TestBubbleActivity extends Activity {

	/** 全局屏幕的高和宽 */
	private static int SCREEN_WIDTH = 0 ;
	private static int SCREEN_HEIGHT = 0;
	
	/**气泡view*/
    private View bubbleView = null;
    /**气泡dialog*/
    private Dialog bubbleAlert = null;
    
    /**我知道了*/
	private TextView tvKnow = null;
	/**气泡显示内容*/
	private TextView tvBubContent = null;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        getDimension();
        
        bubbleView = getLayoutInflater().inflate(R.layout.overlay_pop, null);
		tvKnow = (TextView)bubbleView.findViewById(R.id.bubble_btn);
		tvKnow.setText(Html.fromHtml("<u>"+"我知道了"+"</u>"));
		tvBubContent = (TextView)bubbleView.findViewById(R.id.bubble_text);
		tvBubContent.setText("上次程序异常退出,正在传输历史数据...");
		
		tvKnow.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v) {
				bubbleAlert.cancel();
			}
			
		});

		int tmpWidth = SCREEN_WIDTH/5*3;
		int tmpHeight =SCREEN_HEIGHT/8;
		System.out.println("tmpWidth=****=" + tmpWidth);
		System.out.println("tmpHeight=++++=" + tmpHeight);
		
		//设置TextView宽度
		tvKnow.setMinWidth(tmpWidth);
		tvBubContent.setMaxWidth(tmpWidth);
		//以指定的样式初始化dialog
		bubbleAlert = new Dialog(this,R.style.bubble_dialog);
        Window win = bubbleAlert.getWindow();//获取所在window
		LayoutParams params = win.getAttributes();//获取LayoutParams
		params.x = -(SCREEN_WIDTH/8);//设置x坐标
		params.y = -tmpHeight;//设置y坐标
		params.width = tmpWidth;
		
		win.setAttributes(params);//设置生效

		bubbleAlert.setCancelable(false);
		bubbleAlert.setContentView(bubbleView);
		bubbleAlert.show();
    }
    
	/**
	 * 获取屏幕尺寸
	 */
	private void getDimension(){
		/** 获取屏幕的宽和高 */
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);

		SCREEN_WIDTH = dm.widthPixels;
		SCREEN_HEIGHT = dm.heightPixels;
	}
    
}

Style文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="bubble_dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">false</item>
	</style>
</resources>


这里只贴出核心代码了,其他代码自己可以下载源代码研究下。

欢迎大家多多交流。

提供源代码下载 :点击打开链接



你可能感兴趣的:(用Dialog实现的主动弹出式气泡)