簡體   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