gpt4 book ai didi

android - findViewById 不适用于特定 View

转载 作者:太空狗 更新时间:2023-10-29 16:10:51 30 4
gpt4 key购买 nike

我有一个从 XML 加载的 Activity , View 像往常一样具有 ID:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="80dp"
android:layout_height="110dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<FrameLayout
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/white_circle">

<com.myapp.views.CircleImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>

<FrameLayout
android:layout_width="wrap_content"
android:layout_height="16dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="-12dp"
android:background="@drawable/price_background">

<TextView
android:id="@+id/priceView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:text="0.1 BTC"
android:textAllCaps="true"
android:textColor="@color/white"
android:textSize="10sp"
android:textStyle="bold" />

</FrameLayout>

<TextView
android:id="@+id/nameView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:gravity="center_horizontal"
android:lineSpacingMultiplier="0.8"
android:lines="2"
android:text="Bacon Cheeseburger"
android:textSize="10sp" />
</LinearLayout>
</FrameLayout>

我试图在代码中引用三个 View :

public ItemViewHolder(View itemView) {
super(itemView);
nameView = itemView.findViewById(R.id.nameView);
priceView = itemView.findViewById(R.id.priceView);
imageView = itemView.findViewById(R.id.imageView);
}

nameViewpriceView 被正确引用,但是,imageView 没有被引用并且是 null:

enter image description here

为什么我不能引用 imageView

(如果我遍历 View 树,它在那里。)

更新:我同时执行了清理项目和使缓存无效/重新启动,问题仍然存在。

更新 2:ItemViewHolder 派生自 RecyclerView.ViewHolderCircleImageView 派生自 FrameLayout(不是 ImageView)。此 XML 是我的 View 持有者的布局。

更新 3:这是我的圆形 View 的构造函数:

public class CircleImageView extends FrameLayout {

public CircleImageView(Context context) {
super(context);
init();
}

public CircleImageView(Context context, AttributeSet attrs) {
super(context);
init();
}

public CircleImageView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

...
}

此外,正如 Subzero 指出的那样,我已经检查了 View 的 ID 属性(mID 字段),它是 -1,这似乎是问题。我不知道为什么它是 -1。

最佳答案

将双参数构造函数中的 super 调用更改为:

super(context, attrs);

View 从布局中膨胀时,XML 属性及其值通过 AttributeSet 传递到双参数构造函数。如果您不将其传递给父类(super class),则您在 XML 中指定的 id 永远不会在 View 上设置,因此 findViewById() 将找不到具有给定 ID 的它。

关于android - findViewById 不适用于特定 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51418503/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com