본문 바로가기
Android

Android Textview 아이템 클릭이벤트 [Spannable]

by leopard4 2023. 3. 23.

첫번째 적용할XML파일에 TextView에 버퍼타입설정

android:bufferType="spannable"

 

두번째 코드에 텍스트뷰의 상태를 확인하는 부분을 추가해야함 리스너같은거인듯

textView.setMovementMethod(new android.text.method.LinkMovementMethod().getInstance()); // 클릭이벤트를 사용하기 위해 필요한 코드 // 이거 안하면 클릭이벤트가 안먹힘

 

 

 

전체코드

package com.leopard4.testingapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    ArrayList<String> textList = new ArrayList<>();
    ArrayList<Spannable> spanList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editTxt);// EditText 보기에 대한 참조 가져오기
        textView = findViewById(R.id.textView);// TextView 보기에 대한 참조 가져오기

        editText.addTextChangedListener(new TextWatcher() { // EditText에 TextWatcher를 추가하여 텍스트 변경 감지
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {} // 이 구현에서는 사용되지 않음

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {} //이 구현에서는 사용되지 않음

            @Override
            public void afterTextChanged(Editable s) { // 이 메서드는 텍스트가 변경된 후에 호출됩니다.
                SpannableStringBuilder spannable = new SpannableStringBuilder(s.toString()); // 새 텍스트 입력에서 SpannableStringBuilder 만들기
                String[] words = s.toString().split("\\s+"); // 텍스트 입력을 단어로 분할

                for (String word : words) { // 각 단어를 반복
                    ClickableSpan clickableSpan = new ClickableSpan() { // 단어에 대한 새 ClickableSpan 만들기
                        @Override
                        public void onClick(View view) { // 이 메서드는 단어를 클릭할 때 호출됩니다.
                            int wordStart = textView.getText().toString().indexOf(word); // TextView에서 단어의 시작 위치를 가져옵니다.
                            spannable.delete(wordStart, wordStart + word.length()); // SpannableStringBuilder에서 단어 제거
                            textView.setText(spannable); // 수정된 SpannableStringBuilder로 TextView 업데이트
                        }
                    };
                    int start = s.toString().indexOf(word); // EditText에서 단어의 시작 위치를 가져옵니다.
                    spannable.setSpan(clickableSpan, start, start + word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 단어의 SpannableStringBuilder에 ClickableSpan을 추가합니다.
                }
                textView.setText(spannable); // TextView 텍스트를 수정된 SpannableStringBuilder로 설정합니다.
                textView.setMovementMethod(LinkMovementMethod.getInstance()); // 이동 방법을 LinkMovementMethod로 설정하여 텍스트를 클릭 가능하게 만듭니다.
            }
        });


    }
}