关于空指针异常的Android EditText.getText()

时间:2016-01-05 12:53:00

标签: java android nullpointerexception

我遇到了一个我无法解决的问题。另一组眼睛会很方便。我已经查看了这个问题Null reference objectAttempt 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)

编辑:

出于某种原因,这个问题被标记为重复 - 它不是 - 然后恕我直言,错误地关闭了。这个问题完全有效;你可以看到我有一个任务和访问任务。我相信我正在传递整个视图,如我发布的扩展代码所示。

2 个答案:

答案 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;
        }
    }

感谢那些评论的人。我不知道完整的视图没有通过。