【问题标题】:android.view.InflateException when extending AppCompatSpinner扩展 AppCompatSpinner 时出现 android.view.InflateException
【发布时间】:2017-11-17 08:25:15
【问题描述】:

我在过去扩展 LinearLayout 或 android.support.v7.widget.CardView 时成功创建了自定义视图,但是从 android.support.v7.widget.AppCompatSpinner 扩展时我似乎无法使其正常工作。我不明白为什么这对这个特定的课程来说是个问题,所以我一定忽略了一些东西。

我有以下类 CustomSpinner

public class CustomSpinner extends android.support.v7.widget.AppCompatSpinner {

    public CustomSpinner(Context context)
    {
       this(context, null);
    }

    public CustomSpinner(Context context, AttributeSet attrs)
    {
       super(context, attrs);
       init(context, attrs, 0);
    }

    public CustomSpinner(Context context, AttributeSet attrs, int defStyle)
    {
       super(context, attrs, defStyle);
       init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle)
    {
       LayoutInflater inflater = LayoutInflater.from(context);
       inflater.inflate(R.layout.view_custom_spinner, this);
    }
}

还有 R.layout.view_custom_spinner

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.AppCompatSpinner
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_custom_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="@dimen/minimum_clickable_area"
    android:gravity="center_vertical"/>

我在另一个布局中为“MyFragment”使用自定义组件,就像这样(堆栈跟踪中提到的第 11 行):

<my.custom.namespace.CustomSpinner
    android:id="@+id/view_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/> 

奇怪的是,当我从 LinearLayout 扩展 CustomSpinner 类时,一切正常,我没有收到 InflateException。

我得到以下堆栈跟踪:

java.lang.RuntimeException: Unable to start activity ComponentInfo{my.custom.namespace.MyActivity}: android.view.InflateException: Binary XML file line #8: Binary XML file line #11: Error inflating class my.custom.namespace.CustomSpinner
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3320)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3416)
                                                                         at android.app.ActivityThread.access$1100(ActivityThread.java:229)
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7407)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                      Caused by: android.view.InflateException: Binary XML file line #8: Binary XML file line #11: my.custom.namespace.CustomSpinner
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
                                                                         at my.custom.namespace.MyFragment.onCreateView(MyFragment.java:183)
                                                                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
                                                                         at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
                                                                         at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
                                                                         at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3231)
                                                                         at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3181)
                                                                         at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
                                                                         at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:572)
                                                                         at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
                                                                         at my.custom.namespace.BaseActivity.onStart(BaseActivity.java:258)
                                                                         at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1266)
                                                                         at android.app.Activity.performStart(Activity.java:6943)
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3277)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3416) 
                                                                         at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7407) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                                                                      Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class my.custom.namespace.CustomSpinner
                                                                         at android.view.LayoutInflater.createView(LayoutInflater.java:657)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
                                                                         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
                                                                         at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1001)
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:843)
                                                                         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
                                                                         at my.custom.namespace.MyFragment.onCreateView(MyFragment.java:183) 
                                                                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819) 
                                                                         at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) 
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590) 
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377) 
                                                                         at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332) 
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239) 
                                                                         at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3231) 
                                                                         at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3181) 
                                                                         at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192) 
                                                                         at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:572) 
                                                                         at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177) 
                                                                         at my.custom.namespace.BaseActivity.onStart(BaseActivity.java:258) 
                                                                         at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1266) 
                                                                         at android.app.Activity.performStart(Activity.java:6943) 
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3277) 
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3416) 
                                                                         at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7407) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                                                                      Caused by: java.lang.reflect.InvocationTargetException
                                                                         at java.lang.reflect.Constructor.newInstance(Native Method)
                                                                         at android.view.LayoutInflater.createView(LayoutInflater.java:631)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776) 
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
                                                                         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
                                                                         at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1001) 
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:843) 
                                                                         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
                                                                         at my.custom.namespace.MyFragment.onCreateView(MyFragment.java:183) 
                                                                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819) 
                                                                         at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) 
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590) 
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377) 
                                                                         at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332) 
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239) 
                                                                         at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3231) 
                                                                         at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3181) 
                                                                         at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192) 
                                                                         at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:572) 
                                                                         at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177) 
                                                                         at my.custom.namespace.BaseActivity.onStart(BaseActivity.java:258) 
                                                                         at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1266) 
                                                                         at android.app.Activity.performStart(Activity.java:6943) 
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3277) 
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3416) 
                                                                         at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7407) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                                                                      Caused by: android.view.InflateException: Binary XML file l

【问题讨论】:

  • I have successfully created custom views in the past extending LinearLayout or android.support.v7.widget.CardView 嗯 ????这听起来很奇怪。你可以发布堆栈跟踪吗?

标签: android android-spinner android-custom-view layout-inflater android-inflate


【解决方案1】:

我不明白您为什么要夸大微调器的布局。微调器本身有自己的布局,您不需要在内部创建带有微调器的 xml。对于线性布局,膨胀您自己的布局是有意义的,因为它是一个 ViewGroup 并且在您的自定义视图类中您可以绑定线性布局的子级,但对于微调器只需处理微调器布局元素,使用您的自定义视图属性来编辑布局. 总之,您不能将子级添加到微调器布局,因此为它膨胀自定义 xml 是没有意义的。只需删除 LayoutInflater inflater = LayoutInflater.from(context); inflater.inflate(R.layout.view_custom_spinner, this); 从您的代码中,您将拥有一个扩展微调器的完美工作类。

【讨论】:

  • 我现在明白了,我只需要以编程方式添加 minHeight 和重力。我还需要重新审视我的自定义 CardView 解决方案,因为我可能正在将 CardView 添加到另一个 CardView。
  • 是的,也许您应该对 CardView 使用相同的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多