Что такое "метка" в ClipData на Android?

Согласно документации Android, ClipData использует "метку" как своего рода представление скопированных данных.

ClippedData - это сложный тип, содержащий один или несколько экземпляров Item, каждый из которых может содержать одно или несколько представлений элемента данных. Для отображения пользователю он также имеет метку и пиктограмму.

А затем он дополнительно объясняет "метку" как видимую пользователем метку для данных клипа в некоторых документах API. Тем не менее, я все еще не понимаю, как использовать этикетку.

Как этот ярлык виден пользователям? Как я должен использовать это? Что я должен установить для этой метки, когда я вызываю фабричный метод newPlainText(CharSequence label, CharSequence text)? например:

private void copyToClipBoard() {

    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText(
            "text label", // What should I set for this "label"?
            "content to be copied");
    clipboard.setPrimaryClip(clip);
    Toast.makeText(AboutActivity.this, "Saved to clip board", Toast.LENGTH_SHORT).show();
}

Ответ 1

ClipData clip = ClipData.newPlainText(
            "text label", 
            "content to be copied");

здесь текстовая метка описывает, какие данные находятся в клипе

например.

ClipData clip = ClipData.newPlainText(
            "user Name",
            user.getName()); 

мы можем получить это, используя

clip.getDescription ();

Ответ 2

Похоже, что описание "Данные, видимые пользователем" для данных клипа "в документации, должно интерпретироваться как то, что вы, как разработчик, может установить, а затем показать пользователю самостоятельно, а не как то, что система Android покажет пользователя.

При взгляде на исходный код Android метод ClipDescription.getLabel(), кажется, не используется до Android 5.0. В 5.0 RemoteInput RemoteInputCompatJellybean и com.android.mail.compose.ComposeActivity объявили с помощью метода.

Если вы посмотрите на использование, все они задают метку, которая не предназначена для просмотра пользователем, а вместо этого используется для программной идентификации клипа в другом месте в коде.

При взгляде на то, как ClipData.newPlainText() используется в Android, большую часть времени null указывается как метка, предполагая, что ярлык действительно не используется ни для чего.

Конечно, какой-то производитель телефона или какой-либо другой разработчик приложений принимает ярлык и отображает его пользователю в некоторой ситуации. Но в целом следует с уверенностью предположить, что ярлык клипа будет отображаться только пользователю в вашем приложении, если вы его сами покажете.

Ответ 3

Сегодня, работая над своим приложением, я обнаружил один вариант использования метки ClipData. Некоторые приложения устанавливают нулевое значение, в то время как другие используют его в значительной степени.

В случае моего приложения я слушаю ClipManager addPrimaryClipChangedListener

Я делаю это в классе обслуживания, который работает в фоновом режиме почти все время. Я хочу, чтобы данные, добавленные в первичный клип из моего приложения, отличались от данных, добавленных в другое приложение (скажем, текст, скопированный в веб-браузере).

Вот выдержка из моего кода и как я использую метку ClipData:

mClipBoardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
            @Override
            public void onPrimaryClipChanged() {
                String clipLabel = "default";
                if (mClipBoardManager.getPrimaryClip().getDescription().getLabel() != null) {
                    clipLabel = mClipBoardManager.getPrimaryClip().getDescription().getLabel().toString();
                }
                if (clipLabel.equals("auto_copy_text")) {
                    //TODO: Text from my app do stuffs you will do with text from my app
                } else {
                    //TODO: Text from some other app
                }

            }
        });

В моем приложении, когда я добавляю данные в primaryClip, я включаю метку следующим образом:

private void addToClipboard(String text) {
        mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        mClipboardManager.setPrimaryClip(ClipData.newPlainText("auto_copy_text", text));
    }

надеюсь, это поможет