【发布时间】:2017-01-30 14:19:03
【问题描述】:
我必须为 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。
【问题讨论】:
-
可以分享一下你的activity_main.xml的内容吗?
-
我明白了,我的只是一个疯狂的猜测。无论如何,如果您不设置侦听器,问题就消失了,那么在膨胀 xml 时它会崩溃,这很奇怪......?
-
当我从 EditText2 中删除我的监听器时,它工作正常。
-
我刚刚尝试了代码,它可以工作,你能从 logcat 发布完整的堆栈跟踪吗?
标签: android android-edittext listener android-inflate