对话框与剪贴板


1 提示对话框(ToastDialog)

提示对话框在屏幕上方弹出对话框,为用户显示简单的提示信息。提示对话框仅用于显示提示信息,不与用户交互,一段时间后会自动消失,显示期间用户可以继续操作其它界面元素。

1.1 默认布局

new ToastDialog(this)
    .setText("吃了吗?您呐!")
    .setDuration(5000)
    .setAlignment(LayoutAlignment.CENTER)
    .setOffset(0, -200)
    .show();

1.2 自定义布局

new ToastDialog(this)
    .setContentCustomComponent(LayoutScatter
    .getInstance(this)
    .parse(ResourceTable.Layout_toast_dialog,
    null, false))
    .setSize(LayoutConfig.MATCH_CONTENT,
    LayoutConfig.MATCH_CONTENT)
    .setDuration(5000)
    .setAlignment(LayoutAlignment.CENTER)
    .setOffset(0, -200)
    .show();

例程:ToastDialog

...\ToastDialog\entry\src\main\resources\base\layout\ability_main.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:txtDefaultLayout"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="默认布局"
        ohos:text_size="40vp"
        />

    <Text
        ohos:id="$+id:txtCustomLayout"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="自定义布局"
        ohos:text_size="40vp"
        />

</DirectionalLayout>

...\ToastDialog\entry\src\main\resources\base\graphic\background_toast_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:shape="rectangle">
    <solid ohos:color="#acff7f27"/>
    <corners ohos:radius="15vp"/>
</shape>

...\ToastDialog\entry\src\main\resources\base\layout\toast_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_content"
    ohos:width="match_content"
    ohos:left_padding="20vp"
    ohos:top_padding="5vp"
    ohos:right_padding="20vp"
    ohos:bottom_padding="5vp"
    ohos:background_element="$graphic:background_toast_dialog">

    <Text
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="吃了吗?您呐!"
        ohos:text_size="24vp"
        ohos:text_color="#ffffff"
        />

</DirectionalLayout>

...\ToastDialog\entry\src\main\java\com\minwei\toastdialog\slice\MainAbilitySlice.java

public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        ...
        findComponentById(ResourceTable.Id_txtDefaultLayout)
            .setClickedListener(component -> {
                new ToastDialog(this)
                    .setText("吃了吗?您呐!")
                    .setDuration(5000)
                    .setAlignment(LayoutAlignment.CENTER)
                    .setOffset(0, -200)
                    .show();
            });

        findComponentById(ResourceTable.Id_txtCustomLayout)
            .setClickedListener(component -> {
                new ToastDialog(this)
                    .setContentCustomComponent(LayoutScatter
                    .getInstance(this)
                    .parse(ResourceTable.Layout_toast_dialog,
                    null, false))
                    .setSize(LayoutConfig.MATCH_CONTENT,
                    LayoutConfig.MATCH_CONTENT)
                    .setDuration(5000)
                    .setAlignment(LayoutAlignment.CENTER)
                    .setOffset(0, -200)
                    .show();
            });
    }
    ...
}

运行效果如下图所示:

 

2 列表对话框(ListDialog)

2.1 普通列表

