Диалог выхода из Cusum в Android

Я хочу создать настраиваемое диалоговое окно выхода с тремя изображениями, которые изображения загружаются с сервера. Диалог покажет, если я нажму кнопку "Назад". Мне показывают диалог, но изображения, полученные с сервера, не отображаются, отображаются изображения по умолчанию. URL-адрес изображения успешно получен с сервера. Если я размещу этот URL в моем imageView, генерируется исключение:

AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.madnanijaz.labassignment1, PID: 2967 java.lang.NullPointerException: Аргумент не должен быть нулевым в com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:27) com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:22) в com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:383) в com.example.madnanijaz.labassignment1.MainActivity$7.onResponse.java:181) на com.example.madnanijaz.labassignment1.MainActivity$7.onResponse(MainActivity.java:170)

Мой код кнопки Back Pressed:

@Override
public void onBackPressed() {

    //Fetching Images(Adds from server)
    fetchingAddsFromServer();

    //CustomAlertDialog

    final AlertDialog.Builder builder=new 
   AlertDialog.Builder(MainActivity.this);
    View view= 
  LayoutInflater.from(MainActivity.this).inflate(R.layout.row_layout,null);

    builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            finish();
        }
    });
    builder.setPositiveButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            dialogInterface.dismiss();
        }
    });

    builder.setView(view);
    builder.show();

   // AlertDialog alertDialog=builder.create();
    //alertDialog.show();

}

  private void fetchingAddsFromServer() {

    StringRequest request= new StringRequest(URL, new 
    Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject object= new JSONObject(response);
                JSONArray jsonArray=object.getJSONArray("slots");

                    JSONObject jsonObject=jsonArray.getJSONObject(1);
                Toast.makeText(MainActivity.this, "Image Url 
     is:"+jsonObject.getString("imgurl"), Toast.LENGTH_LONG).show();
               // String ImgURI=jsonObject.getString("imgurl");

  Glide.with(getApplicationContext()).load(jsonObject.getString("imgurl")).into(c 
       losingDialogImageTwo);

                //}

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    RequestQueue queue= Volley.newRequestQueue(MainActivity.this);
    queue.add(request);

Я думаю, что это ошибка пользовательского макета. У меня есть один ImageView на главном экране. если я использую Glide с этим, он работает нормально, но если использовать Glide с пользовательским макетом диалога, это дает мне эту ошибку, которая упоминается.

1 ответ

Следующая ошибка:

AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.madnanijaz.labassignment1, PID: 2967 java.lang.NullPointerException: Аргумент не должен быть нулевым в com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:27) com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:22) в com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:383) в com.example.madnanijaz.labassignment1.MainActivity$7.onResponse.java:181) на com.example.madnanijaz.labassignment1.MainActivity$7.onResponse(MainActivity.java:170)

происходит потому, что вы пытаетесь загрузить изображение в closingDialogImageTwo с этим:

Glide.with(getApplicationContext()).load(jsonObject.getString("imgurl")).into(c losingDialogImageTwo);

но вы еще не инициализировали представление. Поскольку изображение находится внутри настраиваемого представления для диалогового окна, его необходимо инициализировать после надувания представления. Который после следующего кода:

View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.row_layout,null);

с этим:

ImageView closingDialogImageTwo = view.findViewById(R.id.your_image_id);

Вам нужно загрузить изображение только после того, как fetchingAddsFromServer() Метод завершил извлечение изображения из-за его асинхронного поведения.

Подводя итог, вам нужно переместить создание AlertDialog в fetchingAddsFromServer как это:

private void fetchingAddsFromServer() {
    StringRequest request= new StringRequest(URL, new 
    Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

          ...  
          // assuming you got the image.
          String imageUrl = jsonObject.getString("imgurl");

          showDialogWithImage(imageUrl);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    RequestQueue queue= Volley.newRequestQueue(MainActivity.this);
    queue.add(request);
}


private void showDialogWithImage(String imageUrl) {
  final AlertDialog.Builder builder= new AlertDialog.Builder(MainActivity.this);
  View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.row_layout,null);

  ImageView closingDialogImageTwo = view.findViewById(R.id.your_image_id);

  Glide.with(getApplicationContext())
       .load(imageUrl).into(closingDialogImageTwo);

  builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            finish();
        }
    });
    builder.setPositiveButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            dialogInterface.dismiss();
        }
    });

    builder.setView(view);
    builder.show();
}
Другие вопросы по тегам