# 设置界面(PluginPreference)

通过实现 PluginPreference 接口,你可以为插件添加设置界面。

PS:目前(PluginSdkVersion = 2)仅可以实现一个主设置界面,暂时不支持多个设置界面和通过代码打开设置界面,我们会在后续更新中增加这些功能。

# 实现主设置界面

我们需要创建一个类实现 PluginPreference 接口,并在 onBuild 方法中添加选项数据。

目前支持添加的选项有:

  • 选项头(Header)
  • 文本输入(Input)
  • 单选列表(List)
  • 选项开关(Switch)
  • 文本说明(Text)
package bin.mt.plugin;

import bin.mt.plugin.api.MTPluginContext;
import bin.mt.plugin.api.preference.PluginPreference;

public class MyPreference implements PluginPreference {

    @Override
    public void onBuild(MTPluginContext context, Builder builder) {
        builder.addHeader("选项头1");

        builder.addText("文本")
                .summary("单纯用来显示文字");

        builder.addText("MT论坛")
                .summary("除了显示文字,点击还能打开网址")
                .url("https://bbs.binmt.cc");

        builder.addHeader("选项头2");

        builder.addInput("选项-输入内容", "key_input")
                .summary("请输入内容")
                .defaultValue("默认值");

        builder.addList("选项-单选列表", "key_list")
                .summary("未选中任何项目")
                // .defaultValue("1")
                .addItem("项目1", "1").summary("选中了选项1")
                .addItem("项目2", "2").summary("选中了选项2");

        builder.addSwitch("选项-开关", "key_switch")
                .defaultValue(true)
                .summaryOn("开")
                .summaryOff("关");
    }

}

添加以上代码后,还需要在 manifest.json 文件中注册:

...
mainPreference: "bin.mt.plugin.MyPreference"
...

安装完插件后,进入插件管理界面,点击「设置界面Demo」即可看到设置:

界面效果:

下载演示插件

# 获取配置值

通过上下文获取 SharedPreferences 实例,再通过选项 key 值调用相应的 get 方法即可获得选项值。

SharedPreferences preferences = context.getPreferences();

// 获取「选项-输入内容」的配置值
preferences.getString("key_input", "默认值");

// 获取「选项-单选列表」的配置值
preferences.getString("key_list", null);

// 获取「选项-开关」的配置值
preferences.getBoolean("key_switch", true);

# 使用本地化文本

使用本地化文本需要先调用 Builder 的 setLocalString() 方法,再使用{key}格式设置属性值。

支持设置的属性有:

  • 所有选项的 title
  • 所有选项的 summary(包含 summaryOn 和 summaryOff )
  • List.Item 的 name
  • Input 的 Validator 的返回值
@Override
public void onBuild(MTPluginContext context, Builder builder) {
    builder.setLocalString(context.getLocalString());
    builder.addHeader("{key1}");    
    builder.addText("{key2}").summary("{key3}");
}

# PluginPreference 源码参考

/**
 * 插件设置界面
 */
public interface PluginPreference {

    /**
     * 创建设置界面时调用,通过builder添加选项数据
     */
    void onBuild(MTPluginContext context, Builder builder);

    interface Builder {

        /**
         * 设置本地化文本实例,设置之后后续方法的title、
         * summary、name均可通过{key}格式使用本地化文本。
         */
        void setLocalString(LocalString localString);

        /**
         * 添加选项头
         *
         * @param title 标题
         */
        void addHeader(@NonNull String title);

        /**
         * 添加一个纯文本
         * @param title 标题
         * @return Text实例,可进行后续配置
         */
        Text addText(@NonNull String title);

        /**
         * 添加一个输入选项,选项值类型为String
         *
         * @param title 标题
         * @param key 存储选项值的key
         * @return Input实例,可进行后续配置
         */
        Input addInput(@NonNull String title, @NonNull String key);

        /**
         * 添加一个开关,选项值类型为boolean
         *
         * @param title 标题
         * @param key 存储选项值的key
         * @return Switch实例,可进行后续配置
         */
        Switch addSwitch(@NonNull String title, @NonNull String key);

        /**
         * 添加一个开关,选项值类型为String
         *
         * @param title 标题
         * @param key 存储选项值的key
         * @return List实例,可进行后续配置
         */
        List addList(@NonNull String title, @NonNull String key);

    }

    /**
     * 选项-纯文本
     */
    interface Text {

        /**
         * 设置摘要,显示在标题下方
         */
        Text summary(String summary);

        /**
         * 设置点击后调整的url,不设置则点击后无效果
         */
        Text url(String url);

    }

    /**
     * 选项-文本输入
     */
    interface Input {

        /**
         * 设置默认值
         */
        Input defaultValue(String defaultValue);

        /**
         * 设置摘要,显示在标题下方
         */
        Input summary(String summary);

        /**
         * 使用输入值作为摘要,设置后会覆盖掉原有摘要
         */
        Input valueAsSummary();

        /**
         * 设置文本输入类型
         *
         * @param inputType {@link android.text.InputType}
         */
        Input inputType(int inputType);

        /**
         * 设置输入内容校验器,可用于检测输入内容格式是否正确
         */
        Input validator(Validator validator);

        /**
         * 输入内容校验器
         */
        interface Validator {

            /**
             * @param value 待校验内容
             * @return 校验通过返回null,否则返回错误信息,支持本地化文本{key}格式
             */
            @Nullable
            String validate(String value);
        }
    }

    /**
     * 选项-开关
     */
    interface Switch {

        /**
         * 设置默认值
         */
        Switch defaultValue(boolean defaultValue);

        /**
         * 设置摘要,显示在标题下方
         */
        Switch summary(String summary);

        /**
         * 设置选项状态为「开」时显示的摘要,会覆盖掉原有摘要
         */
        Switch summaryOn(String summary);

        /**
         * 设置选项状态为「关」时显示的摘要,会覆盖掉原有摘要
         */
        Switch summaryOff(String summary);

    }

    /**
     * 选项-单选列表
     */
    interface List {

        /**
         * 设置默认值
         */
        List defaultValue(String defaultValue);

        /**
         * 设置摘要,显示在标题下方
         */
        List summary(String summary);

        /**
         * 添加子选项
         * 
         * @param name 子选项名称
         * @param value 子选项值
         * @return Item实例,可进行后续配置
         */
        Item addItem(@NonNull String name, String value);

        /**
         * 选项-单选列表-子选项
         */
        interface Item {

            /**
             * 设置该子选项被选中后显示的摘要,会覆盖掉原有摘要
             */
            Item summary(String summary);

            /**
             * 添加下一个子选项
             *
             * @param name 子选项名称
             * @param value 子选项值
             * @return 下一个Item实例,可进行后续配置
             */
            Item addItem(@NonNull String name, String value);

        }
    }

}