繁体   English   中英

AlertDialog的自定义方法抛出“试图在空对象引用上调用…” Android

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM