在 Android Studio 上工作时,自定义首选项没有自动完成功能?重构不适用于自定义视图属性

Custom Preference do not have auto-complete when working on Android Studio? Refactoring does not work on custom view attributes

此问题不会出现在常规布局 XML 文件中,但会出现在 PreferenceScreen xml 文件中。这是预期的行为吗?当我定义自定义视图并将其直接添加到 PreferenceScreen 时,它是 XML 文件,该自定义视图的属性没有自动完成或重构功能。

澄清自定义首选项的含义:我使用 this method 来实现自定义首选项。

所以让我们来看看 link 中的例子。我想要做的是拥有自动完成的所有好处(例如 IntelliSense)。假设我想创建一个 defined/created 的自定义 SeekBar,但我没有手动输入包名称和 class 名称,而是按 CTRL+SPACE 调出自动完成列表。但是没有出现!

假设我希望这是我的最终 PreferenceScreen xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <com.example.SeekbarPreference
        android:key="pref_volume"
        android:title="@string/volume" />
    
</PreferenceScreen>

我想按 CTRL+SPACE 自动完成我的自定义首选项:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <com.ex
    
</PreferenceScreen>

但是不行!它确实适用于由活动扩充的正常布局文件下的自定义视图。但如果它是 PreferenceScreen,我必须全部输入,但我很容易出错。

此外,我想重构自定义首选项的属性引用的资源。假设我进入我的“strings.xml”资源文件并将“@string/volume”更改为“@string/volume_label”

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <com.example.SeekbarPreference
        android:key="pref_volume"
        android:title="@string/volume" />
    
</PreferenceScreen>

当我在我的“strings.xml”文件中时,如果我右键单击并将“volume”重构为“volume_label”,这些资源将在包括布局在内的整个项目中重命名xml 文件和 java class 文件。但是,PreferenceScreen 文件中的“@string/volume”保持不变。当我编译和安装应用程序时,我从 Android Studio 收到一条错误消息,指出名为“volume”的字符串资源不存在。

如果我在我的 PreferenceScreen 的 XML 文件中,如果我右键单击:android:title="@string/volume" , 重构 > 重命名按钮丢失。

我解决了

问题是由为自定义首选项指定的访问修饰符引起的 class。

如果您希望能够重构并为您的自定义首选项启用自动完成功能,Android studio 仍然需要访问 class。

这是如果自动完成和重构不起作用时的样子:

class MySeekBarPreference extends SeekBarPreference {
    // Autocomplete and refactoring DISABLED in Android Studio
}

如果您希望自动完成和重构工作,它需要如下所示:

public class MySeekBarPreference extends SeekBarPreference {
    // Autocomplete and refactoring ENABLED in Android Studio
}

考虑到这个新信息,我认为原始问题与它是 PreferenceScreen 还是常规膨胀布局无关。我在常规布局中工作的其他自定义视图是 public,但我在 PreferenceScreen 中的自定义首选项不是 public。