如何在类构造函数中正确使用findViewById?

时间:2019-03-25 08:37:38

标签: java android

我正在尝试将ID应用于ImageButton,但它在构造函数的最后一行崩溃。

它在循环的第一次迭代时崩溃

这是我的xml:

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_weight="1"
  android:gravity="center"
  android:orientation="vertical">

  <ImageView
    android:id="@+id/imageView0"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:adjustViewBounds="true"
    android:onClick="makeMove"
    android:tag="0"
    android:scaleType="centerInside"
    app:srcCompat="@drawable/white" />

  //imageView1 ... imageView41

  <ImageView
    android:id="@+id/imageView41"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:adjustViewBounds="true"
    android:scaleType="centerInside"
    app:srcCompat="@drawable/white" />

</LinearLayout>

ImageButtonClass:

我不得不在构造函数内部使用MainActity,因为我无法访问findViewById方法。

public class ImageButtonClass 
{

    int id;
    int arrId;
    String color;
    ImageButton imageButton;

    ImageButtonClass(MainActivity mainActivity, int id, int arrId)
    {
    this.arrId = arrId;
    this.id = id;
    this.color = "White";

    //crashes on next line.
    imageButton = (ImageButton) mainActivity.findViewById(arrId); 
    }

}

和MainActivity:

我之所以使用getResources,是因为XML中的所有ID都具有相同的名称,但结尾不同。

ArrayList<ImageButtonClass> mBoard;

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

    mBoard = new ArrayList<>();

    for(int i = 0; i < 42; i++)
    {
    int itemId = getResources().getIdentifier("imageView" + i, "id", 
    getPackageName());
    mBoard.add(new ImageButtonClass(this,i,itemId));
    }
}

1 个答案:

答案 0 :(得分:0)

java.lang.ClassCastException:android.support.v7.widget.AppCompatImageView无法转换为android.widget.ImageButton

也许您会看到此异常。

ImageView无法转换为ImageButton。

将视图类型imageview更改为imagebutton或将ImageButtonClass-imageButton的类型更改。