当我为它分配一个 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 个文本视图,tvInsult1tvInsult2tvInsult3。然后使用 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_screenmHomeLayout = true).