2017-01-30 3 views
1

Ich musste Auswahl Listener für EditText schreiben. Wenn ich versuche, meine App zu starten, stürzt es, wenn setContentView(R.layout.activity_main); mit dieser Fehlermeldung erreicht:Fehler beim Aufblasen der Klasse mit benutzerdefinierten Listener

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.insymplify.user.editabletext/com.insymplify.user.editabletext.MainActivity}: android.view.InflateException: Binary XML file line #20: Binary XML file line #20: Error inflating class EditText2 

Mein Code:

MainActivity.java

public class MainActivity extends AppCompatActivity { 

EditText2 textField; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    textField = (EditText2)findViewById(R.id.text_field); 

    textField.addSelectionWatcher(new EditText2.SelectionWatcher() { 
     @Override 
     public void onSelection(int start, int end) { 
      Log.d("SELECTION", Integer.toString(start) + ":" + Integer.toString(end)); 
     } 
    }); 
} 

} 

EditText2.java

public class EditText2 extends EditText { 

private List<SelectionWatcher> mSelectionListeners; 

public interface SelectionWatcher{ 
    void onSelection(int start, int end); 
} 

public void addSelectionWatcher(SelectionWatcher watcher){ 
    if (mSelectionListeners == null){ 
     mSelectionListeners = new ArrayList<SelectionWatcher>(); 
    } 
    mSelectionListeners.add(watcher); 
} 

@Override 
protected void onSelectionChanged(int start, int end){ 
    super.onSelectionChanged(start, end); 

    if (mSelectionListeners != null) 
     for (SelectionWatcher l : mSelectionListeners) 
      l.onSelection(start, end); 

} 

public EditText2(Context context) { 
    super(context); 
} 

public EditText2(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public EditText2(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.insymplify.user.editabletext.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     android:id="@+id/textView"/> 

    <com.insymplify.user.utils.EditText2 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="phone" 
     android:ems="10" 
     android:layout_below="@+id/textView" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="14dp" 
     android:layout_marginStart="14dp" 
     android:id="@+id/text_field"/> 
</RelativeLayout> 

Bitte sagen Sie mir, was ich falsch gemacht habe.

EDIT: Ich muss sagen, dass es nur Beispiel ist (und mein Code funktioniert in diesem Beispiel gut), ich schreibe gerade Code für eine andere Anwendung. Es hat ähnlichen Code und verwendet den vollständigen Pfad zur Klasse in XML. Aber es erzeugt eine Fehlermeldung und ich weiß nicht warum. Ich kann dort nicht den vollständigen Code der realen Anwendung posten. Aber wenn ich Listener von EditText2 lösche funktioniert es gut in der realen App, wenn ich es wieder hinzufüge, erhalte ich diese Fehlermeldung. Der einzige Unterschied zwischen funktionierenden und abstürzenden ist also meine Listener-Implementierung, beide benutzen dieselbe XML, dieselbe benutzerdefinierte Klasse EditText2.

+2

Können Sie den Inhalt Ihrer activity_main.xml teilen? – ChicoDelaBarrio

+0

Ich sehe, meine war nur eine wilde Vermutung. Wie auch immer, es ist komisch, dass es beim Aufblasen des Xml abstürzt, wenn das Problem verschwunden ist, wenn Sie den Listener nicht einstellen ...? – lelloman

+0

Wenn ich meinen Listener aus EditText2 lösche, funktioniert es einwandfrei. – Noqrax

Antwort

1

Um Ihre benutzerdefinierte Ansicht aufzublasen, müssen Sie den vollständigen Namen der Klasse in der XML-Datei (mit dem Paketnamen) verwenden, z.

<com.noqrax.myapp.EditText2 
    android:id="... 
    /> 
+0

', um Ihre benutzerdefinierte Ansicht aufzublähen ....' - Dies ist nicht 100% wahr. Sie müssen nur tun, wenn Ihr Widget nicht verwendet "android.widget" als Paket –

+0

ouh danke, so bedeutet es, dass, wenn meine benutzerdefinierte Ansicht im Paket namens android.widget kann ich nur den Klassennamen in der XML verwenden? – lelloman

+0

Ja genau. Natürlich können Sie bei der Klassenbenennung vorsichtig sein, um mögliche Konflikte mit beispielsweise von der Unterstützung für Bibliotheken bereitgestellten Klassen zu vermeiden, aber Sie müssen zumindest keine vollständigen Klassennamen eingeben. Alternativ können Sie Widgets in 'android.widget' erstellen, die einfach jedes verwendete Widget erweitern (d. H. Von anderen Bibliotheken) und das funktioniert auch. –

Verwandte Themen