我如何在 Build-Tools 3.6.0 中使用 "R.id object = new R.id();"?

How can I use "R.id object = new R.id();" with Build-Tools 3.6.0?

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

之前我只是设置元素 invisible/gone 但现在我有一个 NestedScrollView,其中包含一个包含 RecyclerView 的 child 片段。 child 需要一种风格的按钮,而另一种风格不得有。 如果我只是将它设置为不可见或消失,布局将无法正常工作(不滚动且高度太低)。

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

    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();
        }
    }

将 build 工具从 3.5.3 更新到 3.6.0 后,我得到

error: id() has private access in id R.id object = new R.id();

换行

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

在尝试 uild 时。 目前我只是保留 uinge 旧的 build 工具,但我认为这不是永久的解决方案。

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

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