TextView에서 선택 + 텍스트 복사?


106

사용자가 TextView에서 텍스트를 선택 / 복사 할 수있는 방법이 있습니까? 컨트롤을 길게 누르고 모두 선택 / 복사 팝업 옵션을 얻을 수있는 EditText와 동일한 기능이 필요하지만 TextView처럼 보이려면 컨트롤이 필요합니다.

EditText에서 editable = "none"옵션 또는 inputType = "none"을 사용하도록 만드는 것과 같은 몇 가지 작업을 시도했지만 여전히 원하지 않는 EditText의 프레임 배경이 유지됩니다.

감사

------- 업데이트 ----------------------

이것은 99 %입니다. 제가 원하는 것은 선택 하이라이트가 보이게하는 것입니다 (주황색 물건). 그 외에는 좋지만 이것으로 살 수 있습니다.

<EditText 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:editable="false"
  style="?android:attr/textViewStyle"
  android:textColor="@color/white"
  android:textAppearance="@android:style/TextAppearance.Medium"
  android:cursorVisible="false"
  android:background="@null" />

나는 그것이 cursorVisible = "false"때문에 발생하는 것이라고 생각하지만, 선택하지 않아도 커서가 존재합니다.


대안은 TextView 대신 WebView를 사용하여 텍스트를 표시하는 것입니다.
aleb 2013 년


답변:


221

android : textIsSelectable 작동 (적어도 ICS에서는-이전 버전에서는 아직 체크인하지 않았습니다)

<TextView
    android:id="@+id/deviceIdTV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:text="" />

15
API 레벨 11 이상 만 해당
Thierry-Dimitri Roy

10
그러나 복사하는 방법? 텍스트를 강조 표시 할 수 있지만 복사 메뉴가 나타나지 않습니다.
Bagusflyer 2014 년

1
커서를 조작 할 때 이것이 충돌을 일으키는 것이 아닙니다.
Shubham

1
listview에서 작동하는 방법을 알려주시겠습니까?
Ramesh Kumar

도구 모음에 생성 된 아름답고 기본 복사 메뉴
Farid

56

텍스트보기는 활성화, 포커스 가능, longClickable 및 textIsSelectable이 필요합니다.

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:id="@+id/pwTextView"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" />

1
이것이 최상의 솔루션입니다.
Brave

9
textIsSelectable충분하지 않습니까? 이 옵션으로 만 작동합니다
herau

4
또는 textview.setTextIsSelectable(true)코드 자바 코드에서 사용할 수 있습니다 .
berrytchaks

1
그냥 사용하는 textIsSelectableis나를 위해 일을 할
crgarridos을

1
어떻게 든, textIsSelectable어떤 경우에는, 그러나 다른 사람을 위해 작동합니다. 때로는 동일한 레이아웃이 항상 textIsSelectable이 아닌 다른 텍스트로 작동합니다. 그러나이 솔루션은 더 잘 작동하지 않는 것 같으므로 다른 곳에서 문제가 발생할 수 있습니다.
Simon Ninon

23

더 나은 해결책이 있다고 생각합니다. 그냥 전화 해
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


사용자가 복사 할 텍스트 비트를 선택할 수있는 곳은 어디입니까? 원래 질문이 아닌 모든 것을 복사하지 않습니까?
James Moore

4
이로 인해 메뉴에서 "복사"를 선택했는지 여부에 관계없이 텍스트가 즉시 복사된다는 점에 유의하는 것이 좋습니다. 적절한 항목이 선택된 경우에만 복사하려면 onContextItemSelected ()도 재정의하거나 메뉴 항목에 클릭 핸들러를 추가해야합니다.
Faisal

ClipboardManager.setText(CharSequence text)API 레벨 11에서 더 이상 사용되지 않습니다 setPrimaryClip(ClipData). 대신 사용하십시오 . 이렇게하면 주어진 텍스트를 포함하는 ClippedItem이 생성되고 기본 클립으로 설정됩니다. 레이블이나 아이콘이 없습니다. 복사 - 붙여 넣기에 대한 좋은 읽기 : 링크
마 릴리아

