我遇到了一个我无法解决的问题。另一组眼睛会很方便。我已经查看了这个问题Null reference object和Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference,我已经检查过以确保我按照他们的说法进行操作,并且我相信我是因为xml中的文本输入存在正确的ID,并且我可以看到对象的声明,并且没有拼写错误。当我放置.
我检查了我的代码,这对我来说似乎是对的。我正在创建变量并向它传递一个元素,该元素存在于它引用的视图上。以下是我的代码。正如您所看到的,我正在创建一个具有文本输入元素值的编辑文本对象 - 该行似乎正在运行,然后在下一行上出现错误,指出无法在空对象引用上调用getText()
。我在按下单击之前输入文本,因此它不应为null。点击发生在一个片段中;我不认为这是问题,但我可能是错的。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View view = inflater.inflate(R.layout.fragment_ping, container, false);
Button pingButton = (Button) view.findViewById(R.id.pingButton);
pingButton.setOnClickListener(this);
return view;
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.pingButton:
EditText text = (EditText) v.findViewById(R.id.editText);
String value = text.getText().toString();
String s = ping(value);
TextView result = (TextView) v.findViewById(R.id.textView);
result.setText(s);
break;
}
}
我现在有点不知所措。我不明白为什么会这样。我该怎么做才能解决这个问题?
回溯:
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: FATAL EXCEPTION: main
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: Process: uk.aperture.pinger, PID: 10966
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at uk.aperture.pinger.Ping.onClick(Ping.java:112)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at android.view.View.performClick(View.java:5198)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:21147)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-05 12:35:49.323 10966-10966/uk.aperture.pinger E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
编辑:
出于某种原因,这个问题被标记为重复 - 它不是 - 然后恕我直言,错误地关闭了。这个问题完全有效;你可以看到我有一个任务和访问任务。我相信我正在传递整个视图,如我发布的扩展代码所示。
答案 0 :(得分:3)
您已使用pingButton
的视图查找EditText的ID
EditText text = (EditText) v.findViewById(R.id.editText);
装置
EditText text = (EditText) pingButton.findViewById(R.id.editText);
使用layout
视图查找子视图的ID
为什么NPE
?
因为:EditText
不在Botton
答案 1 :(得分:0)
这个问题的答案是由@Amy的评论中提到的。问题是我认为整个视图都传递给了click函数;事实证明,事实并非如此。所以我要解决的问题是将TextView和EditText的声明移到类的顶部并使它们始终可访问,然后在onCreateFunction
中将元素分配给它们并且能够访问来自然后呢。这是我修改过的代码,不包括班级顶部的声明。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_ping, container, false);
Button pingButton = (Button) view.findViewById(R.id.pingButton);
pingText = (EditText) view.findViewById(R.id.editText);
pingResult = (TextView) view.findViewById(R.id.textView);
pingButton.setOnClickListener(this);
return view;
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.pingButton:
String value = pingText.getText().toString();
boolean s = ping(value);
if(s == true)
{
pingResult.setText("Successful ping to " + value);
} else {
pingResult.setText("Unsuccessful ping to " + value);
}
break;
}
}
感谢那些评论的人。我不知道完整的视图没有通过。