Проблема
Вы можете отображать диалоги только из контекста действия. кроме 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 manifest
<application
android:name=".ApplicationContext"
...
>
...
</application>
2.В этом классе приложения вы будете держать объект живой активности.это будет полезно для отображения диалогового окна.
ApplicationContext.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);
}
}
Вот, пожалуйста, *