使用自定义侦听器

时间:2017-01-30 14:19:04

标签: android android-edittext listener android-inflate

我必须为EditText编写选择监听器。当我尝试启动我的应用时,它会在到达setContentView(R.layout.activity_main);时崩溃,并显示以下错误消息:

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

我的代码:

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>

请告诉我我做错了什么。

编辑: 我必须说它只是一个例子(我的代码在这个例子中运行正常),我现在正在为另一个应用程序编写代码。它有类似的代码,它使用xml中的类的完整路径。但它产生错误信息,我不知道为什么。我无法在那里发布真实应用的完整代码。但是当我从EditText2中删除监听器时它在真实应用程序中工作正常,当我再次添加它时,我收到此错误消息。因此,工作和崩溃之间的唯一区别是我的监听器实现,两者都使用相同的xml,相同的自定义类EditText2。

1 个答案:

答案 0 :(得分:1)

为了扩充您的自定义视图,您需要使用xml中的类的全名(包名称),例如。

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