【问题标题】:Define MainActivity as static variable in order to access findViewById method将 MainActivity 定义为静态变量以访问 findViewById 方法
【发布时间】:2019-06-07 14:09:17
【问题描述】:

在编写代码时,我想使用 findViewById 方法来查找在当前视图中无法访问但可以通过 MainActivity 访问的视图。于是我想到了两个选择。一种是从 MainActivity 类中的该对象创建一个静态方法并访问该静态对象。第二种方法是从 MainActivity 类本身(this)创建一个静态对象,并通过调用该静态对象访问 findViewById 方法。请回答我应该使用的方法。 除此之外,它让我想到,Android 开发人员是否应该遇到这种情况,或者我是否做了一些不正确的编码来访问 MainActivity 中的 findViewById 方法,而我在不同的视图中。 您可以查看以下 repo 中的代码。

https://github.com/chrish2015/ExpenseTrackerLatest

谢谢

【问题讨论】:

  • 深入整个项目找自己写的代码是没有意义的,请将代码粘贴到这里。

标签: android view static findviewbyid main-activity


【解决方案1】:

如果您在一个既不是Context 也不是Activity 的类中,并且您需要使用存在于活动或上下文中的方法,那么只需将活动作为参数传递给该类并获取类中该活动的实例。

public class MyAdapter extends ArrayAdapter { // this is not activity
    private Activity mActivity; // activity is a member of this class.

    public MyAdapter(Activity activity, List<String> data) {
        mActivity = activity;
    }

    public View getView(...) {
        // if you need to use findViewById: 
        View view = mActivity.findViewById(R.id.some_id);
    }

}

【讨论】:

    【解决方案2】:

    不要使用这两种方法中的任何一种。

    我可能误解了您的第一句话,但可以肯定的是,您是在寻求一种方法来访问存在于 MainActivity 中的视图,而您在 Fragment 中?

    如果这就是您要问的,那么是的,作为一名 Android 开发人员,我们肯定会遇到这种情况。但是,通过使视图或上下文静态化,解决方案绝对是NOT

    这是导致应用程序出现错误的最简单方法之一,也很有可能导致内存泄漏。这是来自 Google 的一篇文章,讨论了与保持对 Context 的引用相关的内存泄漏:https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html

    除了您的两个选项之外,还有开发人员通常使用的更好的解决方案。

    首先,请记住,您不应该直接从当前布局之外访问任何视图...这意味着,如果您在第二个 Activity 中,则不能直接从第一个 Activity 访问视图Activity,或者如果你在一个 Fragment 中,你不会直接访问属于它的 FragmentActivity 的 View。

    相反,您让 Activity 或 Fragment 处理它自己的视图。

    所以例如,如果你在另一个Activity中,你想更新之前Activity中的一些数据,你可以利用一个Activity的startActivityForResult()onActivityResult()来获取立即更新Activity所需的数据返回应用程序后。

    对于 Fragments,实际上有一个来自 Android 文档的教程,描述了在其他 Fragment 之间进行通信的一种非常好的方法:https://developer.android.com/training/basics/fragments/communicating

    此方法是使用接口作为回调,因此另一个 Fragment 或 Activity 将能够接收数据并在其自己的布局内更新它的视图

    因此,对于您的情况,如果您使用 Fragments 和 Activity,您可以轻松地让 Fragments 和 Activity 以更安全、更可靠的方式相互通信。

    另外,请务必阅读更多关于 static 的内容,它对您的代码的影响,尤其是对 Android 组件的副作用。不要在不考虑它可能导致的一些影响的情况下随意使用 static,因为这会给您的代码带来无穷无尽的麻烦。

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 2015-07-22
      • 2012-06-29
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2017-01-13
      • 2012-07-17
      相关资源
      最近更新 更多