2016-05-02 11 views
0

Warum funktioniert der EditText instanceof Call nicht, aber der TextView instanceof Call ist?EditText und instanceof funktioniert nicht?

Kann ich das mit Generika oder einem anderen besseren Weg lösen?

public class MyActivity extends ActionBarActivity 
... 
    @Override 
    public void updateView() { 
     updateField(noteEditText, vault.getNote()); 
     updateField(categoryTextView, category.getName()); 
    } 

    private void updateField(View current, String data) { 
     if(current instanceof EditText && data.equals(((EditText) current).getText())) { 
      ((EditText) current).setText(data); 
     } else if(current instanceof TextView && data.equals(((TextView) current).getText())) { 
      ((TextView) current).setText(data); 
     } 
    } 
... 
+1

im Grunde, weil Sie den '' && ignoriert. 'instanceOf' funktioniert einwandfrei, aber die Art, wie Sie eine Zeichenfolge daraus erhalten, ist falsch. '((EditText) current) .getText()' liefert ein 'Editierbares' Objekt, keine Zeichenkette. so ** eine Bedingung des Betreibers und ist nicht wahr **. '((EditText) current) .getText(). ToString()' ist was Sie wollen. –

Antwort

3

EditText.getText() gibt kein String aber ein Editable Objekt, das ist der Grund, warum die erste Prüfung nicht immer. Rufen Sie einfach toString() auf dem Ergebnis der ((Editable)current).getText():

if(current instanceof EditText && data.equals(((EditText) current).getText().toString())) { 
    ((EditText) current).setText(data); 
} else if(current instanceof TextView && data.equals(((TextView) current).getText().toString())) { 
    ((TextView) current).setText(data); 
} 
0

Ein anderer Weg:

try { 
    ((EditText) current).setText(data); 
} catch (Exception e){ 
    // Not an EditText 
    try { 
    ((TextView) current).setText(data); 
    } catch (Exception e){ 
    // Not a textView 
    } 
} 
+1

Verwenden Sie keine Ausnahmen anstelle von if-else-Blöcken ...! – Massimo

Verwandte Themen