1

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

如果所选客户的 GST 许可证到期日期少于 7 天并且即将到期,我的应用程序在实施警报对话框以向用户显示警告消息之前运行没有任何问题。现在,如果我不声明final这两个变量,我会收到以下错误消息,customer并且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
            }
        } 
    }
}
4

2 回答 2

2

定义客户时,使用 final:

final Customer customer = salesCustAdpt.getSelectedCustomer();

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

public void onClick(final View v) {

希望这可以帮助 :)

于 2013-10-03T03:46:12.060 回答
1

customer在您的班级中 v全局定义它。它将解决问题。

创建一个全局视图对象,然后将其分配给您的v

globalView = v;

并使用该 globalView 来调用意图。

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

于 2013-10-03T03:41:10.333 回答