我可以使用重构来将变量的类型换成另一个吗?

时间:2015-04-30 13:03:00

标签: java android-studio refactoring

Android Studio提供强大的重构功能,例如重命名。我可以用它来改变变量,字段,参数的名称,但是我似乎找不到重命名类型的方法。例如:

LinearLayout layout = (LinearLayout) v.findViewById(....);
// ........
// A bunch of code using `layout` many times

如何快速将LinearLayout重构为RelativeLayout并将其应用于其余代码?我可以为田地做同样的事情吗?

2 个答案:

答案 0 :(得分:27)

简答

您正在寻找的功能是类型迁移

类型迁移可以通过右键单击变量或字段的类型,然后选择 Refactor - >来执行。 类型迁移。或者,您可以使用这些键盘快捷键:

  • 在Mac上: Shift + + F6
  • 在Windows上: Shift + Ctrl + F6

只需选择要迁移到的类型,点击重构,Android Studio即可开始发挥其魔力!

长而详细的答案

您似乎误解了 Rename 实际上做了什么。

重命名可用于字面重命名元素。因此,您可以使用它更改变量,参数,方法或类的名称。例如,如果您有一个名为Foo的类,并且您想将其名称更改为Bar,则可以使用重命名轻松完成。

但是你不能重命名LinearLayout,因为它是框架类,当然不能修改它们。然而,这根本不应成为问题,因为您实际上并不想重命名LinearLayout,对吗?您实际想要做的是将类型从LinearLayout更改为RelativeLayout。还有另一个非常有用的重构功能,它被称为类型迁移

您可以通过右键单击要为其他类型交换的任何变量,然后选择 Refactor - >来执行类型迁移类型迁移。之后会弹出一个Dialog,您可以输入要迁移到的类型,例如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) {
    ...
}

现在,我在RelativeLayout的本地变量layout上对doStuff()执行了类型迁移。结果如下:

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()顶部的演员类型。我必须手动修复它。正如我之前提到的那样,在执行重构时我被警告了这个冲突。

你当然可以问自己为什么它可以自动改变字段和参数的类型,但不能改变演员的类型,但如果你考虑它实际上有很多意义:< / p>

它无法自动迁移的代码部分是(LinearLayout) container.findViewById(R.id.linearLayout)。这种方法当然会查找标识为View的{​​{1}}。这个R.id.linearLayout可以在布局xml中定义,也可以在运行时动态地添加到View但是在任何情况下都不能自动重构而没有破坏功能的风险。这只是开发人员可以决定如何处理的事情,以及为什么你被警告它。

答案 1 :(得分:0)

对于Kotlin文件中的Type Migration

假设您要在以下功能中将输入参数从String更改为Int

fun getValue(key: String){
}
  1. 将光标置于要更改的类型上(在这种情况下为字符串)

  2. 右键单击> 重构> 更改 签名。或使用以下快捷方式执行此步骤:

    • Mac: + F6
    • Windows: Ctrl + F6 (未测试)
  3. 完成步骤2将打开此窗口,单击以蓝色突出显示的行:

  1. 使用所需的内容替换类型,然后单击重构