错误场景一:
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog();
}
});
}
private void showDialog() {
/**
* 这里不能使用getApplicationContext(),否则会报错。
* 要传入当前Activity来添加这个窗体,将getApplicationContext()改成this即可
*/
new AlertDialog.Builder(getApplicationContext())
.setIcon(android.R.drawable.ic_dialog_info)
.setTitle("演示")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).create().show();
}
}
报错信息如下:
问题原因:Dialog的context不能传入getApplicationContext(),它要依赖于activity。
解决方案:将其改成this即可。
错误场景二:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.PopupWindow;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_test, null);
PopupWindow popupWindow = new PopupWindow(MainActivity.this);
popupWindow.setContentView(contentView);
popupWindow.setWidth(400);
popupWindow.setHeight(200);
popupWindow.setTouchable(true);
popupWindow.showAsDropDown(contentView);
}
}
问题原因:PopupWindow弹窗不能直接在Activity的onCreate函数里执行,必须要等activity的生命周期函数全部执行完毕之后,需要依附的View加载完成了才可以。
解决方案:在public void onWindowFocusChanged(boolean hasFocus){}函数中调用,或单独开启一个线程去调用
错误场景三:
import android.app.Dialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private Dialog mDialog;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化对话框
mDialog = new Dialog(this);
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_test, null);
mDialog.setContentView(contentView);
mDialog.setTitle("演示");
// 启动异步任务
new MyTask().execute();
// 结束当前界面
finish();
}
private class MyTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// 显示对话框
mDialog.show();
}
}
}
问题原因:有时候我们的activity已经被finish掉了,但是异步任务却还在跑,并且执行完异步任务后就弹窗,可是依附他的activity已经不存在了。
解决方案:在弹窗前先判断好当前界面是已经否被结束掉了: if (!isFinishing()) { mDialog.show(); }
版权声明:本文为u011038298原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。