无法在onClick方法中输出EditText元素的内容

时间:2017-03-06 10:25:22

标签: java android

我在Android StudioJava开发应用程序方面相对较新,最近遇到了一个我无法弄清楚的问题。目前,我想要实现的是在点击EditText后输出Button字段的内容。

由于我很可能稍后会向Activity添加更多按钮,因此我认为使用通用onClick会更方便,您可以在{{1}内分隔不同的按钮操作声明。

以下是不使用通用switch方法的onClickListener的工作示例:

onClick

现在,如果我尝试使用通用package com.example.user.myapp; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { private EditText testText; private Button testButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // initialize UI elements final EditText testText = (EditText) findViewById(R.id.testText); testButton = (Button) findViewById(R.id.testButton); // set onClick listener testButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // it will print the content of testText as long as the "testText" variable is declared as final System.out.println(testText.getText().toString().trim()); } }); } } 方法,我会突然收到以下错误:

onClick

以下是导致上述错误的代码:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:2)

在您定义testText两次

的第二个代码上

将起作用

package com.example.user.myapp;

import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText;

public class MainActivity extends Activity implements View.OnClickListener {

    private EditText testText;
    private Button testButton;

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

        // initialize the UI elements
        testText = (EditText) findViewById(R.id.testText);
        testButton = (Button) findViewById(R.id.testButton);

        // set onClick Listener
        testButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.testButton:                       
                // this will result in an error                                       
                System.out.println(testText.getText().toString().trim());
                break;
            default:
                break;
    }
}

答案 1 :(得分:1)

全局Decalre editText:

private EditText testText;

在onCreate()中获取视图:

testText = (EditText) findViewById(R.id.testText);

在onClick中使用它:

System.out.println(testText.getText().toString().trim());

答案 2 :(得分:1)

您永远不会初始化private EditText testText;,因为您使用的是本地变量,而不是在以下调用中引用类字段:

final EditText testText = (EditText) findViewById(R.id.testText);

onClick(View v)是实现OnClickListener接口的匿名类的方法,此方法引用未初始化字段变量 testText

要解决此问题,请在调用findViewById()之前删除变量的类型声明:

this.testText = (EditText) findViewById(R.id.testText)

答案 3 :(得分:0)

你已经声明了EditText 2次,一次是全局的,另一次是onCreate方法,当你在onCreate之外使用Edittext时,你得到的是未初始化的全局变量,这就是你得到这个错误的原因。用这个,

public class MainActivity extends Activity implements View.OnClickListener {

    private EditText testText;
    private Button testButton;

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

        // initialize the UI elements
        testText = (EditText) findViewById(R.id.testText);
        testButton = (Button) findViewById(R.id.testButton);

        // set onClick Listener
        testButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.testButton:                       
                // this will result in an error                                       
                System.out.println(testText.getText().toString().trim());
                break;
            default:
                break;
    }
}