Android:XMLを使用してトグルボタンに2つの異なる画像を指定する


100

デフォルトのToggleButton外観を上書きしようとしています。これは以下を定義するXMLですToggleButton

<ToggleButton android:id="@+id/FollowAndCenterButton"
        android:layout_width="30px"
        android:layout_height="30px"
        android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
        android:layout_marginLeft="5px"
        android:layout_marginTop="5px" android:background="@drawable/locate_me"/>

これで、クリックされた状態とクリックされていない状態に使用する2つの30 x 30アイコンがあります。現在、状態に応じてプログラムで背景アイコンを変更するコードがあります。

centeredOnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (centeredOnLocation.isChecked()) {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me_on));
            } else {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me));
            }
        }
});

明らかに、これを行うためのより良い方法を探しています。私は自動的に状態を切り替える背景画像のセレクターを作ろうとしました:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/locate_me" /> <!-- default -->
 <item android:state_checked="true"
       android:drawable="@drawable/locate_me_on" /> <!-- pressed -->
 <item android:state_checked="false"
       android:drawable="@drawable/locate_me" /> <!-- unchecked -->

しかし、これは機能しません。ToggleButtonAPI(http://developer.android.com/reference/android/widget/ToggleButton.html)を読み取ると、継承されたxml属性のみが

    XML Attributes
Attribute Name  Related Method  Description
android:disabledAlpha       The alpha to apply to the indicator when disabled. 
android:textOff         The text for the button when it is not checked. 
android:textOn      The text for the button when it is checked. 

クラスにメソッドisChecked()とがあるにもかかわらず、android:state_checked属性がないようですsetChecked()

それで、私がXMLでやりたいことをする方法はありますか、それとも厄介な回避策で立ち往生していますか?


テキストを使用していない場合は、を使用しCompoundButtonた方がよいと思います。
Timmmm

1
それを無視してください。CompoundButton抽象的です!
Timmmm

回答:


159

あなたのコードは大丈夫です。ただし、トグルボタンは一致するセレクターの最初の項目を表示するため、デフォルトが最後になります。次のようにアイテムを配置して、すべてが確実に使用されるようにします。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" /> //currently pressed turning the toggle on
    <item android:state_pressed="true" /> //currently pressed turning the toggle off
    <item android:state_checked="true" /> //not pressed default checked state
    <item /> //default non-pressed non-checked
</selector>

3
それは完全に理にかなっています。セレクターとスイッチのステートメントを関連付けたことはありません。
I82多くの2009年

あなたは私の一日を作りました...私はボタン、チェックボックスに問題があり、ラジオボタンも試しました、最後にこの投稿は役に立ちました。Vitaly PolonetskyとI82Muchに心から感謝します
David Prun 2010

8
ドキュメントのどこかで、上から読み取り、条件がすべて満たされる最初の状態で停止することが記載されているため、デフォルトが上にある場合、そのドローアブルを通り越すことはありません。
Travis

1
@ I82 switch多くの場合、順序に関係なく常に「正しいもの」が選択されますが、これはのようなif-elseif-elseif-else条件でより長く動作しますstate_x == true && state_y == false && state_z = true
TWiStErRob 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.