다른 상태에 대한 이미지 버튼 배경 이미지를 설정하는 방법은 무엇입니까?


81

두 가지 상태 i) 일반 ii) 터치 (또는 클릭) 이미지 버튼을 원합니다.

imagebutton 배경 에 일반 이미지를 설정 했고 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

답변:


225

다음과 같이 드로어 블에 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
옳은. 이 선택기 XMLS를 호출합니다
아만 알람

4
@Hitendra : 나는 작전이 이미 이것을 알고 있다고 생각한다. 질문은 선택기가 호출되지 않는 이유로 해석 될 수 있습니다.
Samuel

state_enabled가 필요합니까?
Dr. jacky 2014-06-30

4
이것은 평상시 Button에는 작동 하지만 그렇지 않습니다 ImageButton. 또한 이것은 ImageButtonandroid:src속성에 대해 작동 하지만 android:background. 그리고 당신과 OP의 선택기 (포맷 및 드로어 블 이름 제외)의 차이점은 무엇입니까? 내가 뭔가를 놓치고 있습니까?
Alexander Malakhov

@AlexanderMalakhov 저에게는 ImageButton 및 android : background에서 매우 잘 작동합니다.
Trilarion

15

이 시도

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

내가 할 수있는 아이디어 하나가
Hitendra

9

mhh. 도움이 된 또 다른 솔루션이 있습니다.

  • 항목을 클릭하지 않았거나
  • 또는 클릭하면 강조 표시됩니다.

내 .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

3

문제는 선택기 파일이 아니라고 생각합니다.

당신은 추가해야

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

이미지 버튼에.

기본적으로 onClick은 목록 항목 수준에서 처리됩니다. (상위) . 그리고 imageButtons는 onClick을받지 않습니다.

위의 속성을 추가하면 이미지 버튼이 이벤트를 수신하고 선택기가 사용됩니다.

확인란에 대해 동일하게 설명하는 이 POST 를 확인하십시오 .


1

눌린 이미지 버튼을 원하면 이미지가 정상에서 눌려 짐으로 변경되어야합니다.

그러나 가장 좋은 방법은 RadioButton을 사용자 정의하고 그룹에서 사용하는 것입니다. 나는 그 예를 보았다. 그 링크를 기억하지 못해서 죄송합니다.

하지만 그것을 피하고 싶다면. 이것을 selector.xml에 추가해야합니다.

일단 완료. 코드를 확인하고 이것을 추가하십시오.

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

결과를 볼 수 있습니다. 하지만 최근에 어떤 버튼을 눌렀는지 상태를 관리해야합니다. 설정할 수 있도록

  myOLDImageButton.setSelected ( false ) ;

모든 버튼 참조를 배열에 넣는 것이 좋습니다.


0

당신이하려는 것은 이미지 버튼 목록보다 더 세분화 된 버튼입니다.

여기 http://blog.bookworm.at/2010/10/segmented-controls-in-android.html 은 그렇게하는 방법에 대한 예입니다. 기본 아이디어는 RadioButton이 필요한 확인 상태를 가질 것이기 때문에 ImageButton 대신 RadioButton을 사용자 정의하는 것입니다.


아뇨 .. 그게 그가 원했던 것 같아요. 분할 된 컨트롤은 완전히 다른 UI 요소입니다. 그는 상태를 변경하는 1 개의 버튼을 원합니다.
Henley Chiu

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

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.