Android 如何从应用程序对象调用活动方法finish()?
我有一段代码可以删除数据库中的一项。我从两个不同的活动调用相同的代码。因此,为了避免代码重复,我想将代码转移到应用程序对象。其中一个活动中的代码如下所示:Android 如何从应用程序对象调用活动方法finish()?,android,android-context,activity-finish,Android,Android Context,Activity Finish,我有一段代码可以删除数据库中的一项。我从两个不同的活动调用相同的代码。因此,为了避免代码重复,我想将代码转移到应用程序对象。其中一个活动中的代码如下所示: private void deleteItem() { AlertDialog.Builder alert = new AlertDialog.Builder(Activity1.this); alert.setTitle(R.string.confirmTitle); alert.setMessage(R.strin
private void deleteItem() {
AlertDialog.Builder alert = new AlertDialog.Builder(Activity1.this);
alert.setTitle(R.string.confirmTitle);
alert.setMessage(R.string.confirmMessage);
alert.setPositiveButton(R.string.delete_btn,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int button) {
final DbHelper db = new DbHelper(Activity1.this);
AsyncTask<Long, Void, Object> deleteTask = new AsyncTask<Long, Void, Object>() {
@Override
protected Object doInBackground(Long... params) {
db.deleteItem(params[0]);
return null;
}
@Override
protected void onPostExecute(Object result) {
finish();
}
};
deleteTask.execute(new Long[] { rowID });
}
});
alert.setNegativeButton(R.string.cancel_btn, null).show();
}
private void deleteItem(){
AlertDialog.Builder alert=新建AlertDialog.Builder(Activity1.this);
alert.setTitle(R.string.confirmTitle);
alert.setMessage(R.string.confirmMessage);
alert.setPositiveButton(R.string.delete_btn,
新建DialogInterface.OnClickListener(){
公共void onClick(对话框接口对话框,int按钮){
final DbHelper db=newdbhelper(Activity1.this);
AsyncTask deleteTask=新建AsyncTask(){
@凌驾
受保护对象doInBackground(长…参数){
db.deleteItem(参数[0]);
返回null;
}
@凌驾
受保护的void onPostExecute(对象结果){
完成();
}
};
deleteTask.execute(新的长[]{rowID});
}
});
alert.setNegativeButton(R.string.cancel_btn,null).show();
}
现在,为了将它放在应用程序对象中,我将函数更改为public,为它提供了两个输入参数:Context和rowID。但是在AsyncTask的onPostExecute方法中,我必须关闭活动。在活动中,我通过finish()完成了此操作。在这种情况下我该怎么做?我也在应用程序对象中附加了代码
public void deleteItem(final Context context, final long rowID) {
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert.setTitle(R.string.confirmTitle);
alert.setMessage(R.string.confirmMessage);
alert.setPositiveButton(R.string.delete_btn,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int button) {
final DbHelper db = new DbHelper(context);
AsyncTask<Long, Void, Object> deleteTask = new AsyncTask<Long, Void, Object>() {
@Override
protected Object doInBackground(Long... params) {
db.deleteItem(params[0]);
return null;
}
@Override
protected void onPostExecute(Object result) {
finish();
}
};
deleteTask.execute(new Long[] { rowID });
}
});
alert.setNegativeButton(R.string.cancel_btn, null).show();
}
public void deleteItem(最终上下文,最终长rowID){
AlertDialog.Builder alert=新建AlertDialog.Builder(上下文);
alert.setTitle(R.string.confirmTitle);
alert.setMessage(R.string.confirmMessage);
alert.setPositiveButton(R.string.delete_btn,
新建DialogInterface.OnClickListener(){
公共void onClick(对话框接口对话框,int按钮){
final DbHelper db=新的DbHelper(上下文);
AsyncTask deleteTask=新建AsyncTask(){
@凌驾
受保护对象doInBackground(长…参数){
db.deleteItem(参数[0]);
返回null;
}
@凌驾
受保护的void onPostExecute(对象结果){
完成();
}
};
deleteTask.execute(新的长[]{rowID});
}
});
alert.setNegativeButton(R.string.cancel_btn,null).show();
}
上下文
可以强制转换为活动
:
Activity activity = (Activity) context;
而不仅仅是使用:
activity.finish();
它很简单,还可以添加活动实例
public void deleteItem(final Context context, Activity activity,final long rowID){
activity.finish();
}
不要将其转移到应用程序,而是创建一个BaseActivity(扩展活动类)类,所有活动都扩展BaseActivity。。公共代码将放在BaseActivity中不可能像在C#中那样调用
Application.finish()
。您可以使用如下方法:
Activityname.finish()代码>
这是个好办法。
我希望我能帮忙 我认为你想做的根本不是一个好主意
在活动代码之外,无法保证活动仍然存在-内存管理器可能已将其清理干净,用户可能已按下后退键等
最后的设计决定取决于你,但我建议你考虑这是否真的必要。
在我看来,少量冗余可以提高程序的稳定性和可靠性。Aktywnosc是您活动的名称。是的,它类似于((活动)上下文)。finish()代码>我偶然发现上下文可以转换为活动。当然,这本身不可能是真的;否则,上下文必须是Activity的子类,或者所有上下文对象都必须是Activity。事实并非如此。您应该建议将第一个参数从上下文更改为活动,这样就可以清楚地看到它是通过活动对象调用的。-Aaaahh,典型的堆栈溢出;简单但错误的答案会被高估…;)@user1971924您可能正在这样做,但OP没有理由这样做,答案也没有提到适用于此解决方案的约束条件——OP不包含任何调用deleteItem()
的代码,因此没有通知他仅当他将活动对象作为第一个参数传递时它才起作用,相反,它声称上下文可以转换为活动,这根本不是一个好的甚至不正确的答案。@EvZ不必感到抱歉。我从来没说过密码不起作用。我刚才说答案包含了很多信息;确实如此。我可以按照你自己的次优建议和你一起生活。@EvZ活动确实扩展了上下文。那又怎样?只要把这一行((活动)上下文).finish()我已经试过了!Eclipse仍然用红色下划线表示:活动无法解析为类型。只需导入android活动类即可。它将在一个短代码行中完成。不需要再次编写类。这并不是在活动中设置上下文的一个大目标。它也是面向对象的基础..@user370305-你确定吗?也许您将ContextThemeWrapper强制转换为活动?或服务活动??或者。甚至申请???。。非常糟糕的想法:数据访问类的公共代码并不是通过扩展将.java类变成活动所必需的。它将为类提供活动的全部功能,这是不必要的。@John我们讨论的是一个从活动派生的类。哦,对不起,我的错误…我以为他在分离类并使用非活动来完成工作。@ClassStacker-好的,但我想OP已经编写了一个代码,现在他只想完成