这个dialog是专门针对网络处理的:在进行网络处理的时候,比如对某个文章点赞、评论等等。开始请求网络,就要有dialog提醒用户等待,这个时候,用户点击了返回键,此时,dialog就会消失,但是,请求网络,还在继续。正确的逻辑是,点击了返回键键,dialog消失,请求网络停止。
我这里用的是xUtils3,进行的网络请求。
中止xUtils3请求网络的方法是:
private Callback.Cancelable cancelable;
params.setCancelFast(true);//这句话可有可无,最好加上
cancelable=x.http().post(params, new Callback.CommonCallback<String>() {...});
最后,在合适的地方
if (cancelable != null) {
cancelable.cancel();
}
使用这个办法,会有一个警告
W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed.
解决办法我现在还不知道。因为是警告,不影响使用。有了解该警告的朋友,请指教
1、写一个回调接口
package com.chen.demo;
public interface DialogCallBackListener {
void ReceiveData(String flag);
}
2、写一个WaitingDialog,继承Dialog
package com.chen.demo;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;
public class WaitingDialog extends Dialog {
private String text;
public TextView txtView;
private String type = "";
private DialogCallBackListener dialogCallBackListener;
/**
* dialog显示的时候,监听返回键
*/
DialogInterface.OnKeyListener keylistener = new DialogInterface.OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
dismiss();
dialogCallBackListener.ReceiveData(type);
return true;
} else {
return false;
}
}
};
public WaitingDialog(Context context,DialogCallBackListener listener,String str) {
super(context, R.style.WaitingDialog);
dialogCallBackListener=listener;
type=str;
setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
setOnKeyListener(keylistener);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_waiting_dialog);
txtView = (TextView) findViewById(R.id.text_waiting_dialog);
txtView.setText(text);
}
public void setRoundName(String text) {
this.text = text;
if (txtView != null) {
txtView.setText(text);
}
}
}
3、WaitingDialog 中用到的style和布局文件有:
style
<style name="WaitingDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:background="@mipmap/loading_process_dialog_anim" >
<ProgressBar
android:id="@+id/pro_waiting_dialog"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp" />
<TextView
android:id="@+id/text_waiting_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_toRightOf="@id/pro_waiting_dialog"
android:text="正在加载"
android:textColor="#FF333333" />
</RelativeLayout>
4、MainActivity
注:我这里为了简单,就在一个activity中,写了3个按钮模拟,实际中,常见用法是,一个activity对应一个按钮,传过去当前activity的类名即可,以作标记区分
package com.chen.demo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity implements DialogCallBackListener{
private TextView tv_1;
private TextView tv_2;
private TextView tv_3;
private WaitingDialog waitDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_1 = (TextView) findViewById(R.id.tv_1);
tv_2 = (TextView) findViewById(R.id.tv_2);
tv_3 = (TextView) findViewById(R.id.tv_3);
tv_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
waitDialog = new WaitingDialog(MainActivity.this,MainActivity.this,"MainActivity_1");
waitDialog.setRoundName("111");
waitDialog.show();
}
});
tv_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
waitDialog = new WaitingDialog(MainActivity.this,MainActivity.this,"MainActivity_2");
waitDialog.setRoundName("222");
waitDialog.show();
}
});
tv_3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
waitDialog = new WaitingDialog(MainActivity.this,MainActivity.this,"MainActivity_3");
waitDialog.setRoundName("333");
waitDialog.show();
}
});
}
@Override
public void ReceiveData(String flag) {
if ("MainActivity_1".equals(flag)){
Log.i("chen","------------MainActivity_1--------------");
}
if ("MainActivity_2".equals(flag)){
Log.i("chen","------------MainActivity_2--------------");
}
if ("MainActivity_3".equals(flag)){
Log.i("chen","------------MainActivity_3--------------");
}
}
}
5、MainActivity中布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
<TextView
android:id="@+id/tv_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:text="第一个dialog"
android:textSize="25sp"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
<TextView
android:id="@+id/tv_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:text="第二个dialog"
android:textSize="25sp"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
<TextView
android:id="@+id/tv_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:text="第三个dialog"
android:textSize="25sp"/>
</RelativeLayout>
</LinearLayout>