【问题标题】:Custom Linear Component Constructor not inflating XML自定义线性组件构造函数不膨胀 XML
【发布时间】:2016-08-03 19:00:16
【问题描述】:

我已经制作了一个扩展线性布局的自定义数字选择器,我对构造函数有疑问,由于某种原因,当我将枚举传递给构造函数时,活动不会膨胀 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: 致命异常: main java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.wheelsample/com.example.wheelsample.MainActivity}:android.view.InflateException:二进制 XML 文件第 26 行:膨胀类 com.example.wheelsample.tumblers 时出错。不倒翁 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 在 android.app.ActivityThread.access$600(ActivityThread.java:130) 在 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>

【问题讨论】:

    标签: android android-layout android-custom-view


    【解决方案1】:

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

    XML 膨胀:

    您在 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/

    【讨论】:

    • 您好,感谢您的回答,我已从构造函数中删除了参数并添加了一个 setter 方法,但我仍然收到相同的错误 android.view.InflateException: Binary XML file
    • 感谢您的回答,我已经接受了。在创建视图后调用的 setter 存在一个小问题,在主要活动中,我要求先调用它,然后再调用要设置的视图。我到处玩..谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多