Скопировать текст из Android AlertDialog? - PullRequest
11 голосов
/ 26 августа 2011

Есть ли способ сделать текст в AlertDialog «выбираемым» или «копируемым» в Android? Или я должен использовать другой виджет вместо AlertDialog?

Ответы [ 3 ]

17 голосов
/ 26 августа 2011

Это может быть достигнуто несколькими способами. Но сначала, чтобы настроить диалог более, вам нужно использовать класс AlertDialog.Builder * до , чтобы создать собственный диалог . Это может быть заполнено вашими собственными View с.

Вот три способа архивирования выбранного текста:

Использование Android 3.0 +

Начиная с API-уровня 11 (Android 3.0), TextView имеет метод, называемый setTextIsSelectable(), что в значительной степени похоже на то, чего я достиг, взломав, как подробно описано ниже.

// The TextView to show your Text
TextView showText = new TextView(this);
showText.setText("Some selectable text goes here.");
showText.setTextIsSelectable(true);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// Build the Dialog
builder.setView(showText)
       .setTitle("Selectable text")
       .setCancelable(true)
       .show();

Проблема с этим решением заключается в том, что оно будет работать только на устройствах с Android 3.0 и выше, в то время как два других решения также будут работать на Android 1.5 (я использовал Android 2.2).

Копировать в буфер обмена

Поскольку целью пометки текста (в большинстве случаев) является его копирование, вы можете просто добавить onLongClickListener или простой onClickListener (тот, который вам больше всего нравится) в TextView и скопировать его отображаемый текст в буфер обмена системы.

Маленькая иллюстрация этого:

// Get our tools
AlertDialog dialog;
AlertDialog.Builder builder;
// The TextView to show your Text
TextView showText = new TextView(this);
showText.setText("Some selectable text goes here.");
// Add the Listener
showText.setOnLongClickListener(new View.OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {
        // Copy the Text to the clipboard
        ClipboardManager manager = 
            (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        TextView showTextParam = (TextView) v;
        manager.setText( showTextParam.getText() );
        // Show a message:
        Toast.makeText(v.getContext(), "Text in clipboard",
                Toast.LENGTH_SHORT)
        .show();
        return true;
    }
});
// Build the Dialog
builder = new AlertDialog.Builder(this);
builder.setView(showText);
dialog = builder.create();
// Some eye-candy
dialog.setTitle("Selectable text");
dialog.setCancelable(true);
dialog.show();

В этом примере будет скопирован весь отображаемый текст в системный буфер обмена.

Сделать EditText похожим на TextView

Поскольку на самом деле не существует простого способа сделать текст из TextView выбираемым в версиях Android до 3.0, вы можете использовать EditText (с текстом по умолчанию для выбора) и сделать его похожим на TextView .

Для этого требуется некоторый XML-макет (чтобы получить стиль TextView), но, вероятно, вы получите наиболее естественный вид:

XML-часть:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- Make the EditText look like a TextView -->
    <EditText android:id="@+id/showText"
        style="?android:attr/textViewStyle"
        android:background="@null"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Java-часть:

// Get our tools
AlertDialog dialog;
AlertDialog.Builder builder;
// The EditText to show your Text
LayoutInflater inflater = 
    (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.dialog,
        (ViewGroup) this.findViewById(R.id.showText));
EditText showText = (EditText) layout.findViewById(R.id.showText);
showText.setText("Some selectable text goes here.");
// Build the Dialog
builder = new AlertDialog.Builder(this);
builder.setView(layout);
dialog = builder.create();
// Some eye-candy
dialog.setTitle("Selectable text");
dialog.setCancelable(true);
dialog.show();

К результату могут быть добавлены некоторые настройки и конфетка;)

Надеюсь, это даст вам представление о том, как вы можете решить эту задачу. Уже поздно, пора спать.

3 голосов
/ 19 августа 2015

Это немного хакерски, потому что предполагается, что вы знаете макет AlertDialog по умолчанию (см. Где найти XML-файл макета AlertDialog по умолчанию? ), но если вы хотите пойти по этому пути, вы можете сделать следующая вещь:

    alertDialog.show();
    try {
        TextView textView = (TextView)dialog.getWindow().getDecorView().findViewById(android.R.id.message);
        textView.setTextIsSelectable(true);
    }
    catch(Exception e) {
        // Oups!
    }
1 голос
/ 26 августа 2011

Вы можете поместить EditText в свой AlertDialog. Если вы не хотите, чтобы это казалось текстовым полем, вы можете просто стилизовать его, как фон AlertDialog, чтобы оно гармонировало.

http://developer.android.com/guide/topics/ui/dialogs.html

Надеюсь, это поможет, если нет, я могу попытаться предложить другие способы решения.

...