텍스트 선택 후 대화 상자를 열고 싶습니다. 그래서 그것에 대한 제안을 제공 할 수 있습니까?
Anand Savjani

9
textview1.setTextIsSelectable(true);

이렇게하면 사용자가 길게 클릭하거나 평소처럼 텍스트를 선택하고 복사 할 수 있습니다.


6

나는 똑같은 것을 구현하려고 노력하고 있으며 귀하의 질문은 내 editext 레이아웃을 올바르게 설정하는 데 도움이되었습니다. 감사합니다! :)

그런 다음 커서가 켜져 있으면 강조 표시가 실제로 표시된다는 것을 깨달았습니다. 하지만 텍스트를 길게 클릭하기 전에 커서를보고 싶지 않기 때문에 여러분처럼 layout.xml 파일에서 커서를 숨기고 길게 클릭 할 때 이벤트 리스너를 추가하고 선택이 시작될 때만 커서를 표시합니다. .

따라서 onCreate 섹션의 Activity에 리스너를 추가하십시오.

public TextView htmltextview;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    htmltextview.setOnLongClickListener(new OnLongClickListener(){

        public boolean onLongClick(View v) {
            htmltextview.setCursorVisible(true);
            return false;
        }
    });

}

그리고 시작 부분에는 커서가 없으며 길게 클릭하면 커서가 선택 경계와 함께 나타납니다.

내가 도울 수 있기를 바랍니다.

건배, fm


5

나는 또한 비슷한 것을 시도했지만 여전히 TextView에서 텍스트 강조 표시를 조작하는 사용자 지정 접근 방식이 필요했습니다. 나는 LongClick행동 에 하이라이트와 카피를 촉발시켰다 .

이것이 내가 사용하는 방법입니다 SpannableString.

SpannableString highlightString = new SpannableString(textView.getText());
highlightString.setSpan(new BackgroundColorSpan(ContextCompat.getColor(getActivity(), R.color.gray))
            , 0, textView.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(highlightString);
copyToClipboard(urlToShare);

및 복사 기능 :

public void copyToClipboard(String copyText) {
    ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("url", copyText);
    clipboard.setPrimaryClip(clip);
    Toast toast = Toast.makeText(getActivity(), "Link is copied", Toast.LENGTH_SHORT);
    toast.show();
}

이 질문으로 끝나는 사람에게 도움이 되었기를 바랍니다. :)


4

프로그래밍 방식으로 Kotlin 사용 (수동 복사)

button.setTextIsSelectable(true)

또는 Kotlin 속성 확장을 추가합니다.

var TextView.selectable
    get() = isTextSelectable
    set(value) = setTextIsSelectable(value)

그런 다음 전화

textview.selectable = true
// or
if (textview.selectable) { ...

프로그래밍 방식으로 Kotlin 사용 (자동 복사)

사용자가 길게 누를 때 자동 복사하려면 다음이 필요한 기본 코드입니다.

myView.setOnLongClickListener {  
    val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("Copied String", myString)
    clipboardManager.setPrimaryClip(clip)
    true // Or false if not consumed
}

를 추가하여 Toast문제가 발생했는지 확인할 수 있습니다.

또는 Kotlin 확장 기능 추가

myView.copyOnHold() // pass custom string to not use view contents

fun TextView.copyOnHold(customText: String? = null) {
    setOnLongClickListener {
        val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
        val clip = ClipData.newPlainText("Copied String", customText ?: text)
        clipboardManager.setPrimaryClip(clip)
        true // Or false if not consumed
    }
}

Xml (수동 복사) 사용

이것을 당신의 <TextView>

android:textIsSelectable="true"

참고 :이 모든 항목에는 android:enabled="true"및 이 필요 하며 android:focusable="true"이는 TextView.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.