異なる状態の画像ボタンの背景画像を設定するにはどうすればよいですか?


80

2つの状態のimagebuttonが必要ですi)通常ii)タッチ(またはクリック)。

画像ボタンの背景に通常の画像を設定し、onclickメソッドから画像(押された状態)変更しようとしていますが、変更されません。

画像ボタンを押すと、他のボタンを押すまで画像が通常から押された状態に変わることを望んでいますが、それは起こりません

セレクターまたは実行時にこれを行う方法を誰かに提案できますか?

これが私のimagebuttonpanelコードです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:gravity="bottom"
  android:id="@+id/buttonpanel">
  <ImageButton android:id="@+id/buttonhome"
               android:layout_width="80dp"
               android:layout_height="36dp"
               android:focusable="true" 
               android:background="@drawable/homeselector">
               </ImageButton>
  <ImageButton android:id="@+id/buttonsearch"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/searchselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonreg"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/registerselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonlogin"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/loginselector"
               android:focusable="true">
               </ImageButton>
</LinearLayout>

そして私のセレクターxmlは

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<item android:state_pressed="true" android:drawable="@drawable/homehover" 
        /> <item android:state_focused="true" android:drawable="@drawable/homehover" 
        /> <item android:drawable="@drawable/home" /> <item android:state_window_focused="true" 
        android:drawable="@drawable/homehover" /> -->
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_pressed="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

また、ontouchおよびonclickイベントで画像リソースを変更しようとしましたが、役に立ちません。


私はあなたがこのようなものを探していると思います。私は前に同様の質問をしました。
Federico klez Culloca 2011年

回答:


224

次のように、ドローアブルにxmlファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_sendemail_disable" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_send_email_click" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail_roll" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail" />
</selector>

それに応じて画像を設定し、このxmlをの背景として設定しますimageButton


11
正しい。これはセレクターXMLと呼ばれます
Aman Alam

4
@Hitendra:私はopがすでにこれを知っていたと思います。質問は、セレクターが呼び出されない理由として解釈できます。
サミュエル

state_enabledは必要ですか?
Dr.jacky 2014年

4
これは通常Buttonは機能しますが、機能しませんImageButton。また、これはImageButtonandroid:src属性では機能しますが、では機能しませんandroid:background。そして、あなたとOPのセレクターの違いは何ですか(フォーマットとドローアブルの名前を除く)?私は何かが足りないのですか?
アレクサンダーマラホフ2015

@AlexanderMalakhov私にとっては、ImageButtonとandroid:backgroundで非常にうまく機能します。
トリラリオン2016年

15

これを試して

btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        btn.setBackgroundResource(R.drawable.icon);
    }
});

私にできると思っている人はいますか
Hitendra 2011年

9

うーん。私は私を助けた別の解決策を得ました、なぜなら私はちょうど2つの異なる状態を持っているからです:

  • アイテムがクリックされていない
  • またはクリックするとハイライト表示されます

私の.xmlでは、ImageButtonを次のように定義しています。

 <ImageButton
    android:id="@+id/imageButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/selector" />

対応するセレクタファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ico_100_checked" android:state_selected="true"/>
    <item android:drawable="@drawable/ico_100_unchecked"/>

</selector>

そして私のonCreateで私は呼びます:

final ImageButton ib = (ImageButton) value.findViewById(R.id.imageButton);

    OnClickListener ocl =new OnClickListener() {
        @Override
        public void onClick(View button) {
            if (button.isSelected()){
                button.setSelected(false);
            } else {
                ib.setSelected(false);
                //put all the other buttons you might want to disable here...
                button.setSelected(true);
            }
        }
    };

ib.setOnClickListener(ocl);
//add ocl to all the other buttons

完了しました。お役に立てれば。理解するのに少し時間がかかりました。


8

こんにちは、次のコードを試してみてください。

((ImageView)findViewById(R.id.ImageViewButton)).setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_over);

        if(event.getAction() == MotionEvent.ACTION_UP)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_normal);

        return false;
    }
});

1
実際、action_upが別のビューで発生した場合、これも実際には機能しません。ACTION_UPの代わりにevent.getAction()== MotionEvent.ACTION_CANCELを使用してみてください。
chug2k 2012年

3

問題はセレクターファイルではないと思います。

追加する必要があります

<imagebutton ..
    android:clickable="true"
/>

画像ボタンに。

デフォルトでは、onClickはlistitemレベル(親)で処理されます。そしてimageButtonsはonClickを受け取りません。

上記の属性を追加すると、画像ボタンがイベントを受け取り、セレクターが使用されます。

チェックボックスについても同じことを説明しているこのPOSTをチェックしてください。


1

画像ボタンを押したい場合は、画像を通常から押した状態に変更する必要があります

ただし、RadioButtonをカスタマイズして、グループで使用するのが最善の方法です。その例を見てきました。 申し訳ありませんが、そのリンクを覚えていませんでした。

しかし、それを避けたいのなら。これをselector.xmlに追加する必要があります

一度完了。あなたのコードにたどり着き、これを追加してください

public void onClick ( View v ) {
    myImageButton.setSelected ( true ) ;
 }

結果が表示されます。ただし、最近押されたボタンの状態を管理する必要があります。あなたが設定できるように

  myOLDImageButton.setSelected ( false ) ;

すべてのボタン参照を配列に配置することをお勧めします。


0

あなたがやろうとしているのは、imagebuttonリストというよりもセグメント化されたボタンです。

ここhttp://blog.bookworm.at/2010/10/segmented-controls-in-android.htmlは、その方法の例です。RadioButtonには必要なチェック状態があるため、基本的な考え方はImageButtonではなくRadioButtonをカスタマイズすることです。


いいえ..それが彼が望んでいたことだとは思いません。セグメント化されたコントロールは、まったく異なるUI要素です。彼は状態を変える1つのボタンが欲しいです。
ヘンリーチウ2012

0

試しましたCompoundButtonか?CompoundButtonには、ニーズに完全に一致するチェック可能なプロパティがあります。ImageButtonsをこれらに置き換えます。

  <CompoundButton android:id="@+id/buttonhome"
                  android:layout_width="80dp"
                  android:layout_height="36dp"
                  android:background="@drawable/homeselector"/>

セレクターxmlを次のように変更します。変更が必要な場合がありますが、必ずのstate_checked代わりに使用してくださいstate_pressed

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_checked="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

ではCompoundButton.OnCheckedChangeListener、あなたは確認する必要がありますし、あなたの条件に基づいて、他のチェックを外します。

 mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

   public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // Uncheck others. 
        }
   }
});

同様に、OnCheckedChangeListener各ボタンにaを設定します。これにより、チェックされているときに他のボタンのチェックが外されます。お役に立てれば。


抽象クラスであるため、XMLでCompoundButtonを直接使用することはできません。
Dan Hulme 2015年

0

@ingsaurabhの答えは、onClickを使用している場合でも使用する方法です。ただし、onTouchイベントを使用している場合は、を使用してさまざまな背景を選択できます(@ingsaurabhの例と同じです)view.setPressed()

詳細については、以下を参照してください。Androidの[長押し]ボタンは、onTouchListenerを使用して状態を変更する必要があります(カスタムXMLセレクター)


0

res / drawableでセレクターファイルを作成できます

例:res / drawable / selector_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/btn_enabled" />
</selector>

レイアウトアクティビティ、フラグメントなど

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_bg_rectangle_black"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.