Làm thế nào để đặt hình nền nút hình ảnh cho các trạng thái khác nhau?


80

Tôi muốn nút hình ảnh có hai trạng thái i) bình thường ii) chạm (hoặc nhấp).

Tôi đã đặt hình ảnh bình thường trong nền nút hình ảnh và tôi đang cố gắng thay đổi hình ảnh (được nhấn) từ phương pháp onclick , nhưng nó không thay đổi.

Tôi muốn rằng nếu tôi nhấn nút hình ảnh thì hình ảnh sẽ thay đổi từ bình thường sang nhấn cho đến khi tôi nhấn nút khác nhưng nó không xảy ra .

Bất cứ ai có thể gợi ý cho tôi cách tôi có thể làm điều này với bộ chọn hoặc tại thời điểm chạy không?

Đây là mã imagebuttonpanel của tôi.

<?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>

và bộ chọn xml của tôi là

<?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> 

Và tôi cũng đã cố gắng thay đổi tài nguyên hình ảnh trên sự kiện ontouch và onclick, nhưng không giúp được gì.


Tôi nghĩ bạn đang tìm kiếm một cái gì đó như thế này . Tôi đã hỏi một câu hỏi tương tự trước đây.
Federico klez Culloca,

Câu trả lời:


224

Tạo tệp xml trong tệp có thể vẽ của bạn như sau:

<?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>

Và đặt hình ảnh phù hợp và sau đó đặt xml này làm nền của bạn imageButton.


11
Chính xác. này sẽ được gọi là Selector XMLs
Aman Alam

4
@Hitendra: Tôi đoán op đã biết điều này. câu hỏi có thể được hiểu là tại sao bộ chọn không được gọi.
Samuel

State_enabled có cần thiết không?
Dr.jacky

4
Điều này hoạt động bình thường Button, nhưng không ImageButton. Ngoài ra, điều này sẽ làm việc cho ImageButton'sandroid:src thuộc tính, nhưng không phải android:background. Và sự khác biệt giữa bộ chọn của bạn và bộ chọn của OP (ngoại trừ tên định dạng và các tệp có thể vẽ) là gì? Tui bỏ lỡ điều gì vậy ?
Alexander Malakhov

@AlexanderMalakhov Đối với tôi, nó hoạt động rất tốt cho ImageButton và android: background.
Trilarion

15

Thử đi

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

có ai có ý tưởng mà tôi có thể làm được không
Hitendra

9

mhh. Tôi có một giải pháp khác đã giúp tôi, vì tôi chỉ có hai người khác nhau:

  • hoặc mục không được nhấp
  • hoặc nó được nhấp và vì vậy nó sẽ được đánh dấu

Trong .xml của tôi, tôi xác định ImageButton như thế này:

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

Tệp bộ chọn tương ứng trông giống như sau:

<?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>

Và trong onCreate của tôi, tôi gọi:

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

làm xong. hi vọng điêu nay co ich. tôi đã mất một thời gian để tìm ra.


8

Xin chào, hãy thử mã sau nó sẽ hữu ích cho bạn,

((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
trên thực tế, điều này cũng không thực sự hiệu quả, nếu action_up xảy ra trên một chế độ xem khác. hãy thử sử dụng event.getAction () == MotionEvent.ACTION_CANCEL thay vì ACTION_UP.
chug2k

3

Tôi nghĩ rằng vấn đề của bạn không phải là tập tin bộ chọn.

bạn phải thêm

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

vào các nút hình ảnh của bạn.

theo mặc định, onClick được xử lý ở cấp listitem (cha). và imageButtons không nhận được onClick.

khi bạn thêm thuộc tính trên, nút hình ảnh sẽ nhận sự kiện và bộ chọn sẽ được sử dụng.

chọn ĐĂNG này giải thích tương tự cho hộp kiểm.


1

nếu bạn muốn nhấn nút hình ảnh thì hình ảnh sẽ được thay đổi từ bình thường sang nhấn

Nhưng theo tôi, cách tốt nhất là tùy chỉnh RadioButton và sử dụng chúng trong một nhóm. Tôi đã thấy một ví dụ về điều đó. Xin lỗi tôi không nhớ liên kết đó.

nhưng nếu bạn muốn tránh điều đó. Bạn cần thêm cái này vào selector.xml của mình

Sau khi hoàn thành. Chỉ cần có mã của bạn và thêm cái này

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

Bạn sẽ thấy kết quả. Nhưng bạn phải xác định các trạng thái mà nút đã được nhấn gần đây. Vì vậy, bạn có thể thiết lập

  myOLDImageButton.setSelected ( false ) ;

Tôi khuyên bạn nên đặt tất cả tham chiếu nút trong một mảng.


0

những gì bạn đang cố gắng làm là một nút phân đoạn hơn là một danh sách nút hình ảnh.

đây http://blog.bookworm.at/2010/10/segmented-controls-in-android.html là một ví dụ về cách làm như vậy. Ý tưởng cơ bản là tùy chỉnh RadioButton thay vì ImageButton, vì RadioButton sẽ có trạng thái được kiểm tra mà bạn cần


không .. Tôi không nghĩ đó là điều anh ấy muốn. kiểm soát phân đoạn là phần tử giao diện người dùng hoàn toàn khác. anh ta muốn 1 nút thay đổi trạng thái.
Henley Chiu

0

Bạn đã thử CompoundButtonchưa? CompoundButton có thuộc tính có thể kiểm tra chính xác phù hợp với nhu cầu của bạn. Thay thế ImageButtons bằng những.

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

Thay đổi bộ chọn xml thành sau. Có thể cần một số sửa đổi nhưng hãy chắc chắn sử dụng state_checkedthay thế 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> 

Trong CompoundButton.OnCheckedChangeListenerbạn cần phải chọn và bỏ chọn khác dựa trên điều kiện của bạn.

 mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

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

Tương tự, đặt a OnCheckedChangeListenercho mỗi nút, nút này sẽ bỏ chọn các nút khác khi nó được chọn. Hi vọng điêu nay co ich.


Bạn không thể sử dụng CompoundButton trực tiếp trong XML vì nó là một lớp trừu tượng.
Dan Hulme


0

bạn có thể tạo tệp bộ chọn trong res / drawable

ví dụ: 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>

và trong hoạt động bố cục, phân đoạn hoặc v.v.

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_bg_rectangle_black"/>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.