【问题标题】:TextView is set to null when I assign it a textView ID当我为其分配 textView ID 时,TextView 设置为 null
【发布时间】: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,tvInsult1tvInsult2tvInsult3。然后使用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>

下面是调试器的图片,显示数组不是空的,randomStr1 有一个从数组分配给它的值:

【问题讨论】:

  • 你确定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


【解决方案1】:

问题在于您使用的布局 XML。您正在尝试使用名为 insultText1 的 textview 并加载您的 home_screen 布局 XML,但它没有那个电视,只有 insult_layout 有它(您通过 mHomeLayout = true 调用了 home_screen)。

【讨论】:

  • 您知道可能的解决方法吗?我希望 contentView 是 home_screen.xml 直到按下按钮。然后我希望它在剩下的时间里都是insult_screen.xml。我之前看过启动画面,但我想先试试这个方法。
  • 是的,只需使用instruction_screen.xml 打开另一个活动。知道怎么做吗?简单,用它创建另一个类。我很好奇看到这群侮辱在运行:D
  • 凭着信心和耐心,将您现在仅有的一个(main_activity)分成两个java文件。首先你只让基本的东西:欢迎信息和侮辱我按钮:)。在第二个活动中(例如,将其称为侮辱.java),您将使用所有其余代码(您已经获得的两个布局 xml 文件)。要打开一个新的活动,只需搜索、谷歌或这里,非常容易。但是,另一个主题,所以,如果我的回答是正确的,请检查一下。谢谢。
  • 这个解决方案确实有效。我的第一个意图是拥有一个可以切换不同布局的 java 类,但由于这种方法确实有效,我会保留它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 2019-04-08
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多