1

我收到以下错误:“无法引用以不同方法定义的内部类中的非最终变量”

我应该具体改变什么来避免它?

我正在关注 AlertDialog:

new AlertDialog.Builder(view.getContext())
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle("Confirm")
            .setMessage("Are you sure?")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            //I need some actions to be done here
            }})
            .setNegativeButton("No", null)
            .show();

我需要在 AlertDialog 中完成此操作:

        String st = editTextSt.getText().toString();
        String sp = editTextSp.getText().toString();
        SQLiteDbHelper database2 = new SQLiteDbHelper(this);
        SQLiteDatabase database = database2.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(SQLiteDbHelper.COLUMN_NAME_SP, sp);
        values.put(SQLiteDbHelper.COLUMN_NAME_ST, st);
        long insertId = database.insert(SQLiteDbHelper.TABLE_NAME, null, values);
4

3 回答 3

2

将有问题的变量声明为 final。

您可能只需要进行最终的 EditText editTextSt ... 如果您有更多问题,请告诉我。此外,如果是这种情况,请附上完整的错误消息。

于 2013-04-09T22:30:30.967 回答
2

这与 Android 无关,这是直接从匿名类中的另一个类中使用对象的特定问题。如果你要这样做,他们共享的对象必须声明为final.

class TypeA
{
 final Object t = new Object();
 new TypeB()
 {
   t ... blah
 }
}

在上面的例子中,TypeA 是 TypeB 的匿名类的封装类,它们共享任何名为 t 的对象:

在这个匿名类中对 t(属于 TypeA)的任何引用都必须是final,因为 TypeB 类的当前上下文无法解析为对象,因为它是匿名的。

于 2013-04-09T22:30:57.233 回答
0

将变量声明为 asfinal意味着它的值将在其整个生命周期中固定。所以你不能改变stand的值sp

还有另一种解决方案。

声明stsp作为全局变量。然后可以在 AlertDialog 中访问它们,即使它们不是最终的。

全局变量是在类中的任何函数之外声明的变量。

例子:

public class Example
{

String sp,st;
SQLiteDatabase database, database2;
void func()
{
 new AlertDialog.Builder(view.getContext())
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle("Confirm")
        .setMessage("Are you sure?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
        {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          String st = editTextSt.getText().toString();
    String sp = editTextSp.getText().toString();
    database2 = new SQLiteDbHelper(this);
    database = database2.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(SQLiteDbHelper.COLUMN_NAME_SP, sp);
    values.put(SQLiteDbHelper.COLUMN_NAME_ST, st);
    long insertId = database.insert(SQLiteDbHelper.TABLE_NAME, null, values);
        }})
        .setNegativeButton("No", null)
        .show();

  }

现在可以更改 sp 和 st 的值,即使它们不是最终的,仍然可以在对话框中访问它们。

于 2013-04-10T02:28:09.670 回答