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

时间:2016-08-03 19:00:17

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

我已经创建了一个自定义数字选择器扩展了一个线性布局,我对构造函数有问题,由于某种原因,当我将一个枚举传递给构造函数时,活动不会使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:致命异常:主要                                                                             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>

1 个答案:

答案 0 :(得分:2)

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

XML通胀:

您在XML文件中声明了自己的观点,并在从setContentView调用Activity后,可以使用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/