2017-03-06 5 views
0

nicht ausgeben Ich bin relativ neu in der Entwicklung von Anwendungen in Android Studio oder Java und vor kurzem lief in ein Problem, das ich einfach nicht herausfinden kann. Im Moment versuche ich nur, den Inhalt des Feldes EditText auszugeben, nachdem auf Button geklickt wurde.Kann den Inhalt eines EditText -Elements innerhalb OnClick-Methode

Da ich höchstwahrscheinlich mehr Tasten zum Activity später hinzufügen werde, dachte ich, dass es praktisch wäre, ein generisches onClick zu verwenden, wo man verschiedene Tastenaktionen innerhalb der switch Anweisung trennen kann.

Hier ist ein funktionierendes Beispiel, in dem die onClickListener, die keine generische onClick Methode nicht verwenden:

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()); 
     } 
     }); 
    } 
} 

Nun, wenn ich versuche, eine generische onClick Methode zu verwenden, werde ich plötzlich folgende Fehlermeldung:

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

Hier ist der Code, dass der Fehler, der oben genannten Ursachen:

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

Fehle ich hier etwas?

+0

Teilen Sie Ihr Layout? – uguboz

+5

Sie definieren 'EditText testText' zweimal – Jens

+0

Verwenden Sie entweder globale oder lokale Variable – uguboz

Antwort

2

auf dem zweiten Code haben Sie testText zweimal

definiert, die

Paket com.example.user.myapp arbeiten;

importieren android.app.Activity; importieren android.os.Bundle; importieren android.view.View; importieren android.widget.Button; importieren 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, jetzt fühle ich mich wirklich dumm ... Danke! –

+0

Sobald es möglich ist, werde ich diese Antwort akzeptieren :) Prost! –

1

decalre editText global:

private EditText testText; 

die Ansicht in onCreate Get():

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

Verwenden Sie es in der onClick:

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

Sie nie initialisieren die private EditText testText; weil Sie verwenden ein lokalen Variable stattdessen die Klasse Feld im folgenden Aufruf der Referenzierung:

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

Die onClick(View v) ein Verfahren der anonymen Klasse ist die OnClickListener Schnittstelle und diese Methode verweist auf die uninitialized Feldvariable testtext Umsetzung .

Um dies zu beheben, entfernen Sie die Typdeklaration einer Variablen vor findViewById() Aufruf:

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

Sie haben EditText 2 Mal erklären, ist global und eine weitere ist in der onCreate Methode, und wenn Sie verwenden Edittext außerhalb der onCreate, erhalten Sie globale Variable, die nicht initialisiert wird, deshalb erhalten Sie diesen Fehler. Verwenden Sie diese,

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; 
    } 
} 
Verwandte Themen