TextViewでテキストを選択してコピーしますか?


106

ユーザーがTextViewでテキストを選択/コピーできるようにする方法はありますか?EditTextの同じ機能が必要です。コントロールを長押しして、select all / copyのポップアップオプションを取得できますが、コントロールは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、2015年

1
リストビューで機能させる方法を教えてください。
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
これが最良の解決策です。
ブレイブ

9
なぜtextIsSelectable十分ではないのですか?私にとってはこのオプションのみで機能します
herau

4
またはtextview.setTextIsSelectable(true)、コードjavaコードで使用できます。
berrytchaks 2018年

1
ちょうどtextIsSelectableis私のために仕事をするために使用
crgarridos

1
どういうわけか、textIsSelectableいくつかのケースでは機能しますが、他では機能しません。場合によっては、同じレイアウトが常にtextIsSelectableだけでは機能せず、別のテキストが機能することがあります。ただし、このソリューションはそれをよりうまく機能させるようには見えないので、問題はどこか他の場所から来ている可能性があります。
Simon

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()もオーバーライドするか、クリックハンドラーをメニューアイテムに追加する必要があります。
ファイサル

ClipboardManager.setText(CharSequence text)APIレベル11で廃止されましたsetPrimaryClip(ClipData)。代わりに使用してください。これにより、指定されたテキストを保持するClippedItemが作成され、それがプライマリクリップとして設定されます。ラベルやアイコンはありません。コピーと貼り付けについての朗読:リンク
Marilia

テキスト選択後にダイアログを開きたい。それであなたはそれについて何か提案を提供できますか?
Anand Savjani 16

9
textview1.setTextIsSelectable(true);

これにより、ユーザーは長いクリックで、または通常のようにテキストを選択してコピーできます


6

私は同じものを実装しようとしています、そしてあなたの質問は私のeditextレイアウトを正しく設定するのに役立ちました。ほんとありがと!:)

その後、カーソルが置かれているとハイライトが実際に表示されることに気づきました。しかし、テキストを長くクリックする前にカーソルを表示したくないので、あなたと同じようにlayout.xmlファイルでカーソルを非表示にし、長いクリック用のイベントリスナーを追加して、選択が開始されたときにのみカーソルを表示します。

したがって、onCreateセクションのアクティビティにリスナーを追加します。

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.