首页 > 解决方案 > 如何使用“R.id object = new R.id();” 使用构建工具 3.6.0?

问题描述

我必须为不同的构建风格使用不同的布局,其中一种风格中存在另一种风格中不存在的 ui 元素。

之前我只是将元素设置为不可见/消失,但现在我有一个 NestedScrollView,其中包含一个包含 RecyclerView 的子片段。孩子需要一种口味的纽扣,而另一种口味则不能。如果我只是将其设置为不可见或消失,则布局无法正常工作(不滚动且高度太低)。

我将布局 xml 复制到风味的路径并删除了按钮并在片段代码中使用反射来了解按钮是否存在并实现它的代码。

    Class<R.id> c = R.id.class;
    R.id object = new R.id();
    Field[] fields = c.getDeclaredFields();

    for (Field field : fields)
    {
        field.setAccessible(true);
        try
        {
            if (field.getName().equals("TheButton"))
            {
                Button tBtn = tView.findViewById((Integer) field.get(object));
                if (tBtn != null)
                    tBtn.setOnClickListener(...);
            }
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }

从 3.5.3 更新到 Gradle 构建工具到 3.6.0 后,我得到

错误:id() 在 id R.id object = new R.id() 中具有私有访问权限;

为线

R.id object = new R.id();

尝试构建时。目前我只是继续使用旧的构建工具,但这不是永久的解决方案,我认为。

我可以做点别的吗?我想摆脱反射,但如果它真的是唯一的方法,它应该使用最新的构建工具......

标签: androidandroid-studiogradlereflectionandroid-build-flavors

解决方案


似乎构建口味不值得努力。他们创造的问题多于解决的问题。使用它们不是我的主意,我也不会自愿再次使用它们。即使在不同项目之间复制和粘贴也能减少麻烦......我将删除反射,并在未来的 Android 开发中不惜一切代价避免它。


推荐阅读