첫번째 적용할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로 설정하여 텍스트를 클릭 가능하게 만듭니다.
}
});
}
}
'Android' 카테고리의 다른 글
현재화면을 캡쳐해서 공유하기 (0) | 2023.03.29 |
---|---|
android Spannable을 이용한 TextView에 버튼 만들고 버튼을 클릭하면 선택한 Spannable만 제거 (0) | 2023.03.24 |
fragment에서 activity 로 이동할때 LifeCycle을 Log로 확인 (0) | 2023.03.21 |
Retrofit2 cache & Wireshark packet capture (0) | 2023.03.20 |
retrofit2 okhttp response의 글자가 깨진다면 (0) | 2023.03.16 |