2011-01-28 88 views
18

Trong ứng dụng tôi đang thực hiện, tôi muốn có nút chuyển đổi nhiều trạng thái (trong trường hợp của tôi, ba), thay vì hai nút mà ToggleButton cung cấp. Tôi đã cố gắng để bắt đầu của riêng tôi mà mở rộng Button, theo các nguồn CompoundButton, nhưng khá trung thực đọc qua nguồn của nó có một chút áp đảo.Nút Chuyển đổi Đa trạng thái

Có cách nào để thực hiện nút chuyển đổi ba trạng thái bằng cách sử dụng chỉ một bộ chọn xml hoặc một cái gì đó hoặc có lẽ một phương pháp khác mà tôi chưa từng nghĩ đến? Tôi khá mất mát làm thế nào để làm điều này.

Trả lời

10

Bạn chắc chắn có thể xác định bộ chọn để sử dụng làm nền có ba mục nhập. Câu hỏi đặt ra là thuộc tính nút nào bạn có thể sử dụng cho bộ chọn. Bạn có thể có hai thuộc tính boolean, nói A và B, và xác định bộ chọn theo A, B và mặc định. (A & & B sẽ thỏa mãn A, vì vậy chúng càng có thể được coi là A,! A & & B, và! & &! B.) Bạn có thể quá tải các thuộc tính hiện tại (được chọn, tập trung, vv) hoặc, thanh lịch hơn, xác định các thuộc tính tùy chỉnh của riêng bạn bằng cách sử dụng công thức được mô tả in this thread.

+0

Nhìn vào chuỗi bạn đã liên kết: Tôi hiểu bước 1, nhưng 2 tôi có một số câu hỏi. Khi tạo chế độ xem mới, liệu bạn có nên mở rộng Chế độ xem, Nút hoặc thứ gì khác không? Và có những phương pháp khác tôi nên được quá tải bên cạnh các nhà thầu và onCreateDrawableState()? Lời xin lỗi của tôi nếu đây là cơ bản, đây là ứng dụng thực sự đầu tiên của tôi. – Melde

+0

Nevermind, làm cho nó hoạt động! Cảm ơn bạn đã đẩy đúng hướng, tôi đánh giá cao nó. – Melde

+0

@moonfire là mã độc quyền của bạn? Tôi đang cố gắng tạo ra một nút chuyển đổi trạng thái ba quá, và muốn xem một số giải pháp khác để quấn đầu của tôi xung quanh làm thế nào để làm điều đó. – JohnMetta

18

tôi thực hiện một nút chuyển đổi đa quốc gia, mã nguồn là here

Đây là cách nó trông:

enter image description here

Và nó khá dễ dàng để sử dụng nó:

<org.honorato.multistatetogglebutton.MultiStateToggleButton 
    android:id="@+id/mstb_multi_id" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip" 
    mstb:values="@array/planets_array" /> 

Trong hoạt động của bạn:

MultiStateToggleButton button2 = (MultiStateToggleButton) this.findViewById(R.id.mstb_multi_id); 
button2.setOnValueChangedListener(new ToggleButton.OnValueChangedListener() { 
    @Override 
    public void onValueChanged(int value) { 
     Log.d(TAG, "Value: " + value); 
    } 
}); 
+0

Cảm ơn, tôi đã thử nghiệm và hoạt động tốt;) –

+0

bạn đã tùy chỉnh nó như thế nào trong hình? Trong tài liệu của bạn, bạn đã không đề cập đến bất kỳ custimizations. – Choletski

+0

Đó là phiên bản cũ, hãy thử tìm kiếm các cam kết cũ hơn. Nhưng về cơ bản bạn sẽ phải sửa đổi các bản vẽ nền. – jlhonora

10

Bạn có thể tạo một ImageButton tùy chỉnh để đạt được điều này, bạn cần 3 hình ảnh khác nhau trong trường hợp này. Bạn cũng có thể thêm nhiều tiểu bang nếu muốn.

public class FlashButton extends ImageButton { 

    public enum FlashEnum { 
     AUTOMATIC, ON, OFF 
    } 

    public interface FlashListener { 
     void onAutomatic(); 
     void onOn(); 
     void onOff(); 
    } 

    private FlashEnum mState; 
    private FlashListener mFlashListener; 

    public FlashButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     //Sets initial state 
     setState(FlashEnum.AUTOMATIC); 
    } 


    @Override 
    public boolean performClick() { 
     super.performClick(); 
     int next = ((mState.ordinal() + 1) % FlashEnum.values().length); 
     setState(FlashEnum.values()[next]); 
     performFlashClick(); 
     return true; 
    } 


    private void performFlashClick() { 
     if(mFlashListener == null)return; 
     switch (mState) { 
      case AUTOMATIC: 
       mFlashListener.onAutomatic(); 
       break; 
      case ON: 
       mFlashListener.onOn(); 
       break; 
      case OFF: 
       mFlashListener.onOff(); 
       break; 
     } 
    } 

    private void createDrawableState() { 
     switch (mState) { 
      case AUTOMATIC: 
       setImageResource(R.drawable.ic_flash_auto); 
       break; 
      case ON: 
       setImageResource(R.drawable.ic_flash_on); 
       break; 
      case OFF: 
       setImageResource(R.drawable.ic_flash_off); 
       break; 
     } 
    } 


    public FlashEnum getState() { 
     return mState; 
    } 

    public void setState(FlashEnum state) { 
     if(state == null)return; 
     this.mState = state; 
     createDrawableState(); 

    } 

    public FlashListener getFlashListener() { 
     return mFlashListener; 
    } 

    public void setFlashListener(FlashListener flashListener) { 
     this.mFlashListener = flashListener; 
    } 

} 
+0

Bạn đang khiến mọi người lười biếng;) – yajnesh

2

Tại sao không sử dụng RadioGroup và radio kiểu bên trong?

<RadioGroup 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <RadioButton 
     android:layout_width="match_parent" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:background="@drawable/your_drawable_selector" 
     android:button="@android:color/transparent" 
     android:gravity="center_horizontal" //center text 
     android:text="text" 
     /> 
... 
Các vấn đề liên quan