【问题标题】:Error on calling method inside AlertDialog在 AlertDialog 中调用方法时出错
【发布时间】:2013-04-09 22:28:08
【问题描述】:

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

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

我正在关注 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);

【问题讨论】:

    标签: java android eclipse variables methods


    【解决方案1】:

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

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

    【讨论】:

    • "最终 SQLiteDbHelper 数据库 2 = new SQLiteDbHelper(this);"而不是“SQLiteDbHelper database2 = new SQLiteDbHelper(this);”会成功吗?现在这样做没有错误。还没有尝试运行它
    • 好吧,让我知道进展如何。在旁注中,您不应该使用硬编码字符串
    • 您的问题解决了吗?如果是这样,请标记为这样,像 Torcellite 和其他人这样的人不会浪费时间试图回答。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      将变量声明为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 的值,即使它们不是最终值,仍然可以在对话框中访问它们。

      【讨论】:

      • 刚刚发现这个“SQLiteDbHelper database2 = new SQLiteDbHelper(this);”也应该在“String sp,st;”下..谢谢!..纠正它,我会接受!
      • 接受!由于声誉低,无法投票。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多