项目中在进行耗时操作时,譬如网络请求,经常需要使用加载框,以下为一个简单的等待加载框的实现。
我们直接继承Dialog类,
public WaitingDialog(Activity activity, String content) {
this(activity, R.style.waiting_dialog_style, content);
}
public WaitingDialog(Activity activity, int theme, String content) {
super(activity, theme);
this.content = content;
setOwnerActivity(activity);
}
第一个构造将theme固定,以下仅做参考:
<!-- 默认窗口样式 -->
<style name="default_dialog_style" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<!-- 边框 -->
<item name="android:windowContentOverlay">@null</item>
<!-- 标题 -->
<item name="android:windowFullscreen">true</item>
<item name="android:backgroundDimEnabled">true</item>
<!-- 模糊 -->
</style>
<!-- 加载等待框样式 -->
<style name="waiting_dialog_style" parent="@style/default_dialog_style">
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowBackground">@drawable/bg_waiting_dialog_white</item>>
</style>
其中,backgroundDimEnabled属性表示弹出框时,屏幕其余区域是否变暗。
接下来,我们在onCreate中加载布局文件,进行设置提醒内容等操作。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.dialog_waiting);
initView();
}
private void initView() {
setCanceledOnTouchOutside(false);
waitingShow = (TextView) findViewById(R.id.pub_tv_waiting_show);
if (TextUtils.isEmpty(content)) {
waitingShow.setVisibility(View.GONE);
} else {
setContent(content);
}
}
@Override
public void setCanceledOnTouchOutside(boolean cancel) {
super.setCanceledOnTouchOutside(cancel);
}
@Override
public void setCancelable(boolean flag) {
super.setCancelable(flag);
}
/**
* 设置提醒内容
*/
public void setContent(String content) {
if (TextUtils.isEmpty(content)) {
waitingShow.setVisibility(View.GONE);
} else {
waitingShow.setVisibility(View.VISIBLE);
waitingShow.setText(content);
}
}
<ProgressBar
android:id="@+id/pub_pb_waiting"
android:layout_width="30dp"
android:layout_height="30dp"
android:indeterminateDrawable="@drawable/rotate_waiting" />
<TextView
android:id="@+id/pub_tv_waiting_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:textColor="@android:color/black"
android:textSize="19sp"/>
主体部分包含一个ProgressBar和一个TextView,其中interminateDrawable设置不定模式的背景样式。
我们将背景设为转动的“菊花”。
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/loading"
android:pivotX="50%"
android:pivotY="50%"/>
如此一来,加载的效果就是无限转“菊花”了。
最后,如果要设定点击back键的逻辑,可以通过自定义监听器实现:
public void setOnBackPressedListener(OnBackPressedListener listener) {
this.listener = listener;
}
@Override
public void onBackPressed() {
if (null != listener) {
listener.onBackPressed();
}
}
public interface OnBackPressedListener {
void onBackPressed();
}