【问题标题】:How to call a the activity method finish() from the Application object?如何从 Application 对象调用活动方法 finish()?
【发布时间】:2013-01-14 03:16:03
【问题描述】:

我有一段代码可以删除数据库中的项目。我从两个不同的活动中调用相同的代码。所以为了避免代码重复,我想将代码转移到 Application 对象。其中一项活动的代码如下所示:

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

现在把它放在应用程序对象中,我把函数改为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();
}

【问题讨论】:

  • 把这行放在((Activity)context).finish();
  • 我试过了! Eclipse 仍然用红色下划线:Activity cannot be resolved to a type.
  • 只需导入android活动类。它将在一个简短的代码行中完成。不需要再次编写类。在 Activity 中投射上下文并不是什么大问题。它也是面向对象编程的基础..
  • @user370305 - 你确定吗?也许您将 ContextThemeWrapper 转换为 Activity ?或服务到活动?或.even Application ???.. 非常糟糕的主意:D

标签: android android-context activity-finish


【解决方案1】:

不要将它转移到Application,而是创建一个BaseActivity(扩展Activity类)类,所有活动都扩展BaseActivity ..并且公共代码将放在BaseActivity中

【讨论】:

  • 要访问一个类的公共代码,通过扩展 .java 类成为一个 Activity 不是强制性的。它将为该类提供不必要的 Activity 的全部功能。
  • @John 我们说的是一个派生自 Activity 的类。
  • 哦,对不起,我的错误......我以为他是在分开班级并使用非活动来完成这项工作。
  • @ClassStacker - 好的,但我认为 OP 已经编写了代码,现在他只想用简单而简短的解决方案完成()活动。
  • @user370305 也许吧。也许不吧。 ;)
【解决方案2】:

不可能像在 C# 中那样调用 Application.finish()。你可以使用这样的方法: Activityname.finish();

这是一个很好的解决方案。 我希望我有所帮助。

【讨论】:

  • Aktywnosc 是您的活动名称。
【解决方案3】:

我认为您尝试做的事情基本上不是一个好主意。

在 Activity 代码之外,不能保证 Activity 仍然存在 - 内存管理器可能已经清理它,用户可能已经按下 Back 等。

最终的设计决定取决于您,但我建议您考虑是否真的有必要。

如果能带来更高的程序稳定性和可靠性,我认为稍微冗余是可以的。

【讨论】:

  • @AnupCowkur - 如果 Activity 不存在,那么您的 AlertDailog 永远不会变得可见..
  • @user370305 你是对的。在这种情况下,调用 deleteItem() 本身会导致崩溃。更有理由不这样做。
【解决方案4】:

很简单,添加activity实例也是如此

public void deleteItem(final Context context, Activity activity,final long rowID){
activity.finish();
}

【讨论】:

  • 好的,但是如果你可以选择,为什么还要有上下文和活动呢?
【解决方案5】:

Context 可以转换为 Activity

Activity activity = (Activity) context;

而不仅仅是使用:

activity.finish();

【讨论】:

  • 是的,就像((Activity)context).finish();
  • 我偶然发现了 Context 可以转换为 Activity。当然,这本身不可能是真的。否则,Context 必须是 Activity 的子类,或者所有 Context 对象都必须是 Activity。两者都不是这样。您应该建议将第一个参数从 Context 更改为 Activity 以便清楚地使用 Activity 对象调用它。 -- 啊,典型的 StackOverflow;简单但错误的答案得到了投票... ;)
  • @user1971924 您可能正在这样做,但是 OP 没有理由这样做,并且答案没有提到适用于该解决方案的限制 - OP 确实 not 包括任何调用deleteItem() 的代码,所以没有告诉他它仅在他将 Activity 对象作为第一个参数传递时才有效,而是声称 Context 可以强制转换为 Activity,这很简单不是一个好的甚至是正确的答案。
  • @EvZ 无需抱歉。我从来没有说过代码不起作用。我只是说答案包含错误的信息;它确实如此。我可以按照您自己的次优建议与您同住。
  • @EvZ Activity extends Context 确实如此。那又怎样?
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 2011-02-12
  • 2013-08-20
  • 2011-07-06
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多