Кускум диалог выхода в Android - PullRequest
0 голосов
/ 10 октября 2018

Я хочу создать настраиваемое диалоговое окно выхода с тремя изображениями, которые изображения загружаются с сервера.Диалог покажет, если я нажму кнопку «Назад».Мне показывают диалог, но изображения, полученные с сервера, не отображаются, отображаются изображения по умолчанию.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 (MainActivity.java:181) на com.example.madnanijaz.labassignment1.MainActivity $ 7.onResponse (MainActivity.java:170)

1005 *

Мой код кнопки 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 Ответ

0 голосов
/ 10 октября 2018

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

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:38)) на com.example.madnanijaz.labassignment1.MainActivity $ 7.onResponse (MainActivity.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();
}
...