关于弹窗:自定义PopuWindow和Toast

来源:互联网 发布:淘宝收纳柜抽屉柜塑料 编辑:程序博客网 时间:2024/06/08 11:36

最近做项目要求有弹窗,效果如下
这里写图片描述
我想到popuWindow 但是有bug,就是弹出次数比较多的时候,它就不消失了。项目组iOS的小伙伴也被同样问题困扰,经讨论有两种解决思路:
1,如果pop.isShowing让其他控件不可选,
2,铺满屏幕,中心黑色,其他都透明
我还没来得及试试。

想到另一种就是吐司,一样一样说:

先把popuWindow代码贴出来:(文中所有源码下载链接都会在文末提供)

PopuUtils.java

package com.example.ylwang.popuwindowdemo;import android.content.Context;import android.os.Handler;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.widget.PopupWindow;import android.widget.TextView;/** * Created by ylwang on 2016/5/20. */public class PopuUtils {    private Context context;    private View anchor;//锚,就是为了弹窗的定位    private PopupWindow pop;    private Handler handler = new Handler();    private Runnable runnable = new Runnable() {        @Override        public void run() {            pop.dismiss();        }    };    public PopuUtils(View anchor, Context context) {        this.anchor = anchor;        this.context = context;    }    /**     * @param tips     输入提示框的内容     * @param duration 显示时间,单位:ms     */    public void show(String tips, int duration) {        View contentView = LayoutInflater.from(context).inflate(R.layout.popuwindow, null);        TextView textView = (TextView) contentView.findViewById(R.id.tv_popu);        textView.setText(tips);        pop = new PopupWindow(contentView, 320, 110);        pop.showAtLocation((View) anchor.getParent(), Gravity.CENTER, 0, 0);        pop.update();//必须添加 否则不显示        handler.postDelayed(runnable, duration);    }}

MainActivity.java

package com.example.ylwang.popuwindowdemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends Activity implements View.OnClickListener {    private Button btn_show;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private <T> T f(int id) {        return (T) findViewById(id);    }    private void init() {        btn_show = f(R.id.btn_show);        btn_show.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_show:                new PopuUtils(btn_show, this).show("随机播放", 1000);                break;            default:                break;        }    }}

main_activity.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    >    <Button        android:id="@+id/btn_show"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="弹出popuWindow" /></RelativeLayout>

drawable中新建一个根目录为shape的xml文件:my_corner_shape.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">    <solid android:color="#b3000000" />    <corners android:radius="20px" />    <padding        android:bottom="0dp"        android:left="0dp"        android:right="0dp"        android:top="0dp" /></shape>

popuWindow的布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="160dp"    android:layout_height="55dp"    android:background="@drawable/my_corner_shape"    android:orientation="vertical">    <TextView        android:id="@+id/tv_popu"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:gravity="center"        android:textColor="#ffffff"        android:textSize="20sp" /></LinearLayout>

再说说Toast方法:
注意代码有公用的:
1,popuWindow.xml
2,my_corner_shape.xml

CenterToast.java代码

package com.example.ylwang.toastdemo;import android.content.Context;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.widget.TextView;import android.widget.Toast;import java.util.Timer;import java.util.TimerTask;/** * Created by ylwang on 2016/5/20. */public class CenterToast {    private Toast toast;    private TextView textView;    public CenterToast(Context context) {        View convertView = LayoutInflater.from(context).inflate(R.layout.popuwindow, null);        textView = (TextView) convertView.findViewById(R.id.tv_popu);        toast = new Toast(context);        toast.setGravity(Gravity.CENTER, 0, 0);        toast.setDuration(Toast.LENGTH_LONG);        toast.setView(convertView);    }    /**     * @param tips     要显示的内容     * @param duration 显示时间 单位:ms     */    public void showMyToast(String tips, final int duration) {        textView.setText(tips);        final Timer timer = new Timer();        timer.schedule(new TimerTask() {            @Override            public void run() {                toast.show();            }        }, 0, 3000);        new Timer().schedule(new TimerTask() {            @Override            public void run() {                toast.cancel();                timer.cancel();            }        }, duration);    }}

MainActivity.java

package com.example.ylwang.toastdemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends Activity implements View.OnClickListener {    private CenterToast centerToast;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        centerToast = new CenterToast(this);        Button btnShow = (Button) findViewById(R.id.btn_toShow);        btnShow.setOnClickListener(this);    }    @Override    public void onClick(View v) {        centerToast.showMyToast("我的自定义Toast", 1000);    }}

主界面布局文件代码

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <Button        android:id="@+id/btn_toShow"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="弹出我的自定义土司" /></RelativeLayout>

关于Toast代码的文字参考可以点击这个链接:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0302/945.html 另外推荐一篇科普文《几种Toast的基本用法》http://jileniao.net/android-toast-displaytime.html

另外有个关于Toast的工具类:
点点点时候,避免了界面都关了,吐司还在自嗨中,一直弹弹弹

import android.content.Context;import android.os.Handler;import android.widget.Toast;/** * Toast 每次创建Toast时先做一下判断, * 如果前面有Toast在显示,只需调用Toast中的setText()方法将要显示的信息替换即可 * 避免了界面都关了,吐司还在自嗨中,一直弹弹弹 */public class CustomToast {    private static Toast mToast;    private static Handler mHandler = new Handler();    private static Runnable r = new Runnable() {        public void run() {            mToast.cancel();        }    };    public static void showToast(Context mContext, String text, int duration) {        mHandler.removeCallbacks(r);        if (mToast != null)            mToast.setText(text);        else            mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT);        mHandler.postDelayed(r, duration);        mToast.show();    }    public static void showToast(Context mContext, int resId, int duration) {        showToast(mContext, mContext.getResources().getString(resId), duration);    }}

本文中源码下载链接:
1,PopuWindow的:http://download.csdn.net/detail/iblade/9526533
2,ToastDemo的:http://download.csdn.net/detail/iblade/9526538

1 0
原创粉丝点击