【发布时间】:2018-01-05 00:25:50
【问题描述】:
我正在做一个项目,当单击按钮时我需要 3 个 textView 来更改。
这是我的 MainActivity 类:
package davidferrara.insultgenerator;
import android.content.res.Resources;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private boolean mHomeLayout = true;
private Resources res;
private TextView tvInsult1;
private TextView tvInsult2;
private TextView tvInsult3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(mHomeLayout) {
setContentView(R.layout.home_screen);
}
else {
setContentView(R.layout.insult_screen);
}
findViewById(R.id.generateInsultButton).setOnClickListener(btnMainButton);
assignTextViews();
}
//The generate insult button
final View.OnClickListener btnMainButton = new View.OnClickListener() {
@Override
public void onClick(final View v) {
mHomeLayout = false;
setContentView(R.layout.insult_screen);
generateInsult();
}
};
private void generateInsult(){
res = getResources();
String[] array1 = res.getStringArray(R.array.insults0);
String randomStr1 = array1[new Random().nextInt(array1.length)];
tvInsult1.setText(randomStr1);
String[] array2 = res.getStringArray(R.array.insults1);
String randomStr2 = array2[new Random().nextInt(array2.length)];
tvInsult2.setText(randomStr2);
String[] array3 = res.getStringArray(R.array.insults2);
String randomStr3 = array3[new Random().nextInt(array3.length)];
tvInsult3.setText(randomStr3);
}
private void assignTextViews(){
tvInsult1 = findViewById(R.id.insultText1);
tvInsult2 = findViewById(R.id.insultText2);
tvInsult3 = findViewById(R.id.insultText3);
}
}
在这个类中,我声明了 3 个 textView,tvInsult1、tvInsult2 和 tvInsult3。然后使用assignTextViews 方法从insult_screen 为它们分配相应的文本视图。
单击按钮时,它将布局设置为insult_screen,并调用generateInsult 方法。在此方法中,我将字符串变量 randomStr1 设置为存储在我的 values 文件夹中的字符串数组中的字符串。 textView tvInsult1 然后使用randomStr1 获取文本集,或者应该如此。
运行程序时,tvInsult1.setText(randomStr1); 行出现此错误:
01-04 18:44:51.160 7699-7699/davidferrara.insultgenerator E/AndroidRuntime: FATAL EXCEPTION: main
Process: davidferrara.insultgenerator, PID: 7699
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
我回去并在那行代码之前放了一个中断来调试它,结果发现tvInsult1 为空。这就是我卡住的地方。我已经使用 findViewById 分配了视图。我已经查看了多个与此类似的其他问题,但没有一个解决方案对我有用。
这是其他相关代码:
主屏幕 XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/welcome_message" />
<Button
android:id="@+id/generateInsultButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/generate_button" />
</LinearLayout>
侮辱屏幕 XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="davidferrara.insultgenerator.MainActivity">
<TextView
android:id="@+id/insultText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible" />
<TextView
android:id="@+id/insultText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible" />
<TextView
android:id="@+id/insultText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible" />
<Button
android:id="@+id/generateInsultButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/generate_button" />
</LinearLayout>
【问题讨论】:
-
你确定
array1不为空吗? -
这个问题太长了。您应该只显示代码的必要部分。
-
@statosdotcom 数组不为空。当我调试时,我确保从数组中为 randomstr1 分配了一个随机字符串。
-
@Taslim 当我查看其他类似问题时,cmets 说没有足够的信息。这就是我包含错误消息和布局代码的原因。
-
@DaveMcFave ,请问您是如何将这些值存储在 values 文件夹中的?
string from an array of strings stored in my values folder?而且,如果您评论这三行String[] array1 = res.getStringArray(R.array.insults0); String randomStr1 = array1[new Random().nextInt(array1.length)]; tvInsult1.setText(randomStr1);会发生什么?我想你会在下一个属性上得到错误:tvInsult2.setText(randomStr2);,所以数组是空的。
标签: java android nullpointerexception textview settext