我收到以下错误:“无法引用在不同方法中定义的内部类中的非final变量”
我应该具体改变什么以避免它?
我正在关注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);
答案 0 :(得分:2)
将有问题的变量声明为final。
您可能只需要做最终的EditText editTextSt ...如果您有更多问题,请告诉我。此外,如果是这种情况,请包含完整的错误消息。
答案 1 :(得分:2)
这与Android无关,直接从匿名类中的另一个类使用对象是一个特定问题。如果您要这样做,他们共享的对象必须被声明为final
。
class TypeA
{
final Object t = new Object();
new TypeB()
{
t ... blah
}
}
在上面的示例中,TypeA是TypeB的匿名类的封装类,它们共享任何名为t的对象:
这个匿名类中对t(属于TypeA)的任何引用必须是final
,因为类型B的当前上下文无法解析为对象,因为它是匿名的。
答案 2 :(得分:0)
将变量声明为final
意味着它的值将在整个生命周期中得到修复。因此,您无法更改st
和sp
的价值。
还有另一种解决方案。
将st
和sp
声明为全局变量。然后可以在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的值,并且仍然可以在对话框中访问它们,即使它们不是最终的。