2015-04-20 21 views
6

Về cơ bản, tôi đang cố gắng tạo nút khi được nhấp (lưu ý: NOT được nhấn) sẽ thay đổi màu từ color1 thành color2. Khi được nhấp một lần nữa, nó sẽ thay đổi trở lại từ color2 thành color1.Android: Thay đổi màu nút khi nhấp vào

Tôi đã tìm kiếm như điên và thông tin duy nhất tôi quản lý để trích xuất là cách thay đổi màu khi nhấn nút, tức là khi người dùng nhấn nút (mã này sẽ được viết bên dưới). Tuy nhiên, tôi muốn màu sắc thay đổi khi người dùng nhấp (nhấn và nhả) nút rồi thay đổi lại sau khi người dùng nhấp một lần nữa.

Tệp này ở res/drawable

<!-- Changes color when user hols down button --> 
<?xml version="1.0" encoding="utf-8"?> 
<selector 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:state_pressed="true"> 
    <shape> 
     <!-- change to color2 --> 
    </shape> 
</item> 

<item> 
    <shape> 
     <!-- change to color1 --> 
    </shape> 
</item> 
</selector> 

Trả lời

8
boolean tmp = false; 
button.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     tmp = !tmp; 
     v.setBackgroundColor(tmp ? Color.RED : Color.BLUE); 
    } 
}); 

EDIT: rõ ràng là bạn muốn có một ví dụ phức tạp hơn

Đầu tiên tạo một XML drawable trong và đặt tên là pink_button. xml và đặt đoạn mã sau bên

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

    <solid android:color="#FF5EF1"/> 
    <corners android:radius="15dp"/> 
    <stroke 
     android:width="1dp" 
     android:color="#303030"/> 

</shape> 

Bây giờ làm cho một blue_button.xml

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

    <solid android:color="#008DFF"/> 
    <corners android:radius="15dp"/> 
    <stroke 
     android:width="1dp" 
     android:color="#303030"/> 

</shape> 

Bây giờ làm cho một số bố trí hoạt động giới thiệu, tôi đã sử dụng button_demo_activity.xml

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

    <Button 
     android:id="@+id/btnDemo" 
     android:layout_width="150dp" 
     android:layout_height="30dp" 
     android:layout_centerInParent="true" 
     android:layout_marginTop="100dp" 
     android:background="@drawable/pink_button" 
     android:gravity="center" 
     android:text="PINK" 
     android:textColor="@android:color/white" 
     android:textSize="15sp"/> 

</RelativeLayout> 

Và cuối cùng hoạt động, đặt tên nó là bất cứ điều gì bạn muốn tôi sử dụng ButtonDemoActivity

public class ButtonDemoActivity extends Activity { 


    private Button btnDemo; 
    private boolean isPink = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.button_demo_activity); 

     btnDemo = (Button) findViewById(R.id.btnDemo); 
     btnDemo.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       isPink = !isPink; 
       int resId = isPink ? R.drawable.pink_button : R.drawable.blue_button; 
       btnDemo.setBackgroundResource(resId); 
       btnDemo.setText(isPink ? "PINK" : "BLUE"); 
      } 
     }); 
    } 
} 

Và đây là giao diện cuối cùng của các nút sẽ ở mỗi trạng thái enter image description here

+0

Vâng, loại này công trình, ngoại trừ những thay đổi nút hoàn toàn khi tôi cố gắng này. Về cơ bản, nó không có góc tròn và vân vân. Nhưng tôi đoán bạn có thể thay đổi điều đó từ bên trong phương thức 'onClick'? – hokosha

+0

Tất nhiên. Thay vì chaning một màu, sử dụng setbackgroundDrawable (R.drawable.something) và bạn có thể có một hình dạng tùy chỉnh drawable như trong câu hỏi của bạn. Câu trả lời của tôi có nghĩa là đơn giản hóa mọi thứ :) –

+0

Trước hết, cảm ơn bạn đã đơn giản hóa, được đánh giá cao! Được rồi, tôi nghĩ rằng tôi hiểu, nhưng vì một lý do nào đó không thể làm cho nó hoạt động được. Bạn có thể bằng cách nào đó cho thấy bạn có nghĩa là gì? – hokosha

0

Bạn đang đi đúng hướng. Thêm quốc gia khác như:

<item android:state_selected="true"> 
    <shape> 
    <!-- change to color2 --> 
    </shape> 
</item> 

sau đó trong phương pháp onClick bạn thêm một số toggling:

v.setSelected(!v.isSelected()); 
+0

Tôi đã cố gắng thêm một tiểu bang nữa nhưng điều đó không giúp được gì. Và ngay bây giờ tôi không có phương thức 'onClick'. Activity.xml của tôi cho nút trông như thế này '(...) android: background =" @ drawable/custom_button "/>' Trong đó 'custom_button' là tệp xml từ bài đăng chính. Vì vậy, bạn có bất cứ đề nghị cho cách tôi nên viết phương pháp 'onClick'?Khác với một dòng bạn đã viết. – hokosha

+0

bạn có thể thử sử dụng 'ToggleButton', Nó không yêu cầu' onClick' và có thể duy trì trạng thái của nó. Mặc dù bạn phải cung cấp các trạng thái trong 'selector' của bạn cho nó – injecteer

Các vấn đề liên quan