今天在手机上有看到类似于这个
已收藏这一栏,原本还以为是个toast,但是翻阅了一下源码结果发现toast并没有监听这个功能
那这个时候怎么办呢,对了,就是用dialog
//此dialog直接用来做收藏功能提示 public class ToastDetailDialog extends BaseDialog implements View.OnClickListener{ private LeaveMyDialogListener listener; private TextView text_title; private TextView text_content; /** 监听器 */ public ToastDetailDialog(Context context) { super(context); } /** 监听器 */ public ToastDetailDialog(Context context, LeaveMyDialogListener listener) { super(context); /** * 记得判空,不然会报空指针 */ if(listener ==null){ return; } this.listener = listener; } @Override public void onClick(View v) { if(listener == null){ return; } listener.onClick(v); } public interface LeaveMyDialogListener{ public void onClick(View view); } @Override protected int getLayoutId() { return R.layout.toast_custom_view; } @Override protected void findViews() { text_title = (TextView) findViewById(R.id.title); text_content = (TextView) findViewById(R.id.content); text_title.setText("已收藏"); text_content.setText(",点击查看"); text_content.setOnClickListener(this); } public void setListener(LeaveMyDialogListener listener){ this.listener = listener; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/linear" android:background="@drawable/rounded_edittext2" android:gravity="center_horizontal" android:orientation="horizontal" android:padding="10dp"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/white" android:layout_marginLeft="12dp" android:textSize="16dp" tools:text="asdsad" /> <ImageView android:visibility="gone" android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:contentDescription="@string/app_name" tools:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="10dp" android:textSize="16dp" android:textColor="#358ff0" tools:text="aweqwewqewqe" /> </LinearLayout>
@drawable/rounded_edittext2:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#666666"></solid> <corners android:radius="18dp" /> </shape>
就是这样,然后性质啵啵的写完了,点击验证了一下,发现不对,有问题
/** * 原本是想说用toast来做这个事情,但是居然toast没有监听,所以就采用dialog来做 */ dialog = new ToastDetailDialog(DetailContentActivity.this); dialog.setListener(new ToastDetailDialog.LeaveMyDialogListener() { @Override public void onClick(View view) { CollectionActivity.start(DetailContentActivity.this); } }); dialog.show();
运行居然是这样的
背景有个透明的东西,这不就让别人知道我们用的是dialog嘛,哈哈
这回怎么办呢,没关系,作为程序猿都会有办法
dialog.getWindow().setDimAmount(0f);对了就是这句话,我们再运行看看
好像可以了哦!!!但是会发现这时候dialog 如果不去点击他不会消失,这时候想给读者像toast一样的感觉,这时候怎么办呢
哈哈,就是用线程啦!我们让他延迟3秒
new Handler().postDelayed(new Runnable(){ // // public void run() { // //execute the task // dialog.dismiss(); // } // // }, 3000);
//原本要使用以上线程但是会出现内存泄露
这时候就要用到弱引用啦
Constant.SWITCH_DETAILTIVITY 这个呢在Constant里面大家可以定义一个int类型就好了,哈哈就在下面这个啦
public final static int SWITCH_DETAILTIVITY = 1;
private DetailContentActivity.MyHandler mHandler = new DetailContentActivity.MyHandler(DetailContentActivity.this);
private class MyHandler extends Handler{
private final WeakReference<DetailContentActivity> weakReference;
public MyHandler(DetailContentActivity activity){
weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what ==Constant.SWITCH_DETAILTIVITY){
if(weakReference.get()!=null){
dialog.dismiss();
}
}
}
}
详细代码在这里哦
/** * 原本是想说用toast来做这个事情,但是居然toast没有监听,所以就采用dialog来做 */ dialog = new ToastDetailDialog(DetailContentActivity.this); dialog.getWindow().setDimAmount(0f);//设置dialog背景全透明 dialog.setListener(new ToastDetailDialog.LeaveMyDialogListener() { @Override public void onClick(View view) { CollectionActivity.start(DetailContentActivity.this); } }); dialog.show(); mHandler.sendEmptyMessageDelayed(Constant.SWITCH_DETAILTIVITY,3000);