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 のサブクラスであり、同じように機能するため、それらの動作を同じ方法で実装できます。

そこで、 を含むアクティビティ レイアウト ファイルを取得し、ToggleButtonそれをディレクトリにコピーして、 のすべてのインスタンスを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だけです。ToggleButton使用していないか、まったく使用していませんSwitch

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

14未満で実行すると、うまく機能します。前と同じ。を取得しToggeButtonます。14 で実行すると、Android ウィジェット フレームワークで null クラッシュが発生します。

Android ソースをダウンロードしました。クラッシュのバックトレースから、クラッシュの場所が正確にわかります。Switch.java:

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

thumbは の新しいプロパティSwitchです。それにしても、定義しなくてもいいじゃないですか。必須プロパティとしてリストされていません。

テストとして、-v14 レイアウトに戻って、drawable に設定android:thumbしました。次に、812 行目で null をヒットしましたtrack。ドローアブルに設定android:trackすると、クラッシュはなくなりました。どうしたの?

null クラッシュが発生するのはなぜですか?

デフォルトTrackThumbドローアブルを見つけて、アプリにコピーする必要がありますか?

私がやろうとしていること - ToggleButton と Switch を使用する - は不可能ですか?

4

2 に答える 2

4

AndroidManifest.xml で minSdkVersion が 14 であることを確認してください

于 2012-11-25T07:26:20.877 に答える