在View上下文中获取Activity对象

3

这是对以下帖子的跟进:

findViewById在子类SurfaceView中抛出RuntimeException

根据Romain Guy的反馈(我很快就会接受它作为解决方案),我想从视图内部获取调用的Activity,以便我可以使用它来获取所需的TextView资源。

我没有看到任何返回Activity的View方法。如何正确地做到这一点?或者是否有更好的替代方法来处理来自另一个View上下文的TextView。

基本上,在onCreate()中调用setContentView(R.layout.xxx)(像往常一样),因此我没有办法传递对其他TextView的引用,除非我在setContentView之后笨拙地检索该View,然后对其进行调用。

2个回答

7

Activity是一个Context,但不能保证View使用的Context一定是Activity。在onCreate()中获取视图并进行设置是完全有效的,并且这也是Android应用程序通常的编写方式。例如,您可以像下面这样做:

setContentView(...);
MySurfaceView v = findViewById(R.id.theusrface);
TextView t = findViewById(R.id.thecontent);
v.setContent(v);

逻辑不应该放在你的视图中。

1
谢谢。以这种方式做起来有点“别扭”,但我想这就是 Android 的方式。为了让它更加自然,我可能会这样做:MySurfaceView v = findViewById(R.id.something); setContentView(v); v.setContent(findViewById(R.id.content)); - user153275
1
在调用 setContentView() 之前无法执行 findViewById()。 - Romain Guy
我在想,Context不是Activity的情况下会有哪些用途。我需要这个例子,因为我有一个View,它实际上应该是一个fragment,因为它有一个Options菜单项,但不幸的是它还想在另一个fragment中,并且嵌套的fragments是不允许的。我正在尝试决定使用一个view还是弄清楚如何使用一个view pager,其中每个页面由多个fragments组成。 - user486646
“一个 Activity 是一个上下文,但不能保证 View 使用的上下文总是一个 Activity。” 你能理解吗? - cYrus
1
@cYrus 可以使用 Service 上下文创建视图,我相信也可以使用 Application 上下文创建视图。此外,如果您正在使用类似 Square 的 Mortar 这样的东西,您的上下文可能完全是其他内容(一个包装另一个普通 Android 上下文的上下文)。 - user153275
显示剩余2条评论

4

如果您已经知道了View所在的Activity类,比如MyActivity,那么您可以从View及其监听器内部使用静态成员MyActivity.this,例如以下示例:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                MyActivity.this.finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();

我在这个 Android 教程中找到了一个有用的内容:

http://developer.android.com/guide/topics/ui/dialogs.html

它对我产生了很大的帮助。

PJ_Finnegan


1
该方法的主要问题在于,在Java中,您应该编写独立的类,并且有很多原因支持这种做法。如果您的视图引用外部类的静态成员,则不是独立的。 - Sune Rasmussen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接