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

标签 java android-studio refactoring

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

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

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

最佳答案

简答

你要找的函数是Type Migration!

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

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

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


长而详细的答案

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

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

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

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

这是一个类型迁移的例子。我从这段代码开始:

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() 中的局部变量 layout 执行了 Type MigrationRelativeLayout。结果如下所示:

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

如您所见,Type Migration 做得很好。 fooTheBar() 的字段类型甚至参数类型都更改为RelativeLayout。只有一场冲突。 Android Studio 无法自动更改 doStuff() 顶部的强制转换类型。我不得不手动修复它。正如我之前提到的,我在执行重构时被警告过这种冲突。

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

无法自动迁移的部分代码是(LinearLayout) container.findViewById(R.id.linearLayout)。这个方法当然会寻找一个 ID 为 R.id.linearLayoutView。此 View 可能在布局 xml 中定义,也可能在运行时动态添加到 container 中,但无论如何它都不能在没有破坏功能的风险。这是只有开发人员才能决定如何处理的事情,这就是您被警告的原因。

关于java - 我可以使用重构来将一个变量的类型交换为另一个变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29968493/

相关文章:

c++ - 将传递引用转换为传递返回

java - 用于在弹出窗口中预览方法代码的键盘快捷键

android-studio - Pulltorefresh 添加到 gradle

java - Android Studio (1.5.1) -- 错误 : cannot find symbol class/App won't run

windows - 在不同的 Windows 和 Mac 机器之间共享 Android Studio 项目

php - 在 PHP 中重构 if 语句或 if 语句的其他解决方案(不是 switch case)

c# - 重构具有方法依赖项的 C# 派生类

java - 使用 Java 创建新目录和其中的文件

java - JRun/Coldfusion - System.out - 如何防止它变得太大?

java - Spring、MySQL 和 Hibernate : Database error if the system is not used within 8 hours