Android:设置图像按钮阵列的 ID

Android: Setting ID's for Array of Image Buttons

我正在制作一个 android 应用程序,它允许用户单击加号或减号图像按钮来更改文本视图中显示的数字。

有 18 个文本视图和每个文本视图的加号和减号图像按钮。

activity 当我到达 activity 时崩溃,这是因为这段代码。我在调试代码时无法提供任何有用的信息,因此我们将不胜感激,谢谢!

在我的顶部 activity:

int score = 0;
ImageButton addButtons[] = {(ImageButton)findViewById(R.id.hole1Up), (ImageButton)findViewById(R.id.hole2Up), (ImageButton)findViewById(R.id.hole3Up), (ImageButton)findViewById(R.id.hole4Up), (ImageButton)findViewById(R.id.hole5Up), (ImageButton)findViewById(R.id.hole6Up), (ImageButton)findViewById(R.id.hole7Up), (ImageButton)findViewById(R.id.hole8Up), (ImageButton)findViewById(R.id.hole9Up), (ImageButton)findViewById(R.id.hole10Up), (ImageButton)findViewById(R.id.hole11Up), (ImageButton)findViewById(R.id.hole12Up), (ImageButton)findViewById(R.id.hole13Up), (ImageButton)findViewById(R.id.hole14Up), (ImageButton)findViewById(R.id.hole15Up), (ImageButton)findViewById(R.id.hole16Up), (ImageButton)findViewById(R.id.hole17Up), (ImageButton)findViewById(R.id.hole18Up),};
ImageButton minusButtons[] = {(ImageButton)findViewById(R.id.hole1Down), (ImageButton)findViewById(R.id.hole2Down), (ImageButton)findViewById(R.id.hole3Down), (ImageButton)findViewById(R.id.hole4Down), (ImageButton)findViewById(R.id.hole5Down), (ImageButton)findViewById(R.id.hole6Down), (ImageButton)findViewById(R.id.hole7Down), (ImageButton)findViewById(R.id.hole8Down), (ImageButton)findViewById(R.id.hole9Down), (ImageButton)findViewById(R.id.hole10Down), (ImageButton)findViewById(R.id.hole11Down), (ImageButton)findViewById(R.id.hole12Down), (ImageButton)findViewById(R.id.hole13Down), (ImageButton)findViewById(R.id.hole14Down), (ImageButton)findViewById(R.id.hole15Down), (ImageButton)findViewById(R.id.hole16Down), (ImageButton)findViewById(R.id.hole17Down), (ImageButton)findViewById(R.id.hole18Down),};
int[] scoreIDs = new int[] {R.id.score1, R.id.score2, R.id.score3, R.id.score4, R.id.score5, R.id.score6, R.id.score7, R.id.score8, R.id.score9, R.id.score10, R.id.score11, R.id.score12, R.id.score13, R.id.score14, R.id.score15, R.id.score16, R.id.score17, R.id.score18,};

public void setPlusButtons()
{
    for(int i = 0; i < addButtons.length; i++)
    {
        final int j = i;
        ImageButton button = addButtons[i];

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView tv5 = (TextView) findViewById(scoreIDs[j]);
                tv5.setText(score++);
            }
        });
    }
}

public void setMinusButtons()
{
    for(int i = 0; i < minusButtons.length; i++)
    {
        final int j = i;
        ImageButton button = minusButtons[i];

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView tv5 = (TextView) findViewById(scoreIDs[j]);
                tv5.setText(score--);
            }
        });
    }
}

我的onCreate:

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

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        chosenCourseValue = extras.getString("passedChosenCourse");
    }

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            AsyncAPI APIThread = new AsyncAPI();
            APIThread.execute();
    setPlusButtons();
    setMinusButtons();
}

