Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空指针异常-在以编程方式创建的布局中设置TextView的文本_Java_Android_Android Layout_Textview - Fatal编程技术网

Java 空指针异常-在以编程方式创建的布局中设置TextView的文本

Java 空指针异常-在以编程方式创建的布局中设置TextView的文本,java,android,android-layout,textview,Java,Android,Android Layout,Textview,我正在尝试设置TextView的文本。但是,每当我单击应向TextView添加文本的按钮时,我都会收到以下错误: NullPointerException:尝试在logcat中的空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)” 当前,init()函数以编程方式在linearlayout内创建/对齐TextView。接下来,我实例化TextView Whole1。然后为可以修改TextView的按钮

我正在尝试设置TextView的文本。但是,每当我单击应向TextView添加文本的按钮时,我都会收到以下错误:

NullPointerException:尝试在logcat中的空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”

当前,init()函数以编程方式在linearlayout内创建/对齐TextView。接下来,我实例化TextView Whole1。然后为可以修改TextView的按钮设置OnClickListener。错误提到的特定行在setWholeOnClickListener()内:

Whole1.setText(button.getText())

我找到了一个参考资料,但解决这个问题运气不好。我错过了什么

以下是我的Java文件:

public class MainActivity extends AppCompatActivity {
  TextView Whole1;
  private boolean isNull = true;

  private int[] wholeButtons = {R.id.wholeButton1, R.id.wholeButton2, R.id.wholeButton3, R.id.wholeButton4, R.id.wholeButton5, R.id.wholeButton6, R.id.wholeButton7, R.id.wholeButton8, R.id.wholeButton9, R.id.wholeButton0};

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    init();
    Whole1 = (TextView) findViewById(R.id.Whole1);
    setWholeOnClickListener();
  }

  private void setWholeOnClickListener() {
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button button = (Button) v;
            if (isNull) {
                Whole1.setText(button.getText());
                isNull = false;
            } else {
                Whole1.append(button.getText());
            }
        }
    };
    for (int id : wholeButtons) {
        findViewById(id).setOnClickListener(listener);
    }
  }

  /* Initializes the first view for input */
  private void init() {
    LinearLayout Result = (LinearLayout) findViewById(R.id.Result);

    RelativeLayout Mixed = new RelativeLayout(this);
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.MATCH_PARENT);
    Mixed.setLayoutParams(params);

    TextView Whole1 = new TextView(this);
    TextView Fraction1 = new TextView(this);
    TextView Num1 = new TextView(this);
    TextView Den1 = new TextView(this);

    /* Scale is a screen dependent value, used for filling the screen */
    final float scale = getResources().getDisplayMetrics().density;
    int pixels = (int) (2 * scale + 0.5f);


    /* Fraction bar 1 */
    params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, pixels);
    params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.RIGHT_OF, Whole1.getId());
    Fraction1.setBackgroundColor(Color.BLACK);
    Fraction1.setText("________"); // Placeholder
    Fraction1.setLayoutParams(params);
    Mixed.addView(Fraction1);

    /* Numerator 1 */
    params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ABOVE, Fraction1.getId());
    Num1.setText("3");
    Num1.setGravity(Gravity.CENTER);
    Num1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
    Num1.setLayoutParams(params);
    Mixed.addView(Num1);

    /* Denominator 1 */
    params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.BELOW, Fraction1.getId());
    Den1.setText("4");
    Den1.setGravity(Gravity.CENTER);
    Den1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
    Den1.setLayoutParams(params);
    Mixed.addView(Den1);

    /* Whole 1 */
    params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.MATCH_PARENT);
    params.addRule(RelativeLayout.LEFT_OF, Num1.getId());
    params.addRule(RelativeLayout.CENTER_VERTICAL);
    Whole1.setGravity(Gravity.CENTER);
    Whole1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 40);
    Whole1.setLayoutParams(params);
    Mixed.addView(Whole1);

    Result.addView(Mixed);

    Result.invalidate();
  }
}
在活动布局中查找id为
R.id.Whole1
TextView
。 您以编程方式创建了一个TextView,将其分配给您的Whole1变量,然后使用新的分配来重写该变量
Whole1=(TextView)findViewById(R.id.Whole1);

在这之后,它可能是空的,因为在您膨胀的布局XML中没有具有该id的
TextView

尝试使用setId(int id)@SaitejaPrasadam以编程方式设置id。此方法有效。我在init()函数中使用了setId(),并使用了findViewById()使用硬编码ID。当我使用findViewById(R.ID.Whole1)时,它仍然不起作用但是。你知道为什么会这样吗?为什么不重写你在类中声明的textview??simple@SaitejaPrasadam感谢您的回复!这是一个可行的解决方案。不过,我仍然很好奇为什么R.id.Whole1不起作用,而硬编码id为1000就可以了。请尝试Mixed.findViewById(…)您的textview是相对布局的一部分。即使覆盖变量,它也不会捕获所需的textview吗?
 Whole1 = (TextView) findViewById(R.id.Whole1);