Android:Java不能引用非final变量

时间:2013-10-03 03:35:55

标签: java android android-alertdialog onclicklistener final

在我的Android应用程序中,当用户点击Sales按钮时,它会显示另一个视图来执行销售。

如果所选客户的GST许可证到期日期少于7天且即将到期,我实施警报对话框以向用户显示警告消息之前,我的应用程序正在运行而没有任何问题。现在,如果我没有向这两个变量finalcustomer声明v,我会收到以下错误消息。

  

不能在不同方法中定义的内部类中引用非最终变量customer

     

不能在不同方法中定义的内部类中引用非最终变量v

我理解

  

声明为final的引用一旦被修改就无法修改   初始化。

那么,如果我将这两个变量分配为final会怎样?它总是包含相同的值?有人可以向我解释为什么编译器会给我这些错误以及为什么我应该向这两个变量声明final

这是我的源代码:

private OnClickListener salesBtnClick = new OnClickListener() {
    @Override
    public void onClick(View v) {
        Customer customer = salesCustAdpt.getSelectedCustomer();
        if (customer != null) {                                
            Date expiryDate = customer.getGSTLicenseExpiryDate();
            if (checkCustomerGSTLicenseExpiryDate(expiryDate)) {
                AlertDialog.Builder builder = new AlertDialog.Builder(SalesCustomerActivity.this);
                builder.setCancelable(false)
                    .setPositiveButton(
                        "OK",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                try {
                                    //Perform sales here!
                                    Intent intent = null;
                                    intent = new Intent(v.getContext(), SalesActivity.class);//Error msg here!
                                    Bundle bundle = new Bundle();
                                    bundle.putSerializable("selCustomer", customer);//Error msg here!
                                    intent.putExtra("bundle", bundle);
                                    startActivity(intent);
                                    finish();
                                } catch (Exception ex) {
                                    AddPlusUtil.displayErrorMsg(
                                                    SalesCustomerActivity.this,
                                                    ex);
                                }
                            }
                        });

                AlertDialog alert = builder.create();
                alert.setTitle("Warning Message");
                String errMsg = "GST License Expiry Date of selected customer is \n" + expiryDate + " and going to expire soon.";
                alert.setMessage(errMsg);
                alert.setIcon(android.R.drawable.stat_notify_error);
                alert.show();
            } else {
                //Perform Sales
            }
        } 
    }
}

2 个答案:

答案 0 :(得分:2)

定义客户时,请使用final:

final Customer customer = salesCustAdpt.getSelectedCustomer();

此外,在onClick方法中,将View设置为final:

public void onClick(final View v) {

希望这会有所帮助:)

答案 1 :(得分:1)

在班级中全局定义customerv。它将解决问题。

创建一个全局视图对象,而不是使用v

分配它
globalView = v;

并使用该globalView调用intent。

顺便说一下,您可以使用yourClass.this作为上下文而不是视图上下文。