我的部分ActivityXML

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Holes"
            android:id="@+id/hole1"
            android:layout_marginLeft="32dp"
            android:textColor="#fff"
            android:gravity="center"
            android:background="@drawable/circle"
            android:height="45dp"
            android:width="45dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Pars"
            android:id="@+id/hole1Par"
            android:paddingLeft="22dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Score"
            android:id="@+id/score1"
            android:paddingLeft="42dp" />

        <ImageButton
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:scaleType="fitXY"
            android:adjustViewBounds="true"
            android:cropToPadding="false"
            android:id="@+id/hole1Up"
            android:gravity="center"
            android:layout_marginLeft="32dp"
            android:layout_marginTop="6dp"
            android:src="@drawable/plus"
            android:background="@null" />

        <ImageButton
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:scaleType="fitXY"
            android:adjustViewBounds="true"
            android:cropToPadding="false"
            android:id="@+id/hole1Down"
            android:gravity="center"
            android:layout_marginLeft="26dp"
            android:layout_marginTop="6dp"
            android:src="@drawable/minus"
            android:background="@null" />
    </LinearLayout>

findViewById()只会return布局设置后的View。您的代码现在将 null 值分配给 ImageButton 数组,因此当您遍历它们并尝试设置点击侦听器时,您会遇到 NPE 崩溃。

这意味着您必须让 ImageButton[] 成为一个声明,然后在调用 setContentView() 之后在 onCreate() 中初始化它的值。

ImageButton addButtons[];

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

    addButtons = new ImageButton[]{(ImageButton)findViewById(R.id.hole1Up), (ImageButton)findViewById(R.id.hole2Up)};
    setPlusButtons();
}

好吧..好了现在就一步步来吧

第 1 步: 定义视图,例如,我们在视图中包含 android:onClickandroid:tag 属性。

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Score"
        android:id="@+id/score1"
        android:paddingLeft="42dp" />

    <ImageButton
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:scaleType="fitXY"
        android:adjustViewBounds="true"
        android:cropToPadding="false"
        android:id="@+id/hole1Up"
        android:gravity="center"
        android:layout_marginLeft="32dp"
        android:layout_marginTop="6dp"
        android:src="@drawable/plus"
        android:background="@null" 
        android:onClick="upButtonOnClick" // We defines up button's onclick in xml
        android:tag="score1"/> // associated TextView id is in Tag of image button

    <ImageButton
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:scaleType="fitXY"
        android:adjustViewBounds="true"
        android:cropToPadding="false"
        android:id="@+id/hole1Down"
        android:gravity="center"
        android:layout_marginLeft="26dp"
        android:layout_marginTop="6dp"
        android:src="@drawable/minus"
        android:background="@null" 
        android:onClick="downButtonOnClick" // We defines down button's onclick in xml
        android:tag="score1"/> // associated TextView id is in Tag of image button

所以所有向上的图像按钮都应该声明 android:onClick="upButtonOnClick" 并且所有向下的图像按钮都应该声明 android:onClick="downButtonOnClick" 并且关联的 TextView ID 为 android:tag 属性.

第 2 步:

而不是 setPlusButtons()setMinusButtons() 定义 upButtonOnClick()downButtonOnClick(),例如

public void upButtonOnClick(View imageButton)
{
          int textViewId = getResources().getIdentifier(imageButton.getTag(), "id", getPackageName());
          TextView score = (TextView) findViewById(textViewId);
          score.setText(score++);
}

public void downButtonOnClick(View imageButton)
{
          int textViewId = getResources().getIdentifier(imageButton.getTag(), "id", getPackageName());
          TextView score = (TextView) findViewById(textViewId);
          score.setText(score--);
}

就是这样。您不需要声明 ImageButtons 数组、TextView 的 Id,也不需要为所有图像按钮设置点击侦听器。

注意: 确保 ImageButton 标记应与关联的 TextView ID 相同。

这只是一个示例,说明如何设置一组按钮的 ID :

Button [] buttens=new Button[5];
final int ID= R.id.bChoice1;
for (int i = 0; i < 5; i++) {
        button[i]=(Button)findViewById(ID+i);
    }

但请注意,只要您连续设置按钮 ID,它就会起作用!