Android Studio:findViewId无法使用自定义视图

时间:2017-03-21 16:44:21

标签: android findviewbyid

我已经阅读了与此相关的所有其他问题,并且大多数答案都是指所有视图,问题通常在于所有视图,但是如果我在代码中的同一位置调用findviewbyid作为内置视图,那么返回视图,但如果我为自定义视图调用它,它只返回null。两个视图都在同一个地方,在相同的布局中,有ID,它们是布局xml文件中的碳副本。我正确地覆盖了每个中的customView调用super(...)的所有构造函数。我在setContentView之后调用findViewById,并在Activity类中调用。

我的问题是,除了覆盖构造函数之外,还需要对自定义视图做什么以允许函数findViewByID找到它?必须要有一些东西缺失。

protected void initClickCounter() {
    numberClicks = new DigitViewGroup(this);
    ImageDigitView v1;
    ImageView v2;

    v1 = (ImageDigitView) findViewById(R.id.imageViewDigit1);
    v2 = (ImageView) findViewById(R.id.imageViewDigit1_2);

v1始终为null,而v2永远不为空。

<com.bilowik.debugg.ImageDigitView
    android:id="@+id/imageViewDigit1"
    android:layout_width="10dp"
    android:layout_height="14dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="60dp"
    android:layout_marginStart="103dp"
    android:contentDescription="@string/digit1"
    app:srcCompat="@drawable/digit_0" />

<ImageView
    android:id="@+id/imageViewDigit1_2"
    android:layout_width="10dp"
    android:layout_height="14dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="60dp"
    android:layout_marginStart="103dp"
    android:contentDescription="@string/digit1"
    app:srcCompat="@drawable/digit_0" />

除了ID之外,它们是相同的。

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

public ImageDigitView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
    init(context);
}

public ImageDigitView(Context context, AttributeSet attributeSet, int  defStyle) {
    super(context, attributeSet, defStyle);
    init(context);
}

ImageDigitView类的构造函数。

2 个答案:

答案 0 :(得分:1)

使用类似这样的例子:

View yourviewname = inflater.inflate(R.layout.yourlayout, container, false);
Button expandableButton = (Button)yourviewname.findViewById(R.id.expandableButton1);

答案 1 :(得分:0)

获取布局的 rootView ,从中可以解决。 在片段中:

    View rootView = inflater.inflate(R.layout.some_x_layout, container, false);
    TextView tv = (TextView)rootView.findViewById(R.id.tv);