Android 自定义图像按钮:使用自定义选择器属性更改图像
我想根据事实更改imagebuttons的图像,如果数据库中有东西或没有。我决定通过一个带有属性的自定义选择器来实现这一点:empty、full、warning和alltake 现在,当我启动MainActivity时,我设置了一个对db的调用,并询问它是否为空。如果不是,属性应该从空:true、full:false、warning:false和alltake:false更改为空:false、full:true、warning:false和alltake:false 我的CustomImageButton类如下所示:Android 自定义图像按钮:使用自定义选择器属性更改图像,android,resources,customization,selector,imagebutton,Android,Resources,Customization,Selector,Imagebutton,我想根据事实更改imagebuttons的图像,如果数据库中有东西或没有。我决定通过一个带有属性的自定义选择器来实现这一点:empty、full、warning和alltake 现在,当我启动MainActivity时,我设置了一个对db的调用,并询问它是否为空。如果不是,属性应该从空:true、full:false、warning:false和alltake:false更改为空:false、full:true、warning:false和alltake:false 我的CustomImageB
public CustomImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
private static final int[] STATE_EMPTY = {R.attr.state_empty};
private static final int[] STATE_FULL = {R.attr.state_full};
private static final int[] STATE_WARNING = {R.attr.state_warning};
private static final int[] STATE_ALLTAKEN = {R.attr.state_alltaken};
private boolean mIsEmpty = false;
private boolean mIsFull = false;
private boolean mIsWarning = false;
private boolean mIsAlltaken = false;
public void setEmpty(boolean isEmpty) {mIsEmpty = isEmpty;}
public void setFull(boolean isFull) {mIsFull = isFull;}
public void setWarning(boolean isWarning) {mIsWarning = isWarning;}
public void setAlltaken(boolean isAlltaken) {mIsAlltaken = isAlltaken;}
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
if (mIsEmpty) {
mergeDrawableStates(drawableState, STATE_EMPTY);
}
if (mIsFull) {
mergeDrawableStates(drawableState, STATE_FULL);
}
if (mIsWarning) {
mergeDrawableStates(drawableState, STATE_WARNING);
}
if (mIsAlltaken) {
mergeDrawableStates(drawableState, STATE_ALLTAKEN);
}
return drawableState;
}
在我的主要活动中,我称这些函数为:
CustomImageButton mondaybtn, tuesdaybtn, wednesdaybtn, thursdaybtn, fridaybtn, saturdaybtn, sundaybtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mondaybtn = (CustomImageButton) findViewById(R.id.iBtnMonday);
tuesdaybtn = (CustomImageButton) findViewById(R.id.iBtnTuesday);
wednesdaybtn = (CustomImageButton) findViewById(R.id.iBtnWednesday);
thursdaybtn = (CustomImageButton) findViewById(R.id.iBtnThursday);
fridaybtn = (CustomImageButton) findViewById(R.id.iBtnFriday);
saturdaybtn = (CustomImageButton) findViewById(R.id.iBtnSaturday);
sundaybtn = (CustomImageButton) findViewById(R.id.iBtnSunday);
getDBInfo();
}
private void getDBInfo(){
sqlcon = new SQLController(this);
sqlcon.open();
Cursor c = sqlcon.readEntry();
int rows = c.getCount();
Toast.makeText(MainActivity.this, "Rows in DB:" + String.valueOf(rows), Toast.LENGTH_LONG).show();
if(rows >= 1){
//ToDo all pictures full
setCustomButtonImage(mondaybtn, false, true, false, false);
setCustomButtonImage(tuesdaybtn, false, true, false, false);
setCustomButtonImage(wednesdaybtn, false, true, false, false);
setCustomButtonImage(thursdaybtn, false, true, false, false);
setCustomButtonImage(fridaybtn, false, true, false, false);
setCustomButtonImage(saturdaybtn, false, true, false, false);
setCustomButtonImage(sundaybtn, false, true, false, false);
setDisplayViewButtonClickListener(R.id.iBtnMonday, MedListActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnTuesday, MedListActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnWednesday, MedListActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnThursday, MedListActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnFriday, MedListActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnSaturday, MedListActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnSunday, MedListActivity.class);
}
else{
setCustomButtonImage(mondaybtn, true, false, false, false);
setCustomButtonImage(tuesdaybtn, true, false, false, false);
setCustomButtonImage(wednesdaybtn, true, false, false, false);
setCustomButtonImage(thursdaybtn, true, false, false, false);
setCustomButtonImage(fridaybtn, true, false, false, false);
setCustomButtonImage(saturdaybtn, true, false, false, false);
setCustomButtonImage(sundaybtn, true, false, false, false);
//ToDo all pictures empty
setDisplayViewButtonClickListener(R.id.iBtnMonday, EnterMedActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnTuesday, EnterMedActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnWednesday, EnterMedActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnThursday, EnterMedActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnFriday, EnterMedActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnSaturday, EnterMedActivity.class);
setDisplayViewButtonClickListener(R.id.iBtnSunday, EnterMedActivity.class);
}
}
private void setCustomButtonImage(CustomImageButton btn,Boolean empty, Boolean full, Boolean warning,Boolean alltaken){
btn.setEmpty(empty);
btn.setFull(full);
btn.setWarning(warning);
btn.setAlltaken(alltaken);
}
在drawables中,我为选择器提供了如下文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dailymeds="http://schemas.android.com/tools">
<item
dailymeds:state_empty="true"
dailymeds:state_full="false"
dailymeds:state_warning="false"
dailymeds:state_alltaken="false"
android:state_pressed="false"
android:drawable="@drawable/emptyshapefriday" />
<item
dailymeds:state_empty="true"
dailymeds:state_full="false"
dailymeds:state_warning="false"
dailymeds:state_alltaken="false"
android:state_pressed="true"
android:drawable="@drawable/demptyshapefriday" />
<item
dailymeds:state_full="true"
dailymeds:state_empty="false"
dailymeds:state_warning="false"
dailymeds:state_alltaken="false"
android:state_pressed="false"
android:drawable="@drawable/fullshapefriday" />
<item
dailymeds:state_full="true"
dailymeds:state_empty="false"
dailymeds:state_warning="false"
dailymeds:state_alltaken="false"
android:state_pressed="true"
android:drawable="@drawable/dfullshapefriday" /> ....
....
我还有res/values中所需的资源文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="dailymeds">
<attr name="state_empty" format="boolean" />
<attr name="state_full" format="boolean" />
<attr name="state_warning" format="boolean" />
<attr name="state_alltaken" format="boolean" />
</declare-styleable>
</resources>
为什么即使我更改了空、满、警告和全拍属性,图像也没有更改