最近发现一个比较作弊的方法来显示dialog、提示之类的view。
就是预先写在layout布局中并隐藏,在需要的时候显示出来。
so,自己写了个自定义view,来达到加载中dialog并屏蔽下层view点击效果的目的。
DEMO地址:自定义加载中View
下面是具体代码:
/** * 自定义不能点击外面的进度条 * * @author violetjack */ public class NoOutsideProgressDialog extends FrameLayout { private ProgressBar pb; private TextView tvProgress, tvDescription; public NoOutsideProgressDialog(Context context) { this(context, null); } public NoOutsideProgressDialog(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { LayoutInflater.from(context).inflate(R.layout.no_outside_progress_dialog, this); pb = (ProgressBar) this.findViewById(R.id.progressbar_no_outside_progress_dialog); tvProgress = (TextView) this.findViewById(R.id.textview_progress_no_outside_progress_dialog); tvProgress.setText("0%"); tvDescription = (TextView) this.findViewById(R.id.textview_description_no_outside_progress_dialog); setVisibility(GONE); } public void setProgress(int progress) { pb.setProgress(progress); String percent = progress + "%"; tvProgress.setText(percent); } public void setDescription(String description) { tvDescription.setText(description); } public void showDialog() { setVisibility(VISIBLE); } public void dismissDialog() { setVisibility(GONE); } @Override public boolean onTouchEvent(MotionEvent event) { if (getVisibility() == VISIBLE) { return true; } return false; } }
原理很简单:
1. 将几个android原生view控件组装在FrameLayout中。
2. 封装了几个方法供外部调用。
3. 使用onTouchEvent的返回值决定是否拦截下层View的点击事件。return true就能屏蔽。