我正在尝试在我的Android项目中制作一些辅助方法 - 用大纲设置背景的方法。我想方法接受不同类型的对象(最小的是不同的布局)并在它们上调用setBackground()。我的代码:
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
private static <I> void setBackgroundOutlined(Context context,
I item,
String backgroundColor,
String outlineColor, int outlineThickness,
Boolean setStatesPressed) {
GradientDrawable shapeDrawable = new GradientDrawable();
shapeDrawable.setStroke(CF.floatToPixels(context, outlineThickness),
Color.parseColor(outlineColor));
shapeDrawable.setColor(Color.parseColor(backgroundColor));
StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed,
android.R.attr.state_enabled},
context.getResources().getDrawable(R.drawable.textview_pressed_color));
states.addState(StateSet.WILD_CARD, shapeDrawable);
if (item instanceof RelativeLayoutWithContextMenuInfo) {
RelativeLayoutWithContextMenuInfo item2= (RelativeLayoutWithContextMenuInfo)item;
if (android.os.Build.VERSION.SDK_INT < 16) {
item2.setBackgroundDrawable(states);
} else {
item2.setBackground(states);
}
} else if (item instanceof LinearLayout) {
LinearLayout item2= (LinearLayout)item;
if (android.os.Build.VERSION.SDK_INT < 16) {
item2.setBackgroundDrawable(states);
} else {
item2.setBackground(states);
}
}
}
我真的不喜欢在condiditons中重复代码。有什么建议让它更清楚吗?谢谢,J。
答案 0 :(得分:2)
除了 jacobhyphenated 回答:
您不需要通用方法,因为您只需要传递ViewGroup
类型的参数或其子类:
private static void setBackgroundOutlined(Context context,
/* you can pass any layout as item -> */ ViewGroup item,
String backgroundColor,
String outlineColor,
int outlineThickness,
Boolean setStatesPressed) {
// apply you logic on a item based on OS runtime API
}
答案 1 :(得分:1)
setBackgroundDrawable
类中存在setBackground
和ViewGroup
方法。您可以强制执行任何item
必须或扩展ViewGroup
通用。
private static <I extends ViewGroup> void setBackgroundOutlined(Context context,
I item,
String backgroundColor,
String outlineColor, int outlineThickness,
Boolean setStatesPressed) {
....
if (android.os.Build.VERSION.SDK_INT < 16) {
item.setBackgroundDrawable(states);
} else {
item.setBackground(states);
}
}
但这只有在你总是使用ViewGroup
父类时才有效。
答案 2 :(得分:1)
我不会像现在这样通用它,因为你仍然试图做一些非常具体的事情。
您最好将I
换成ViewGroup
或View
(尽管这可能过于模糊,但仍然存在),或类似的东西。
检查通用代码中的对象类型并不是非常通用,但是对于您尝试支持的对象使用正确的超类(这样的超类包含您希望在对象上调用的方法)是更好的方法