Java 空指针异常-在以编程方式创建的布局中设置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文件: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的按钮
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);