android.view.InflateException 扩展 AppCompatSpinner 时

android.view.InflateException when extending AppCompatSpinner

我在过去扩展 LinearLayout 或 android.support.v7.widget.CardView 时成功创建了自定义视图,但是从 android.support.[= 扩展时我似乎无法让它工作31=]。我不明白为什么这个特定 class 会出现问题,所以我一定是忽略了一些东西。

我有以下 class 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 class 时,一切正常,我没有得到 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.access00(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.access00(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.access00(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.access00(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

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