不能在不同方法中定义的内部类中引用非final变量db

时间:2011-04-30 16:30:08

标签: android

我正在为Android开发一个应用程序,但我不得不从我的数据库中删除内容! 我得到一个“不能引用在不同方法中定义的内部类中的非最终变量db”错误!我知道这个错误意味着什么,但我似乎无法找到解决方案。

这是我的代码

package iwt.ehb.be.capita_selecta;

//my imports

public class RemoveActivity extends Activity {

    Context context = this;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.remove_activity);

        DBAdapter db = new DBAdapter(this);
        db.open();
        Cursor c = db.getAllTrips();

        if(c.moveToFirst())
        {
            LinearLayout layout = (LinearLayout) findViewById(R.id.layout_removeTrips);

            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(5, 5, 5, 5);

            do {
                Button buttonView = new Button(this);
                buttonView.setBackgroundResource(R.layout.btn_blue);
                buttonView.setLayoutParams(lp);
                buttonView.setText(c.getString(1) + " @ " + c.getString(2));
                final int id_trip = c.getInt(0);
                buttonView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        System.out.println(id_trip);

                        AlertDialog.Builder alert = new AlertDialog.Builder(context).setTitle("Attention");
                        alert.setMessage("Do you wish to delete this trip?");
                        alert.setIcon(R.drawable.icon);
                        alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                db.deleteSpecificRecord(id_trip);
                            }
                        });
                        alert.setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });

                        alert.show();
                    }
                });
                layout.addView(buttonView);
            } while (c.moveToNext());
        }
        db.close();

        //*******************
        //BACK-button
        //*******************   

        Button back = (Button) findViewById(R.id.back);
        back.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

我在这行代码db.deleteSpecificRecord(id_trip);

中收到错误

如果您对如何解决这个问题有任何想法,那将会很棒;)

THX 凯文

2 个答案:

答案 0 :(得分:3)

问题在于这一行:

AlertDialog.Builder alert = new AlertDialog.Builder(context).setTitle("Attention");

context是外部类的变量。像这样的变量只有在最终的时候才能被访问。

有一些可能的修复方法。 第一个是让你的活动实现onclicklistner

Public class RemoveActivity extends Activity implements OnClickListener { ... buttonView.setOnClickListener(this); imho是最好的解决方案

另一个解决方法是使变量上下文使用以下代码构建一个构造函数:

Public RemoveActivity (){ this.context = this;}

但这是丑陋的代码

我也认为将线路改为

AlertDialog.Builder alert = new AlertDialog.Builder(RemoveActivity.this).setTitle("Attention");

会起作用。

答案 1 :(得分:0)

我有同样的错误。与此相关的是java使用独立范围处理每个函数。我看到你在创建函数中声明了db Adapter对象。接受声明并在on create函数之前声明它(而不是扩展范围)这应该解决问题。您的代码应如下所示:)

public class RemoteActivity extends Activity{
DBAdapter db = new DBAdapter(this);
Context context = this;

onCreate () ...