Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从应用程序对象调用活动方法finish()?_Android_Android Context_Activity Finish - Fatal编程技术网

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()