在AlertDialog中调用方法时出错

时间:2013-04-09 22:28:09

标签: java android eclipse variables methods

我收到以下错误:“无法引用在不同方法中定义的内部类中的非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);

3 个答案:

答案 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意味着它的值将在整个生命周期中得到修复。因此,您无法更改stsp的价值。

还有另一种解决方案。

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的值,并且仍然可以在对话框中访问它们,即使它们不是最终的。