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的主要内容,如果未能解决你的问题,请参考以下文章