Диалог выхода из 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();
}