我是编程的初学者。我想制作一个有3个视图的Android应用程序。
我制作了一个单词one, two, three, four, five
来显示。
我将one
放在xml
上。
当用户点击FORWARD
时,two
会再次点击FORWARD
时显示three
,当用户点击BACK
时,会显示two
}}。我可以做到这个poit。
问题是当它到达five
并且用户点击FORWARD
时,当它到达one
并且用户点击BACK
时就会崩溃。
我希望按钮什么也不做,甚至不回到one
。我希望用户知道它是列表的末尾。 BACK
按钮也存在同样的问题。我希望它留在one
。这是我的代码。请帮忙。
public class aba extends AppCompatActivity {
int i = 0;
String[] myList = {
"one",
"two",
"three",
"four",
"five"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aba);
}
//Incrementing the value by l on forwardButton click
public void forwardButton(View view) {
TextView textDisplay = (TextView) findViewById(R.id.textDisplay);
i = i + 1;
textDisplay.setText(myList[i]);
if (i == myList.length) {
i = i + 0;
}
}
//decrementing the value by l on backButton click
public void backButton(View view) {
TextView textDisplay = (TextView) findViewById(R.id.textDisplay);
i = i - 1;
textDisplay.setText(myList[i]);
if (i == 0) {
i = i - 0;
}
}
}
答案 0 :(得分:1)
数组的索引从0开始。
由于您的数组包含5个元素,因此length
的值为5,但索引编号为0,1,2,3,4。
这意味着你不想低于0和高于4。
(另外,没有理由在每次点击按钮时初始化TextView
这样的事情应该有效:
int i = 0;
String[] myList={"one", "two", "three", "four", "five"};
TextView textDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aba);
textDisplay = (TextView) findViewById(R.id.textDisplay);
}
public void forwardButton(View view) {
if(i < myList.length - 1) {
i++;
textDisplay.setText(myList[i]);
}
}
public void backButton(View view) {
if(i > 0) {
i--;
textDisplay.setText(myList[i]);
}
}
答案 1 :(得分:1)
在实际更改索引值之前,需要检查数组的结尾。此外,由于Java将数组从0索引,因此需要检查索引是否小于数组的长度。
//Incrementing the value by l on forwardButton click
public void forwardButton(View view) {
TextView textDisplay = (TextView) findViewById(R.id.textDisplay)
if (i < myList.length - 1) {
i=i+1;
}
textDisplay.setText(myList[i]);
}
//decrementing the value by l on backButton click
public void backButton(View view) {
TextView textDisplay = (TextView) findViewById(R.id.textDisplay);
if(i > 0) {
i=i-1;
}
textDisplay.setText(myList[i]);
if(i==0){
i=i-0;
}
}
答案 2 :(得分:0)
尝试从越界数组元素设置文本是导致崩溃的原因,因此您需要定位if
以确保i
在范围内尝试访问之前的myList
数组。
实际上,您的if
语句没有多大帮助。除了违规代码之后,添加或减去0根本不会改变变量,所以它无济于事。
//Incrementing the value by l on forwardButton click
public void forwardButton(View view) {
TextView textDisplay = (TextView) findViewById(R.id.textDisplay);
i = i + 1;
if (i >= myList.length) {
// myList.length is past the end of the array, so set to length - 1
i = myList.length - 1;
}
textDisplay.setText(myList[i]);
}
//decrementing the value by l on backButton click
public void backButton(View view) {
TextView textDisplay = (TextView) findViewById(R.id.textDisplay);
i = i - 1;
if (i < 0) {
// -1 is before the beginning of the array, so set to 0 (beginning of the array)
i = 0;
}
textDisplay.setText(myList[i]);
}
答案 3 :(得分:0)
第一个问题是,你的if块中i=i+0
i=i-0
没有做任何事情(任何事情)。它的工作原理与数学相同,y=x-0
可以缩减为y=x
。所以整个if
语句就像它不在那里,你可以删除它。
第二个问题是,(我认为)您要撤消之前执行的i=i+1
或i=i-1
,但这已经完成,您无法“撤消指令”。你唯一能做的就是做反向操作,所以在这种情况下i=i-1
就是i=i+1
。但是,如果您已经将文本加载到字段中并且您将使用索引-1或lenght(比最后一个索引多一个)访问数组,那么就不会改变。所以解决方案是将你的整个方法体放在if语句中并且条件被否定,所以增量和更改只会在你在数组边界内而不是在边上时发生。
编辑:你还需要纠正一个条件。数组从0开始索引,但长度是其中“抽屉”的数量。因此,当您尝试获取len-1
元素时,您正在访问数组中的最后一个字段。所以你的条件应该是if(i==myList.length-1)
,因为i
是数组的最后一个可能的索引。
答案 4 :(得分:0)
我认为您应该只检查您点击的按钮是否具有正确的ID:
public void forwardButton(View view) {
if (view.getId() == R.id.forwardButton) {
}
}
//decrementing the value by l on backButton click
public void backButton(View view) {
if (view.getId() == R.id.backwardButton) {
...
}}