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

2022-09-02 03:37:52

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

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

如何快速重构并将其应用于其余代码?我可以对字段做同样的事情吗?LinearLayoutRelativeLayout


答案 1

简答题

您正在寻找的功能是!Type Migration

可以通过右键单击变量或字段的类型,然后选择 -> 来执行 。或者,您可以使用以下键盘快捷键:Type MigrationRefactorType Migration

  • 在 Mac 上:Shift + + F6
  • 在视窗上:Shift + Ctrl + F6

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


详细而详细的答案

你似乎误解了实际的作用。Rename

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

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

您可以通过右键单击要交换其类型的任何变量来执行 a,然后选择 -> 。之后,将弹出一个对话框,您可以输入要迁移到的类型,在您的情况下。然后只需点击,Android Studio就开始发挥其魔力。可能会有一个额外的弹出窗口,通知您代码中无法自动迁移的所有内容。只需扫描冲突列表,完成后,只需点击并手动修复这些冲突即可。Type MigrationRefactorType MigrationRelativeLayoutRefactorIgnore

下面是一个工作中的示例。我从这段代码开始:Type Migration

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) {
    ...
}

现在,我对 中的局部变量执行了 to。结果如下所示:Type MigrationRelativeLayoutlayoutdoStuff()

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) {
    ...
}

正如你所看到的,做了出色的工作。字段的类型甚至参数的类型都已更改为 。只有一次冲突。Android Studio 无法在 的最顶部自动更改演员类型。我不得不手动修复它。正如我之前提到的,在执行重构时,我被警告了这种冲突。Type MigrationfooTheBar()RelativeLayoutdoStuff()

您当然可以问自己,为什么它可以自动更改字段和参数的类型,但无法更改强制转换的类型,但是如果您考虑一下,这实际上很有意义:

它无法自动迁移的代码部分是 。此方法当然会查找带有 id 的 。这可能是在布局xml中定义的,或者可以在运行时动态添加到动态中,但无论如何,它都不能自动重构而不会破坏功能的风险。只有开发人员才能决定如何处理它,这就是为什么你被警告的原因。(LinearLayout) container.findViewById(R.id.linearLayout)ViewR.id.linearLayoutViewcontainer


答案 2

对于在 Kotlin 文件中:Type Migration

假设您要在以下函数中将输入参数从 更改为 。StringInt

fun getValue(key: String){
}
  1. 将光标放在要更改的类型上(在本例中为字符串)

  2. Right click > Refactor > Change Signature.或者使用下面的快捷方式来完成此步骤:

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

  1. 将文字替换为所需的任何内容,然后单击Refactor


推荐