【问题标题】:get Activity object while in View context在 View 上下文中获取 Activity 对象
【发布时间】:2010-10-10 18:27:09
【问题描述】:

这是这篇文章的后续:

findViewById in a subclassed SurfaceView throwing RuntimeException

根据 Romain Guy 的反馈(我很快就会接受,因为它是一个解决方案),我想从 View 中获取调用 Activity,以便我可以使用它来获取所需的 TextView 资源。

我在 View 中没有看到任何返回 Activity 的方法。这样做的正确方法是什么?或者是否有更好的替代方法可以在另一个 View 上下文中使用 TextView。

基本上,我在 onCreate() 中调用 setContentView(R.layout.xxx) (像往常一样),所以我真的没有办法传递对其他 TextViews 的引用,除非我在 setContentView 之后笨拙地检索 View 和然后调用它。

【问题讨论】:

    标签: android android-activity android-context


    【解决方案1】:

    一个Activity就是一个Context,但不能保证View使用的Context总是一个Activity。从 onCreate() 获取视图以进行一些设置是完全有效的,并且通常是 Android 应用程序的编写方式。例如,您可以执行以下操作:

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

    逻辑不应出现在您的视图中。

    【讨论】:

    • 谢谢。这样做“感觉”很尴尬,但我想这是 Android Way(tm)。我可能会这样做: MySurfaceView v = findViewById(R.id.something);设置内容视图(v); v.setContent(findViewById(R.id.content));让它不那么尴尬。
    • 在调用 setContentView() 之前不能执行 findViewById()。
    • 完全正确。多么奇怪,奇怪的安排,必须识别一个对象,将它设置在另一个对象上,然后再次向另一个对象请求它的副本,并且不允许视图中的从属视图。我认为我在这里面临的是 Android API 与我设计的任何东西根本不同。无论如何,谢谢你。代码现在按预期工作。
    • “再次向其他对象索要它的副本”是什么意思?你绝对不需要这样做。并且视图(以及 ViewGroups)可以包含子视图,这没有问题。只是碰巧 SurfaceView 不是 ViewGroup。
    • @cYrus 视图可以使用服务上下文创建,我很确定它们可以使用应用程序上下文创建。此外,如果您使用的是 Square's Mortar 之类的东西,您的上下文可能完全是另外一回事(一个包装另一个普通 Android 上下文的上下文)。
    【解决方案2】:

    如果您已经知道 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_芬尼根

    【讨论】:

    • 这种方法的主要问题是,在 Java 中,您应该编写独立的类,而这是一个好主意的原因有很多。如果您认为引用外部类的静态成员,则它不是独立的。
    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多