我正在为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 凯文
答案 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 () ...