我所做的是:
聲明按鈕,在它的初始狀態:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/StateA"/>
</selector>
然後我管理從代碼controling按鈕的實際狀態與標籤的事件:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.drawables_buttons); //This is the layout where it's the button
threeStateButton = (Button)findViewById(R.id.three_States_Button); //This is the button
threeStateButton.setOnTouchListener(new CustomTouchListener());
threeStateButton.setTag("StateA"); //Set the control tag
}
private class CustomTouchListener implements View.OnTouchListener
{
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
{
switch (motionEvent.getAction())
{
case MotionEvent.ACTION_UP: //When you lift your finger
if (threeStateButton.getTag().equals("StateA"))
{
threeStateButton.setBackgroundResource(R.drawable.StateB);
Toast.makeText(view.getContext(), "This gonna change my state from StateA to StateB",Toast.LENGTH_SHORT).show();
threeStateButton.setTag("StateB");
}
else //If when you lift your finger it was already on stateB
{
threeStateButton.setBackgroundResource(R.drawable.red_button);
Toast.makeText(view.getContext(), "This gonna change my state from StateB to StateA",Toast.LENGTH_SHORT).show();
threeStateButton.setTag("StateA");
}
break;
//In case you want that you button shows a different state when your finger is pressing it.
case MotionEvent.ACTION_DOWN:
threeStateButton.setBackgroundResource(R.drawable.StateButtonPressed);
break;
}
return false;
}
}
我不知道這是否是最好的辦法,但它的工作原理,是的,我想知道這是最佳的方式。
感謝Pedro,是我在創建項目時聲明的「包」包?這是它在你發佈的鏈接中說的... 在XML中:@ [package:] drawable/filename – billy 2011-03-16 21:49:26
這是我自己的簡單選擇器:<?xml version =「1.0」encoding =「utf-8」?> <選擇器xmlns:android =「http://schemas.android.com/apk/res/android」> <! - pressed - > \t \t \t \t <! - default - > –
pedr0
2011-03-17 10:17:46