将MainActivity定义为静态变量,以便访问findViewById方法



在编码时,我想使用findViewById方法来查找在当前视图中无法访问但可以通过MainActivity访问的视图。所以我想到了两个选择。一种是在MainActivity类中从该对象创建一个静态方法,并访问该静态对象。第二种方法是从MainActivity类本身创建一个静态对象(this),并通过调用静态对象来访问findViewById方法。请回答我应该使用的方法。除此之外,这让我思考,安卓开发者是否应该遇到这种类型的场景,或者当我处于不同的视图时,我是否对MainActivity中的findViewById方法进行了一些不正确的编码。您可以查看下面回购中的代码。

https://github.com/chrish2015/ExpenseTrackerLatest

感谢

如果您所在的类既不是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);
}
}

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

我可能误解了你的第一句话,但为了确定,当你在片段中时,你是否在寻求访问MainActivity中存在的视图的方法?

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

这是导致错误出现在整个应用程序中的最简单方法之一,也很有可能导致内存泄漏。以下是谷歌的一篇文章,讨论了与引用上下文相关的内存泄漏:https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html

开发人员通常会使用更好的解决方案,而不是两种选择。

首先,请记住,您不应该直接访问当前布局之外的任何视图。。。也就是说,如果你在第二个活动中,你不会直接访问第一个活动中的视图,或者如果你在片段中,你也不会直接访问属于它的片段活动的视图。

相反,您可以让活动或片段处理它自己的视图。

因此,例如,如果您在另一个"活动"中,并且您想更新上一个活动中的某些数据,则可以利用"活动"的startActivityForResult()onActivityResult()获取必要的数据,以便在返回应用程序后立即更新"活动"。

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

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

因此,对于您的案例,如果您使用碎片和活动,您可以轻松地让碎片和活动以更安全、更可靠的方式相互通信。

此外,请确保您阅读了更多关于static及其对代码的影响,尤其是对Android组件的副作用。不要在不考虑静态可能造成的一些影响的情况下随意使用静态,因为这会给代码带来无尽的麻烦。

最新更新