2010-06-01 5 views
14

У меня есть ListView, где каждый элемент является TextView.Скопируйте текст из TextView на Android

Я хочу, чтобы включить длинный пресс поведение, похожее на EditText, который отображает контекстное меню по умолчанию с пунктами как «Выбрать все», «Вырезать все», «Копировать все» и т.д.

Есть простой способ включить это для TextView?

+0

на данный момент я регистрируюсь для контекстного меню и используя диспетчер буфера обмена, чтобы скопировать весь текст TextView. Но похоже, что это должно быть по умолчанию. – Erdal

+0

На самом деле для этого адаптировано контекстное меню. Вы можете настроить его на досуге. Вы также можете посмотреть класс AlertDialog. Обычно это не используется для этой цели, но вы можете называть его длинным кликом. Однако, если я хорошо помню, вы ограничены 3 кнопками макс. – Sephy

+0

Еще одна вещь, я не знаю, целесообразно ли это сделать, но вы можете попытаться поместить свой список в рамку и добавить еще один вид/макет внутри, но с отсутствующей видимостью и превратить его видимость в видимую, когда элемент вашего списка нажал и обновил его содержимое? – Sephy

ответ

20

У меня есть решение. Просто позвоните
registerForContextMenu(yourTextView);

и ваш TextView будет регистрироваться для получения события контекстного меню.

Затем переопределить onCreateContextMenu в вашем Activity:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    //user has long pressed your TextView 
    menu.add(0, v.getId(), 0, "text that you want to show in the context menu - I use simply Copy"); 

    //cast the received View to TextView so that you can get its text 
    TextView yourTextView = (TextView) v; 

    //place your TextView's text in clipboard 
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
    clipboard.setText(yourTextView.getText()); 
} 

Надеется, что это помогает и кто-то еще ищут способ, чтобы скопировать текст из TextView

+0

Спасибо за сообщение, просто то, что мне нужно для уровня API 2.1. Сначала это не сработало, выяснилось, что мне пришлось удалить это из манифеста xml: android: configChanges = "keyboardHidden" – Alan

+4

Это действительно работает. Хотя он копирует текст до того, как пользователь на самом деле щелкнет копию. Это может запутать и перезаписать их буфер обмена.Другой способ - выполнить копию в onContextItemSelected. Вы уже устанавливаете идентификатор параметра меню на идентификатор вида, но не используете его. Кроме того, убедитесь, что вы импортируете android.text.ClipboardManager вместо android.content.ClipboardManager для этого примера, если вы настроите таргетинг на устройства

+0

Как скопировать только при нажатии на элемент меню? –

1

Вы можете зарегистрировать onItemLongClickListener на вашем ListView и затем, основываясь на выбранном элементе, предоставите пользователю все варианты, которые вы выберете.

7

На самом деле, вам не нужно разрабатывать эту функцию самостоятельно. Вам просто нужно использовать EditText вместо TextView, пока вы установите для android: editable EditText значение false. Мой код здесь:

R.layout.edittext.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="40dip" 
android:editable="false" 
android:background="@null" 
android:textColor="#FFFFFF"/> 

ListItemCopyTextActivity.java

public class ListItemCopyTextActivity extends Activity {  

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LinearLayout ll = new LinearLayout(this); 
    ListView lv = new ListView(this); 

    String[] values = new String[15]; 
    for (int i = 0; i < 15; i++) { 
     values[i] = "ListItem NO." + i; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      R.layout.edittext, values); 
    lv.setAdapter(adapter); 

    ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

    setContentView(ll); 

    } 
} 

Вы можете просто долго нажмите на элемент и выберите выберите текст, копировать, вырезать , прошлое и т. д.

+2

Не работает для меня. Если editable is false, я получаю: «TextView не поддерживает выбор текста. Режим действия отменен». Использование android: textIsSelectable - хорошее решение для меня. –

3

Чтобы пользователи могли скопировать некоторые или все значения TextView и вставить их в другое место,

установить XML атрибут {@link android.R.styleable#TextView_textIsSelectable android:textIsSelectable} для "true"

или

вызова {@link #setTextIsSelectable setTextIsSelectable(true)}.

Смежные вопросы