我已经创建了一个自定义数字选择器扩展了一个线性布局,我对构造函数有问题,由于某种原因,当我将一个枚举传递给构造函数时,活动不会使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>
答案 0 :(得分:2)
您尝试创建视图的方式似乎有些混乱。您有两种创建视图的选项。
您在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/