【问题标题】:Error inflating class with custom Listener使用自定义侦听器膨胀类时出错
【发布时间】: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


【解决方案1】:

为了扩展您的自定义视图,您需要在 xml 中使用类的全名(带有包名),例如

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

【讨论】:

  • in order to inflate your custom view.... - 这不是 100% 正确的。仅当您的小部件未使用 android.widget 作为包时,您才需要这样做
  • 哦,谢谢,所以这意味着如果在名为 android.widget 的包中创建我的自定义视图,我可以只使用 xml 中的类名?
  • 是的,完全正确。当然,您可能会小心类命名以避免可能与支持 lib 提供的类发生冲突,但至少您不需要输入完整的类名。或者,您可以在 android.widget 中创建小部件,这些小部件只是扩展您使用的任何小部件(即来自其他人的库),并且也可以使用。
  • 感谢您知道这很有趣,在 xml 中只有类名看起来更简洁
猜你喜欢
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多