3

我有一个成功使用的应用程序ToggleButton。我正在转换应用程序以在 JELLY BEAN (4.1.1) 上使用。4.1.1 有Switch小部件,这是一个更好看的ToggleButton小部件。这两个小部件都派生自CompoundButton.

Android的比较文档在这里:

http://developer.android.com/guide/topics/ui/controls/togglebutton.html

它说:

ToggleButton 和 Switch 控件是 CompoundButton 的子类,并且功能相同,因此您可以以相同的方式实现它们的行为。

所以我所做的是获取包含ToggleButtons 的活动布局文件,将其复制到目录并替换res/layout-v14/所有实例。这意味着Android 14及以上版本将使用布局文件,14以下将使用布局文件。除了小部件名称之外,每个 XML 都是相同的。ToggleButtonSwitchSwitchToggleButton

<Switch
 android:id="@+id/settings_some_option_on_off"
 android:textOn="@string/settings_toggle_on"
 android:textOff="@string/settings_toggle_off"
 android:gravity="center"
 android:paddingRight="@dimen/size_padding_minor"
 android:layout_weight="1"
 android:layout_gravity="center"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"/>

在我的 .java 代码中,我CompoundButton只使用。不使用ToggleButtonSwitch根本不使用。

private CompoundButton mViewSomeOptionOnOff;
...
mViewSomeOptionOnOff = (CompoundButton) findViewById(R.id.settings_some_option_on_off);
etc.

当我在 < 14 上运行时,效果很好。和之前一样。我得到ToggeButton. 当我在 14 上运行时,我在 Android 小部件框架中遇到了 null 崩溃。

我下载了安卓源。从崩溃回溯中,我确切地知道崩溃在哪里。开关.java:

808     @Override
809     public void jumpDrawablesToCurrentState() {
810         super.jumpDrawablesToCurrentState();
811         mThumbDrawable.jumpToCurrentState();    <------ boom
812         mTrackDrawable.jumpToCurrentState();
813     }

thumb是 的新属性Switch。即便如此,我也不应该定义它,对吧?它没有被列为强制属性。

就像测试一样,回到我的 -v14 布局中,我设置android:thumb为可绘制对象。然后我在第 812 行点击了 null track,. 我设置android:track为可绘制对象,崩溃消失了。发生什么了?

为什么我会遇到空崩溃?

我是否需要找到默认值TrackThumb可绘制对象,并将它们复制到我的应用程序中?

我正在尝试做的事情——使用 ToggleButton 和 Switch——不可能吗?

4

2 回答 2

4

确保您的 minSdkVersion 在 AndroidManifest.xml 上为 14

于 2012-11-25T07:26:20.877 回答
0

我也遇到了这个错误,并通过为 api 14 及更高版本设置主题来解决它 - 正如 nandeesh 评论的那样。

于 2014-01-05T12:55:26.190 回答