Android:如何在普通类中获取给定活动的视图?
Posted
技术标签:
【中文标题】Android:如何在普通类中获取给定活动的视图?【英文标题】:Android: How to get a view given an activity inside a normal class? 【发布时间】:2012-08-10 14:04:49 【问题描述】:我有一个正常的课程(不是活动)。在那个类中,我引用了一个活动。 现在我想访问该活动的布局 xml 中包含的视图(以添加一个子项)。 我不知道该活动的布局文件的名称。我只知道要访问的视图的 ID(例如:R.id.my_view)。
我该怎么做?
【问题讨论】:
【参考方案1】:关于 NullPointerException(您应该将其添加到问题中),请始终确保您在尝试访问 XML 中定义的视图之前在您的活动中调用了setContentView()。示例用法:
public class MainActivity extends Activity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
...
然后,某处,
ViewGroup group = (ViewGroup) context.findViewById(R.id.group); // In your example, R.id.my_view
您需要调用 setContentView() 的原因是在调用它之前,您的 View(Group) 不存在。因为 findViewById() 无法find 不存在的东西,所以它@987654322@。
【讨论】:
Thia 似乎是一个更好的解释。但是我无法控制,在调用 findViewById() 之前调用 setContentView()。正如我所说,findViewById 存在于一个完全分离的类中。 你说你没办法控制它。因此,我不得不问你:在 Activity 的生命周期中,你需要调用 findViewById() 吗? 使用 Admob 中介进行广告支持的应用。我需要将自定义广告网络集成到 Admob 中介中。为此,需要编写一个 CustomEvent 类。此类由 Admobs Mediation SDK 实例化。这就是为什么我无法控制它何时被实例化,以及 findViewById 何时被执行。此类异步获取横幅。 developers.google.com/mobile-ads-sdk/docs/admob/… 。该类工作,获取横幅,但是当它尝试将横幅添加到视图组(通过 findViewById 获得的LinearLaout)时,我得到了一个 NPE。 Admob 横幅是在 findViewById 之后的 onCreate 中请求的,但是是异步的,带有一个监听器接口。所以,就像我说的,我在 setContentView 之后调用 Admob,但是当 Admob 实例化 CustomEvent 类,以及当监听器收到关于成功或失败的通知时,不能做任何假设。 注意:Admob 文档中的示例实现展示了如何将 Admob 作为自定义网络添加到 Admob 中介,但绝不会如此。实际情况是,不支持开箱即用的广告网络集成在 Admob 中介中。有点令人困惑的例子。【参考方案2】:就这么简单!
View view = activity.findViewById(R.id.my_view);
如果是布局:
LinearLayout layout = (LinearLayout) activity.findViewById(R.id.my_layoutId);
并添加视图:
layout.addView(view);
【讨论】:
那么最好发布一些代码。我很确定我们可以解决这个问题!你的活动是空的还是结果?【参考方案3】:您可以让您的方法接受一个 Activity 参数,然后使用它通过 id 查找视图。
例如:
public class MyClass
public void doSomething(Activity context)
TextView text=(TextView)context.findViewById(R.id.my_textview);
然后在你的活动中:
obj.doSomething(YourActivity.this);
【讨论】:
是否有可能,我必须先膨胀活动的布局?如果是这样,任何人都可以提供一个代码示例, @mradlmaier,是的,如果您在 onClickListener 中使用您的方法,则可能会出现 NPE 异常。在这种情况下,您应该将方法的参数从 this 更改为 ActivityName.this。因此,明确提及“this”是指您的活动。 (我已经改过代码了)以上是关于Android:如何在普通类中获取给定活动的视图?的主要内容,如果未能解决你的问题,请参考以下文章