当我为它分配一个 textView ID 时,TextView 被设置为 null
TextView is set to null when I assign it a textView ID
我正在做一个项目,我需要在单击按钮时更改 3 个 textView。
这是我的 MainActivity class:
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);
}
}
在这个 class 中,我声明了 3 个文本视图,tvInsult1
、tvInsult2
和 tvInsult3
。然后使用 assignTextViews
方法从 insult_screen
为它们分配相应的 textView。
单击按钮时,它会将布局设置为 insult_screen
并调用 generateInsult
方法。在此方法中,我将字符串变量 randomStr1
设置为存储在我的值文件夹中的字符串数组中的一个字符串。 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 分配了视图。我已经研究了多个与此类似的其他问题,但 none 的解决方案对我有用。
这是另一个相关代码:
主屏幕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>
这是调试器的图片,显示数组不为空并且 randomStr1
已从数组中分配了一个值:
问题出在您使用的布局 XML 上。您正尝试在加载 home_screen
布局 XML 的情况下使用名为 insultText1
的文本视图,但它没有电视,只有 insult_layout
有(您调用了 home_screen
由 mHomeLayout = true
).
我正在做一个项目,我需要在单击按钮时更改 3 个 textView。
这是我的 MainActivity class:
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);
}
}
在这个 class 中,我声明了 3 个文本视图,tvInsult1
、tvInsult2
和 tvInsult3
。然后使用 assignTextViews
方法从 insult_screen
为它们分配相应的 textView。
单击按钮时,它会将布局设置为 insult_screen
并调用 generateInsult
方法。在此方法中,我将字符串变量 randomStr1
设置为存储在我的值文件夹中的字符串数组中的一个字符串。 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 分配了视图。我已经研究了多个与此类似的其他问题,但 none 的解决方案对我有用。
这是另一个相关代码:
主屏幕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>
这是调试器的图片,显示数组不为空并且 randomStr1
已从数组中分配了一个值:
问题出在您使用的布局 XML 上。您正尝试在加载 home_screen
布局 XML 的情况下使用名为 insultText1
的文本视图,但它没有电视,只有 insult_layout
有(您调用了 home_screen
由 mHomeLayout = true
).