LinearLayout layout = (LinearLayout) v.findViewById(....); // ........ // A bunch of code using `layout` many times
解决方法
您正在寻找的功能是类型迁移!
可以通过右键单击变量或字段的类型来执行类型迁移,然后选择Refactor – >键入迁移或者,您可以使用这些键盘快捷键:
>在Mac上:Shift⌘F6
在Windows上:Shift Ctrl F6
只需选择要迁移的类型,点击重构,Android Studio即可开始工作!
长而更详细的答案
你似乎误会了Rename实际做的事情.
重命名可用于字面重命名元素.所以你可以用变量,参数,方法或类来改变它的名字.例如,如果您有一个名为Foo的类,并且您想要将其名称更改为“Bar”,则可以使用“重命名”轻松地执行此操作.
但是您不能重命名LinearLayout,因为它是框架类,当然不能修改.这根本不应该是一个问题,因为你实际上并不想重命名LinearLayout,是吗?您实际想要做的是将类型从LinearLayout更改为RelativeLayout.另外还有一个非常有用的重构功能可以做到这一点,称为类型迁移.
您可以通过右键单击要与其他类型交换的类型的任何变量,然后选择Refactor – >执行类型迁移.键入迁移之后,弹出对话框,您可以输入要迁移的类型,在您的情况下为RelativeLayout.然后只需点击Refactor,Android Studio即可开始工作.可能有一个额外的弹出窗口,通知您代码中的所有无法自动迁移的内容.只需扫描冲突列表,完成操作即可手动忽略并修复这些冲突.
以下是工作中类型迁移的示例.我开始用这段代码:
private LinearLayout mLayout; private void doStuff(ViewGroup container) { LinearLayout layout = (LinearLayout) container.findViewById(0); layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ... } }); mLayout = layout; fooTheBar(layout); } private void fooTheBar(LinearLayout layout) { ... }
现在我在doStuff()中的局部变量布局上执行了类型迁移到RelativeLayout.结果如下:
private RelativeLayout mLayout; private void doStuff(ViewGroup container) { // Here is the only conflict which could not be refactored automatically. // I had to change the cast to RelativeLayout manually. RelativeLayout layout = (LinearLayout) container.findViewById(R.id.linearLayout); layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ... } }); mLayout = layout; fooTheBar(layout); } private void fooTheBar(RelativeLayout layout) { ... }
您可以看到类型迁移做得很好. fooTheBar()的字段类型甚至参数的类型被更改为RelativeLayout.只有一个冲突. Android Studio无法自动更改doStuff()顶部的投射类型.我必须手动修复.正如我前面提到的,我在执行重构时被警告这个冲突.
你当然可以问自己,为什么它可以自动改变字段和参数的类型,但不能改变一个转换的类型,但是如果你考虑一下实际上有很大的意义:
自动迁移的部分代码是(LinearLayout)container.findViewById(R.id.linearLayout).当然,这种方法可以使用id为R.id.linearLayout查找一个视图.此视图可能在布局xml中定义,或者可能会在运行时动态添加到容器中,但无论如何,它不是可以自动重构的,而不会中断功能的风险.只有开发人员才能决定如何处理,这就是为什么你被警告.