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: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"
并且所有向下的图像按钮都应该声明 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,它就会起作用!
我正在制作一个 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: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"
并且所有向下的图像按钮都应该声明 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,它就会起作用!