Android:为图像按钮数组设置ID

时间:2015-06-01 00:40:08

标签: android for-loop onclick onclicklistener imagebutton

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

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

当我参加此活动时活动崩溃,这是因为这部分代码。调试代码时,我无法提供任何有用的信息,所以任何帮助都将不胜感激,谢谢!

在我的活动顶部:

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();
}

我的活动XML部分     

        <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>

3 个答案:

答案 0 :(得分:0)

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

这意味着您必须满足于ImageButton[]作为声明,然后在onCreate()被调用后在setContentView()中初始化其值。

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 :(得分:0)

好的..好的现在,逐步逐步进行。

第1步:定义视图,因为我们在视图中包含df2.drop('Year',1).reset_index() Year Value 0 91 1 1 92 0 2 93 4 3 94 7 4 95 10 5 96 0 6 97 0 7 98 13 android:onClick属性。

android: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",其关联TextView ID为android:onClick="downButtonOnClick"属性。

第2步:

而不是android:tagsetPlusButtons()定义setMinusButtons()upButtonOnClick()之类的,

downButtonOnClick()

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

那就是它。你不需要声明ImageButtons,TextView的Id的数组,并且不需要设置点击监听所有图像按钮。

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

答案 2 :(得分:0)

这只是一个例子,你如何设置一组按钮的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,它就会起作用!