我为自己缺乏经验而道歉,但我一直盯着我的屏幕试图完成这项工作多个小时,而我却做不到。我知道有一个简单的解决方案,我看不到,但我要么没有找到它,要么我无法理解我发现的东西。如果一个经验丰富的程序员看到这个代码然后向内部扔了一点,我就不会感到惊讶,如果你有时间,可以随意纠正我。
好的,所以我的目标是创建一个速读应用程序,因为我认为它会相对简单,但仍然足以让我学习。我创建了一个应用程序,使文本显示,并循环显示单词,但一旦它结束它会在我的脸上抛出“不幸,已经停止”并返回到MainActivity。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**My code:**
package com.example.android.speedread;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
public class ReadActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
}
public void onClickButtonStart(View view) {
//removes button once its clicked
Button btn_startReading = (Button) findViewById(R.id.btn_startReading);
btn_startReading.setVisibility(View.GONE);
//gets content from an EditText from another class
Bundle extras = getIntent().getExtras();
if (extras != null) {
String s = extras.getString("userInput");
final String[] words = s.split("\\s+");
//starts Thread for displaying said text
Thread t = new Thread() {
int currentWordNumber;
@Override
public void run() {
try {
for (int i = 0; i < words.length; i++) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv_onScreenWord = (TextView) findViewById(R.id.tv_onScreenWord);
//This is where I get an error, and I understand why I'm getting the error,
//but I'm just not sure how to deal with it.
tv_onScreenWord.setText(words[currentWordNumber = currentWordNumber + 1]);
}
});
}
} catch (InterruptedException e) {
}
}
};
t.start();
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**My layout code:**
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android.speedread1.ReadActivity"
android:background="@color/colorPrimaryWhite">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="100sp"
android:textColor="#000000"
android:id="@+id/tv_onScreenWord"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:id="@+id/btn_startReading"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:onClick="onClickButtonStart"
android:background="@color/colorPrimaryDark"
android:textColor="@color/colorPrimaryWhite" />
</RelativeLayout>
答案 0 :(得分:0)
您正在使用currentWordNumber = currentWordNumber + 1
。最初未设置currentWordNumber
,因此默认为0的整数默认值。然后在每次访问时,您都会在访问之前对其进行迭代,因此您将获得{{1}对于第一次运行,words[1]
用于第二次运行,...,words[2]
用于最后一次运行(导致异常)。
使用words[words.length]
代替currentWordNumber++
。 currentWordNumber = currentWordNumber + 1
。通常,currentWordNumber
表示使用x,然后递增(因此,在第一次迭代时,它会给出单词[0],然后从0增加到1)。另一方面,你所做的相当于x++
;你在>>之前设置值(因此,在第一次迭代中,你从0增加到1,然后得到单词[1])。
或者,移除++x
并改用currentWordNumber
。这个外部索引添加了什么?
答案 1 :(得分:0)
当你评估表达式currentWordNumber = currentWordNumber + 1
时,它在第一次迭代时的计算结果为1而不是0,因此处理第二个,而不是第一个单词。它在每次迭代时加1,所以在最后一次迭代中,表达式将等于words.length
,这是一个超过数组末尾的表达式。
如果将表达式更改为currentWordNumber++
,则用于在数组中查找值的值是currentWordNumber
的值,在它递增之前,所以在第一次迭代时,数组索引将为0,然后currentWordNumber
将递增为1.在第二次迭代中,数组索引将为1,currentWordNumber
将递增为2,依此类推。