You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在通用类中实现三个Fragment的Toolbar圆角逻辑复用

解决DataBinding下Toolbar圆角代码复用问题

你的核心问题是泛型T没有约束导致无法访问binding.toolbar,同时工具类缺少Context来获取资源。下面是几种可行的解决方案,按推荐优先级排序:

方案1:直接传递Toolbar控件(最简洁)

不用纠结Binding的传递,直接把需要操作的Toolbar对象传给工具方法,代码最直观:

public class ToolbarUtils {
    // 静态工具方法,无需实例化类
    public static void applyRoundedCorners(Toolbar toolbar, Context context) {
        float radius = context.getResources().getDimension(R.dimen.default_corner_radius);
        MaterialShapeDrawable shapeDrawable = (MaterialShapeDrawable) toolbar.getBackground();
        shapeDrawable.setShapeAppearanceModel(
                shapeDrawable.getShapeAppearanceModel()
                        .toBuilder()
                        .setAllCorners(CornerFamily.ROUNDED, radius)
                        .build()
        );
    }
}

在Fragment中调用:

ToolbarUtils.applyRoundedCorners(binding.toolbar, requireContext());

方案2:用接口约束Binding类(编译时安全)

定义一个接口来统一约束所有包含Toolbar的Binding类,确保编译时就能检查到Toolbar的存在:

// 定义接口,约定所有实现类必须提供Toolbar实例
public interface HasToolbar {
    Toolbar getToolbar();
}

修改工具类,用接口作为泛型约束:

public class ToolbarUtils {
    public static <T extends HasToolbar> void applyRoundedCorners(T binding, Context context) {
        float radius = context.getResources().getDimension(R.dimen.default_corner_radius);
        Toolbar toolbar = binding.getToolbar();
        MaterialShapeDrawable shapeDrawable = (MaterialShapeDrawable) toolbar.getBackground();
        shapeDrawable.setShapeAppearanceModel(
                shapeDrawable.getShapeAppearanceModel()
                        .toBuilder()
                        .setAllCorners(CornerFamily.ROUNDED, radius)
                        .build()
        );
    }
}

在Fragment中调用时,将Binding强转为接口(因为DataBinding自动生成的类会包含getToolbar()方法):

ToolbarUtils.applyRoundedCorners((HasToolbar) binding, requireContext());

方案3:反射获取Toolbar(不推荐)

如果一定要传递Binding对象,可以用反射获取toolbar属性,但这种方式编译时无检查,运行时可能出错,性能也较差:

public class ToolbarUtils {
    public static void applyRoundedCorners(Object binding, Context context) {
        try {
            // 通过反射获取toolbar字段
            Field toolbarField = binding.getClass().getField("toolbar");
            Toolbar toolbar = (Toolbar) toolbarField.get(binding);
            
            float radius = context.getResources().getDimension(R.dimen.default_corner_radius);
            MaterialShapeDrawable shapeDrawable = (MaterialShapeDrawable) toolbar.getBackground();
            shapeDrawable.setShapeAppearanceModel(
                    shapeDrawable.getShapeAppearanceModel()
                            .toBuilder()
                            .setAllCorners(CornerFamily.ROUNDED, radius)
                            .build()
            );
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

调用方式:

ToolbarUtils.applyRoundedCorners(binding, requireContext());

内容的提问来源于stack exchange,提问作者Bukrek35TR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:42:49