问题
只能从活动上下文显示对话框。
除了
TYPE_SYSTEM_ALERT
或
TYPE_APPLICATION_OVERLAY
,如果您的应用程序未向用户显示紧急通知,则不建议这样做。
解决方案
如果您有可用的活动上下文,则可以从任何类显示对话框,如
service
,则,
broadcast receiver
,甚至任何你想象的阶级。
这是我的变通方法,可以像我说的那样显示来自任何类的对话框。
下面是一个片段,我是如何显示来自任何类的对话框的。(
可以吗
更简单一点!
)
import android.app.Dialog;
import android.content.DialogInterface;
public class SampleClass {
void anyMethod() {
Dialog dialog = ApplicationContext.getInstance().showDialog("title", "yourMessage", "Cancel", "Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO: handle button 1 clicked
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO: handle button 2 clicked
}
});
}
}
现在,您将实现这一点。
1、生成将在android清单应用程序标记中注册的应用程序类
<application
android:name=".ApplicationContext"
...
>
...
</application>
2、在此应用程序类中,您将持有live activity对象。这对于显示对话框更有用。
应用程序上下文。JAVA
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
public class ApplicationContext extends Application {
private static ApplicationContext mInstance;
private Activity liveActivity;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
@Override
public void onTerminate() {
super.onTerminate();
mInstance = null;
}
public static synchronized ApplicationContext getInstance() {
return mInstance;
}
public Activity getLiveActivity() {
return liveActivity;
}
public void setLiveActivity(Activity liveActivity) {
this.liveActivity = liveActivity;
}
/*
* Show Dialog with Title, Message, Button1, Button2 with Button1 and Button2 Listener
*/
public AlertDialog showDialog(String title, String msg,
String btn1, String btn2,
DialogInterface.OnClickListener listener1,
DialogInterface.OnClickListener listener2) {
if (liveActivity == null) return null;
AlertDialog.Builder builder = new AlertDialog.Builder(liveActivity)
.setTitle(title)
.setMessage(msg)
.setCancelable(false)
.setPositiveButton(btn1, listener1);
if (btn2 != null)
builder.setNegativeButton(btn2, listener2);
AlertDialog alert = builder.create();
alert.show();
return alert;
}
}
再多走一步
3、您将通过此基本活动类扩展所有活动(如果您已经有了基本活动,则可以编辑您的基本活动)
import android.support.v7.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
ApplicationContext.getInstance().setLiveActivity(this);
}
@Override
protected void onPause() {
super.onPause();
ApplicationContext.getInstance().setLiveActivity(null);
}
}
给你!!!