2017-03-06 49 views
0

我在Android StudioJavaJava中開發應用程序相對較新,最近遇到了一個我無法弄清楚的問題。目前,我試圖實現的目標是在點擊了Button之後輸出EditText字段的內容。無法在onClick方法內輸出EditText元素的內容

由於我很可能會在後面添加更多按鈕到Activity,所以我認爲使用通用onClick可以更方便,您可以在switch語句中分開不同的按鈕操作。

這裏的工作示例中,不使用通用onClick方法onClickListener

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

下面是導致上述提及的錯誤的代碼:

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 
     EditText testText = (EditText) findViewById(R.id.testText); 
     Button 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; 
    } 
} 

我在這裏錯過了什麼嗎?

+0

分享您的佈局? – uguboz

+5

你定義了'EditText testText'兩次 – Jens

+0

使用全局或局部變量 – uguboz

回答

2

在你的第二個代碼,您已經定義testText兩次

,將工作

包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; 
    } 
} 
+0

Omg,現在我真的覺得很蠢......謝謝! –

+0

只要有可能,我會接受這個答案:)乾杯! –

1

Decalre EDITTEXT全球:

private EditText testText; 

獲取的onCreate視圖():

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

使用它在onclick:

System.out.println(testText.getText().toString().trim()); 
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) 
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; 
    } 
}