自定义线性组件构造函数未膨胀 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/
我制作了一个扩展线性布局的自定义数字选取器,我对构造函数有疑问,出于某种原因,当我将枚举传递给构造函数时,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/