[英]Custom method for AlertDialog throws “Attempt to invoke … on a null object reference” Android
我創建了一個自定義AlertDialog
,它具有一個ImageView
,3個TextView
和一個用於關閉對話框的按鈕。 我需要從Activity
設置ImageView
和3 TextView
的文本,因此在自定義AlertDialog
類中,我創建了以下方法:
public class ProductDialog extends Dialog implements
android.view.View.OnClickListener {
public Activity c;
public Dialog d;
public Button close;
public ImageView pImage;
public TextView title;
public TextView utensils;
public TextView preparation;
public ProductDialog(Activity a) {
super(a);
// TODO Auto-generated constructor stub
this.c = a;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.product_dialog);
close = (Button) findViewById(R.id.popClose);
close.setOnClickListener(this);
pImage = (ImageView) findViewById(R.id.popImg);
title = (TextView) findViewById(R.id.popTitle);
utensils = (TextView) findViewById(R.id.popUtensili);
preparation = (TextView) findViewById(R.id.popPreparazione);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.popClose:
dismiss();
break;
default:
break;
}
dismiss();
}
public void setImage(String urlImg) {
Picasso.with(getContext())
.load(urlImg)
.placeholder(R.drawable.placeholder)
//.transform(new RoundedTransformation(10, 0))
.fit().centerCrop()
.into(pImage);
}
public void setTitle(String txtTitle) {
title.setText(txtTitle);
}
public void setUtensils(String txtUtensils) {
utensils.setText(txtUtensils);
}
public void setPreparation(String txtPreparation) {
preparation.setText(txtPreparation);
}
}
我從我的Activity
這樣稱呼他們:
pDetails = new ProductDialog(MyActivity.this);
pDetails.setTitle("asd");
pDetails.setUtensils("asd");
pDetails.setPreparation("asd");
pDetails.setImage(imageUrl);
pDetails.show();
但是,一旦setTitle()
被解雇,我就會收到以下錯誤:
07-23 13:03:10.810:E / AndroidRuntime(3117):java.lang.RuntimeException:無法啟動活動ComponentInfo {com.test.test / com.test.test.MyActivity}:java.lang.NullPointerException:嘗試在空對象引用上調用虛擬方法'void android.widget.TextView.setText(java.lang.CharSequence)'
為了使它有效,我缺少什么?
當視圖未初始化時,您正在調用這些設置器。 調用show()
方法時將調用onCreate()方法。 但是這些設置方法在show方法之前被調用。 導致該錯誤。
如果要從mainActivity設置這些值,則必須創建接口以獲取這些值或在構造函數中發送數據。
我修改了您的代碼,可以解釋您如何實現所需的代碼。 有很多方法,這是最簡單的方法:
public Activity c;
public Dialog d;
public Button close;
public ImageView pImage;
public TextView title;
public TextView utensils;
public TextView preparation;
// variables those will handle values. i did not implement it for image you can do same for that also.
private String titleValue;
private String utensilsValue;
private String preparationValue;
public ProductDialog(Activity a) {
super(a);
// TODO Auto-generated constructor stub
this.c = a;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.product_dialog);
close = (Button) findViewById(R.id.popClose);
close.setOnClickListener(this);
pImage = (ImageView) findViewById(R.id.popImg);
title = (TextView) findViewById(R.id.popTitle);
utensils = (TextView) findViewById(R.id.popUtensili);
preparation = (TextView) findViewById(R.id.popPreparazione);
title.setText(titleValue);
utensils.setText(utensilsValue);
preparation.setText(preparationValue);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.popClose:
dismiss();
break;
default:
break;
}
dismiss();
}
public void setImage(String urlImg) {
Picasso.with(getContext())
.load(urlImg)
.placeholder(R.drawable.placeholder)
//.transform(new RoundedTransformation(10, 0))
.fit().centerCrop()
.into(pImage);
}
// Created getter and setter to get get value form mainActivity.
public void setTitle(String txtTitle) {
titleValue = (txtTitle);
}
public void setUtensils(String txtUtensils) {
utensilsValue = (txtUtensils);
}
public void setPreparation(String txtPreparation) {
preparationValue = (txtPreparation);
}
}
這是因為未創建對話框。 在創建之前,使用構建器模式保存值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.