String[] week = {
    "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};

ListDialog listDialog = new ListDialog(this);
listDialog.setTitleText("一个星期有七天:");
listDialog.setItems(week);
listDialog.setAutoClosable(true);
listDialog.setButton(0, "确定",
    new IDialog.ClickedListener() {
        @Override
        public void onClick(IDialog iDialog, int i) {
            listDialog.destroy();
        }
    });
listDialog.show();
listDialog.getListContainer().setPaddingLeft(190);

2.2 单选列表

private int selectedId = 0;

ListDialog listDialog = new ListDialog(this,
    ListDialog.SINGLE);
listDialog.setTitleText("选择一天去嗨皮:");
listDialog.setSingleSelectItems(week, selectedId);
listDialog.setOnSingleSelectListener(
    new IDialog.ClickedListener() {
        @Override
        public void onClick(IDialog iDialog, int i) {
            selectedId = i;
        }
    });
listDialog.setAutoClosable(true);
listDialog.setButton(0, "确定",
    new IDialog.ClickedListener() {
        @Override
        public void onClick(IDialog iDialog, int i) {
            ((Text)findComponentById(
                ResourceTable.Id_txtSingleSelected))
                .setText(week[selectedId]);
            listDialog.destroy();
        }
    });
listDialog.setButton(1, "取消",
    new IDialog.ClickedListener() {
        @Override
        public void onClick(IDialog iDialog, int i) {
            listDialog.destroy();
        }
    });
listDialog.show();
listDialog.getListContainer().setPaddingLeft(140);

2.3 多选列表

private boolean selectedItems[] = {
    false, true, false, true, false, true, false};

ListDialog listDialog = new ListDialog(this,
    ListDialog.MULTI);
listDialog.setTitleText("多嗨几天又如何:");
listDialog.setMultiSelectItems(week, selectedItems);
listDialog.setAutoClosable(true);
listDialog.setButton(0, "确定",
    new IDialog.ClickedListener() {
        @Override
        public void onClick(IDialog iDialog, int i) {
            String multiSelected = new String();
            for (i = 0; i < selectedItems.length; ++i)
                if (selectedItems[i] = ((Checkbox)listDialog
                    .getItemComponent(i)).isChecked())
                    multiSelected += week[i] + " ";
            ((Text)findComponentById(
                ResourceTable.Id_txtMultiSelected))
                .setText(multiSelected);
            listDialog.destroy();
        }
    });
listDialog.setButton(1, "取消",
    new IDialog.ClickedListener() {
        @Override
        public void onClick(IDialog iDialog, int i) {
            listDialog.destroy();
        }
    });
listDialog.show();
listDialog.getListContainer().setPaddingLeft(140);

例程:ListDialog

...\ListDialog\entry\src\main\resources\base\layout\ability_main.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:txtNormalList"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="普通列表"
        ohos:text_size="40vp"
        />

    <Text
        ohos:id="$+id:txtSingleList"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="单选列表"
        ohos:text_size="40vp"
        />

    <Text
        ohos:id="$+id:txtSingleSelected"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:text_color="#0000ff"
        />

    <Text
        ohos:id="$+id:txtMultiList"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="多选列表"
        ohos:text_size="40vp"
        />

    <Text
        ohos:id="$+id:txtMultiSelected"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:multiple_lines="true"
        ohos:text_size="30vp"
        ohos:text_color="#008800"
        ohos:text_alignment="center"
        />

</DirectionalLayout>

...\ListDialog\entry\src\main\java\com\minwei\listdialog\slice\MainAbilitySlice.java

public class MainAbilitySlice extends AbilitySlice {
    private int selectedId = 0;
    private boolean selectedItems[] = {
        false, true, false, true, false, true, false};

    @Override
    public void onStart(Intent intent) {
        ...
        String[] week = {
            "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};

        findComponentById(ResourceTable.Id_txtNormalList)
            .setClickedListener(component -> {
                ListDialog listDialog = new ListDialog(this);
                listDialog.setTitleText("一个星期有七天:");
                listDialog.setItems(week);
                listDialog.setAutoClosable(true);
                listDialog.setButton(0, "确定",
                    new IDialog.ClickedListener() {
                        @Override
                        public void onClick(IDialog iDialog, int i) {
                            listDialog.destroy();
                        }
                    });
                listDialog.show();
                listDialog.getListContainer().setPaddingLeft(190);
            });

        findComponentById(ResourceTable.Id_txtSingleList)
            .setClickedListener(component -> {
                ListDialog listDialog = new ListDialog(this,
                    ListDialog.SINGLE);
                listDialog.setTitleText("选择一天去嗨皮:");
                listDialog.setSingleSelectItems(week, selectedId);
                listDialog.setOnSingleSelectListener(
                    new IDialog.ClickedListener() {
                        @Override
                        public void onClick(IDialog iDialog, int i) {
                            selectedId = i;
                        }
                    });
                listDialog.setAutoClosable(true);
                listDialog.setButton(0, "确定",
                    new IDialog.ClickedListener() {
                        @Override
                        public void onClick(IDialog iDialog, int i) {
                            ((Text)findComponentById(
                                ResourceTable.Id_txtSingleSelected))
                                .setText(week[selectedId]);
                            listDialog.destroy();
                        }
                    });
                listDialog.setButton(1, "取消",
                    new IDialog.ClickedListener() {
                        @Override
                        public void onClick(IDialog iDialog, int i) {
                            listDialog.destroy();
                        }
                    });
                listDialog.show();
                listDialog.getListContainer().setPaddingLeft(140);
            });

        findComponentById(ResourceTable.Id_txtMultiList)
            .setClickedListener(component -> {
                ListDialog listDialog = new ListDialog(this,
                    ListDialog.MULTI);
                listDialog.setTitleText("多嗨几天又如何:");
                listDialog.setMultiSelectItems(week, selectedItems);
                listDialog.setAutoClosable(true);
                listDialog.setButton(0, "确定",
                    new IDialog.ClickedListener() {
                        @Override
                        public void onClick(IDialog iDialog, int i) {
                            String multiSelected = new String();
                            for (i = 0; i < selectedItems.length; ++i)
                                if (selectedItems[i] = ((Checkbox)listDialog
                                    .getItemComponent(i)).isChecked())
                                    multiSelected += week[i] + " ";
                            ((Text)findComponentById(
                                ResourceTable.Id_txtMultiSelected))
                                .setText(multiSelected);
                            listDialog.destroy();
                        }
                    });
                listDialog.setButton(1, "取消",
                    new IDialog.ClickedListener() {
                        @Override
                        public void onClick(IDialog iDialog, int i) {
                            listDialog.destroy();
                        }
                    });
                listDialog.show();
                listDialog.getListContainer().setPaddingLeft(140);
            });
    }
    ...
}

运行效果如下图所示:

3 剪贴板

利用剪贴板可以实现跨应用程序的数据交换。只有拥有焦点的窗口(AbilitySlice)可以使用剪贴板。

3.1 获取剪贴板对象

SystemPasteboard pasteboard =
    SystemPasteboard.getSystemPasteboard(this);

3.2 向剪贴板写数据

pasteboard.setPasteData(PasteData.creatPlainTextData(
    ((Text)findComponentById(ResourceTable.Id_txtCopy))
        .getText()));

3.3 从剪贴板读数据

PasteData pasteData = pasteboard.getPasteData();

if (pasteData.getProperty().hasMimeType(
    PasteData.MIMETYPE_TEXT_PLAIN))
    for (int i = 0; i < pasteData.getRecordCount(); ++i) {
        Record record = pasteData.getRecordAt(i);
        if (record.getMimeType().equals(
            PasteData.MIMETYPE_TEXT_PLAIN)) {
            ((Text)findComponentById(ResourceTable.Id_txtPaste))
                .setText(record.getPlainText().toString());
            break;
        }
    }

例程:Pasteboard

...\Pasteboard\entry\src\main\resources\base\layout\ability_main.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical"
    ohos:background_element="#000000">

    <Text
        ohos:id="$+id:txtCopy"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="我挥一挥衣袖,不带走一片云彩"
        ohos:text_size="20fp"
        ohos:text_color="#00a2e8"
        />

    <Text
        ohos:id="$+id:txtPaste"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="点击复制按钮,再点击粘贴按钮"
        ohos:text_size="20fp"
        ohos:text_color="#ff7f27"
        />

    <DirectionalLayout
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:top_margin="20vp"
        ohos:orientation="horizontal">

        <Button
            ohos:id="$+id:btnCopy"
            ohos:height="match_content"
            ohos:width="match_content"
            ohos:left_padding="10vp"
            ohos:right_padding="10vp"
            ohos:top_padding="5vp"
            ohos:bottom_padding="5vp"
            ohos:background_element="#00a2e8"
            ohos:text="复制"
            ohos:text_size="20fp"
            ohos:text_color="#ffffff"
            />

        <Button
            ohos:id="$+id:btnPaste"
            ohos:height="match_content"
            ohos:width="match_content"
            ohos:left_padding="10vp"
            ohos:right_padding="10vp"
            ohos:top_padding="5vp"
            ohos:bottom_padding="5vp"
            ohos:left_margin="20vp"
            ohos:background_element="#ff7f27"
            ohos:text="粘贴"
            ohos:text_size="20fp"
            ohos:text_color="#ffffff"
            />

    </DirectionalLayout>

</DirectionalLayout>

...\Pasteboard\entry\src\main\java\com\minwei\pasteboard\slice\MainAbilitySlice.java

public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        ...
        findComponentById(ResourceTable.Id_btnCopy)
            .setClickedListener(new ClickedListener() {
                @Override
                public void onClick(Component component) {
                    copy();
                }
            });

        findComponentById(ResourceTable.Id_btnPaste)
            .setClickedListener(new ClickedListener() {
                @Override
                public void onClick(Component component) {
                    paste();
                }
            });
    }
    ...
    private void copy() {
        SystemPasteboard pasteboard =
            SystemPasteboard.getSystemPasteboard(this);
        if (pasteboard == null)
            return;

        pasteboard.setPasteData(PasteData.creatPlainTextData(
            ((Text)findComponentById(ResourceTable.Id_txtCopy))
                .getText()));
    }

    private void paste() {
        SystemPasteboard pasteboard =
            SystemPasteboard.getSystemPasteboard(this);
        if (pasteboard == null)
            return;

        PasteData pasteData = pasteboard.getPasteData();
        if (pasteData == null)
            return;

        if (!pasteData.getProperty().hasMimeType(
            PasteData.MIMETYPE_TEXT_PLAIN))
            return;

        for (int i = 0; i < pasteData.getRecordCount(); ++i) {
            Record record = pasteData.getRecordAt(i);
            if (record.getMimeType().equals(
                PasteData.MIMETYPE_TEXT_PLAIN)) {
                ((Text)findComponentById(ResourceTable.Id_txtPaste))
                    .setText(record.getPlainText().toString());
                break;
            }
        }
    }
}

运行效果如下图所示:

 

更多精彩,敬请期待……


达内集团C++教学部 2021年9月19日