Android FindViewById 仅适用于子布局(列表视图行),不适用于父布局中的 TextView

Posted

技术标签:

【中文标题】Android FindViewById 仅适用于子布局(列表视图行),不适用于父布局中的 TextView【英文标题】:Android FindViewById is only working for a child layout (listview row) and not for TextViews in the parent layout 【发布时间】:2021-01-19 20:24:10 【问题描述】:

我猜我的问题是布局膨胀。我有 2 个布局文件:

activity_mail.xlm:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/results"
    android:layout_
    android:layout_
    android:orientation="vertical">
    
    <TextView
            android:id="@+id/profilesCount"
            android:layout_
            android:layout_
            android:text="0"
            android:textSize="18sp" />
            
    
    <ListView
        android:id="@android:id/list"
        android:layout_
        android:layout_ />


</LinearLayout>

...和listitem_device.xlm:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical">

        <TextView
            android:id="@+id/device_label"
            android:layout_
            android:layout_
            android:layout_weight="3"/>

        <TextView
            android:id="@+id/device_service"
            android:layout_
            android:layout_
            android:layout_weight="1.5"/>

</LinearLayout>            

在我的 main_activity java 文件中,我有:

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    ....
    

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) 
        ViewHolder viewHolder;

        if (view == null) 
            view = mInflator.inflate(R.layout.listitem_device, null);
            viewHolder = new ViewHolder();
            viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_label); // from listitem_device.xml
            
            viewHolder.profilesCount = (TextView) view.findViewById(R.id.profilesCount); // from activity_main.xml

问题出在后面的代码:

viewHolder.profilesCount.setText("HELLO");

生成错误“尝试在空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)'”。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

我在任何地方都看不到您甚至拥有 ID 为“profilesCount”的视图。您在布局文件中只有设备标签和设备服务作为 ID,用于扩充列表视图的行。更好也可以使用 Recycler 视图,它提供了更多的灵活性。

此外,您无法从适配器的 getView() 函数中的 activity_mail.xml 访问某些内容,因为通过在 getfunction 中使用“view”,因为它仅对应于列表视图的行,并且因为该 id 不是存在于与列表视图行关联的 xml 文件中,您将“viewholders.profileCount”设为 null,因此出现 Nullpointer 异常。

如果您想在适配器中使用 TextView 或任何视图,最好创建一个接口并在您的活动中实现该接口以用作回调,然后设置您的 activity.xml 文件的 textview 字段,这是最好的方法因为它会让你的代码更干净。另一种方法是将活动的引用传递给你的适配器,然后从 actvity_mail.xml 文件中找到文本视图或你想使用的任何东西,但它不推荐并且是一个非常糟糕的方式它可能需要额外的内存。

【讨论】:

我的错:我只包含了代码的 sn-p。我已更新问题以显示带有“profilesCount”ID 的视图。 感谢您的回复。你让我意识到我犯了一个愚蠢的错误错误,我们在视图函数中定义了非列表视图项的 TextView。我已将其移至 onCreate,现在可以正常工作了。 没问题,发生这种情况.. :)

以上是关于Android FindViewById 仅适用于子布局(列表视图行),不适用于父布局中的 TextView的主要内容,如果未能解决你的问题,请参考以下文章

仅适用于 Android 6 的安全异常

仅适用于 Android 6 的安全异常

色带仅适用于 Android 4.0+

仅适用于在 Android 上远程调试 JS

Android Geocoder 是不是仅适用于互联网连接?

仅适用于 Android TV 的 Android 清单 - 支持的设备太少?