自定义线性组件构造函数未膨胀 XML

Custom Linear Component Constructor not inflating XML

我制作了一个扩展线性布局的自定义数字选取器,我对构造函数有疑问,出于某种原因,当我将枚举传递给构造函数时,activity 没有膨胀 XML .这是代码。

 private TumblerSettings.TumblerTypes tumblerTypes;

public Tumbler(Context context, TumblerListener tumblerCallBack, TumblerSettings.TumblerTypes
        tumblerTypes)
{
    super(context);
    this.mTumblerCallBack = tumblerCallBack;
    this.tumblerTypes = tumblerTypes;
    Log.i("sss", "Tumbler1: " + String.valueOf(tumblerTypes));
    updateValue();
    initControl(context);
    //setCustomObjectListener(mTumblerCallBack);
}

public Tumbler(Context context, AttributeSet attrs, TumblerSettings.TumblerTypes
        tumblerTypes)
{
    super(context, attrs);
    this.tumblerTypes = tumblerTypes;
    Log.i("sss", "Tumbler2: "  + String.valueOf(tumblerTypes));
    updateValue();
    initControl(context);
}

public Tumbler(Context context, AttributeSet attrs, int defStyle, TumblerSettings.TumblerTypes
        tumblerTypes)
{
    super(context, attrs, defStyle);
    this.tumblerTypes = tumblerTypes;
    Log.i("sss", "Tumbler3: "  + String.valueOf(tumblerTypes));
    updateValue();
    initControl(context);

}

我用这段代码调用它

mTumbler = new Tumbler(MainActivity.this, new Tumbler.TumblerListener()
    {
        @Override
        public void tumblerValue(final String value)
        {
            valueTextView.setText("value :" + value);
        }
    }, TumblerSettings.TumblerTypes.BRIGHTNESS);

我收到的错误是

E/AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wheelsample/com.example.wheelsample.MainActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class com.example.wheelsample.tumblers.Tumbler at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access0(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)

如有任何建议,我们将不胜感激。谢谢

XML代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="com.example.wheelsample.DualNumberPicker">

<LinearLayout
    android:layout_width="75dp"
    android:layout_height="120dp"
    android:background="@drawable/assets_tmb_wide"
    android:orientation="horizontal">

    <com.example.wheelsample.TumblerNumberPicker
        android:id="@+id/bpp"
        android:layout_width="75dp"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>

</LinearLayout>

您尝试创建视图的方式似乎有些混乱。您有两个创建视图的选项。

XML inflation:

您在 XML 文件中声明您的视图,并在从 Activity 调用 setContentView 后,您可以使用 findViewById() 获取它的实例。

例子

假设您的自定义视图名为 Tumbler,您的包名称为 com.example,并且您在 XML 文件中这样声明:

<com.example.Tumbler
  android:id="@+id/my_tumbler"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />

然后你就可以通过调用获得一个实例:

Tumbler tumbler = (Tumbler) findViewById(R.id.my_tumbler);

程序化实例化

如果您选择完全不使用 XML,您可以创建自己的视图实例:

Tumbler tumbler = new Tumbler(this);

然后您必须通过调用 addView() 将其添加到视图层次结构中的父视图。但这并不是你真正想要的,所以我建议你采用第一种方法。

此代码:

mTumbler = new Tumbler(MainActivity.this, new Tumbler.TumblerListener()
    {
        @Override
        public void tumblerValue(final String value)
        {
            valueTextView.setText("value :" + value);
        }
    }, TumblerSettings.TumblerTypes.BRIGHTNESS);

可以替换为:

mTumbler = (Tumbler) findViewById(R.id.your_tumbler_id_just_like_in_xml_file);

然后调用 setter 方法来设置枚举值:

mTumbler.setTumblerType(TumblerSettings.TumblerTypes.BRIGHTNESS)

整个事情是系统在扩充 XML 文件时调用 View(Context context, AttributeSet attrs) 构造函数。您不能只向构造函数添加自定义参数,除非您要在 Java 中动态创建实例。请改用 setter 方法。

有关视图构造函数如何工作的详细解释,请查看此页面:

http://blog.danlew.net/2016/07/19/a-deep-dive-into-android-view-constructors/