Java / Android:泛型方法 - 将相同的功能应用于不同的对象

时间:2014-04-18 15:02:59

标签: java android generics

我正在尝试在我的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。

3 个答案:

答案 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类中存在setBackgroundViewGroup方法。您可以强制执行任何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换成ViewGroupView(尽管这可能过于模糊,但仍然存在),或类似的东西。

检查通用代码中的对象类型并不是非常通用,但是对于您尝试支持的对象使用正确的超类(这样的超类包含您希望在对象上调用的方法)是更好的方法