0

Открываю AlertDialog, хочу чтобы был размытый фон следующим кодом:

 LayoutInflater inflater = getActivity().getLayoutInflater();
 View dialogView = inflater.inflate(R.layout.alert_label_editor, null);
 AlertDialog.Builder dialogBuilderForBack = new AlertDialog.Builder(getContext());
 dialogBuilderForBack.setTitle("Title");
 dialogBuilderForBack.setMessage("message");
 dialogBuilderForBack.setPositiveButton("Ok", null);
 AlertDialog alertDialogForBack = dialogBuilderForBack.create();
 alertDialogForBack.setView(dialogView);
 Bitmap map1 = takeScreenShot(getActivity());
 Bitmap fast1 = fastblur(map1, 10);
 final Drawable draw1 = new BitmapDrawable(getResources(),fast1);
 //alertDialogForBack.getWindow().setBackgroundDrawable(draw1);
 alertDialogForBack.getWindow().setGravity(Gravity.CENTER_HORIZONTAL);
 alertDialogForBack.show();

Открывается всё отлично!

Код методов для размытия экрана брал От сюда

введите сюда описание изображения

Как только раскоментирую строчку

 //alertDialogForBack.getWindow().setBackgroundDrawable(draw1);

Происходит следующее:

Происходит вот это

На такой способ как

alertDialogForBack.getWindow().setGravity(Gravity.CENTER);

Не реагирует! Что случается? почему добавление фона меняет поведение алерта?

задан 28 июн. 2020 в 11:59
1
  • 1
    Если вам дан исчерпывающий ответ, отметьте его как принятый нажав на галочку слева от него. Commented 31 июл. 2020 в 11:13

1 ответ 1

1

Один из вариантов размытия фона под диалогом нашел здесь, вот как должна выглядеть активность:

public class MainActivity extends AppCompatActivity {
 private AlertDialog dialogWhichDisplayAlert;
 private Dialog fakeDialogUseToGetWindowForBlurEffect;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }
 @Override
 public void onBackPressed() {
 fakeDialogUseToGetWindowForBlurEffect = new Dialog(MainActivity.this);
 // fakeDialogUseToGetWindowForBlurEffect.setContentView(R.layout.fakealert); // removed the content so not visible
 new BlurAsyncTask().execute();
 }
 class BlurAsyncTask extends AsyncTask<Void, Integer, Bitmap> {
 protected Bitmap doInBackground(Void...arg0) {
 Bitmap map = AppUtils.takeScreenShot(MainActivity.this);
 Bitmap fast = new BlurView().fastBlur(map, 10);
 return fast;
 }
 protected void onPostExecute(Bitmap result) {
 if (result != null){
 final Drawable draw=new BitmapDrawable(getResources(),result);
 Window window = fakeDialogUseToGetWindowForBlurEffect.getWindow();
 window.setBackgroundDrawable(draw);
 window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
 window.setGravity(Gravity.CENTER);
 fakeDialogUseToGetWindowForBlurEffect.show();
 // real one
 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialogCustom);
 builder.setTitle("Lets Blur");
 builder.setMessage("This is Blur Demo");
 builder.setCancelable(false);
 builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
 fakeDialogUseToGetWindowForBlurEffect.dismiss();
 dialog.cancel();
 }
 });
 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
 fakeDialogUseToGetWindowForBlurEffect.dismiss();
 dialog.cancel();
 }
 });
 dialogWhichDisplayAlert = builder.create();
 // position real dialogWhichDisplayAlert using Gravity.CENTER;
 dialogWhichDisplayAlert.requestWindowFeature(Window.FEATURE_NO_TITLE);
 WindowManager.LayoutParams wmlp = dialogWhichDisplayAlert.getWindow().getAttributes();
 wmlp.gravity = Gravity.CENTER;
 dialogWhichDisplayAlert.show();
 }
 }
 }
}

так же есть библиотека для ваших целей. Подобные вопросы: 1 и 2. Так же я бы вам советовал посмотреть в сторону обычного Dialog. У него можно установить свою разметку, которая будет похожа на системную, а потом установить размытый фон для подложки. Второй вариант:

dialog = new AlertDialog.Builder(WordCube.this)
 .setTitle(WordCube.this.getResources().getString(R.string.app_name))
 .setMessage(s)
 .setIcon(R.drawable.logo)
 .setPositiveButton(R.string.btn_close, null)
 .show();

и дальше устанавливаем размытие:

WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.dimAmount=0.0f;
dialog.getWindow().setAttributes(lp);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

Вот есть туториалы 1 и 2.

ответ дан 28 июн. 2020 в 15:04

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.