【问题标题】:Android: How to get a view given an activity inside a normal class?Android:如何在普通类中获取给定活动的视图?
【发布时间】:2024-04-29 20:30:02
【问题描述】:

我有一个正常的课程(不是活动)。在那个类中,我引用了一个活动。 现在我想访问该活动的布局 xml 中包含的视图(以添加一个子项)。 我不知道该活动的布局文件的名称。我只知道要访问的视图的 ID(例如:R.id.my_view)。

我该怎么做?

【问题讨论】:

    标签: android android-layout layout 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 不存在的东西,所以它@98​​7654322@。

    【讨论】:

    • 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”是指您的活动。 (我已经改过代码了)
    最近更新 更多