문자열을 string 배열로 받아와서 배열의 위치에 따라 글자의 색이나 글씨체 등을 변경하는 건 쉽다.
그런데 다국어를 지원하는 App에서 일정한 부분의 글자를 변경 해줄 때,
한국어는 그 위치의 배열만 변경 해줄 수 있지만, 그 언어를 다른 나라의 언어로 변경할 때는 언어의 획순과 위치가 같지 않기 때문에 배열로 받아와서 변경하는 것으로 해결할 수 없다.
String str = "자바로 글자를 변경하는 연습";
TextView data = (TextView)findViewById(R.id.textView);
SpannableStringBuilder span = new SpannableStringBuilder(str);
span.setSpan(new ForegroundColorSpan(Color.parseColor("원하는 색상(헥사값)")), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
data.setText(span);
이렇게 설정하는 것이 가장 기본적인 방법이다.
string을 받아와서 그 배열의 순서에 따라 색상을 변경해준다.
하지만 내가 원하는 것은 원하는 글자만 바꾸고 싶었고, 그 글자가 다국어여도 그 부분만 바꿔지는 것이였다.
https://developer.android.com/games/develop/permissions?hl=ko
사이트에 있는 일부 문장을 이용해 테스트해보겠다.
strings에 translate를 설정해서 영어, 한국어 두 가지 strings.xml을 준비한다.
영어 (stings.xml)
<string name="test">If your app offers functionality that might require access to restricted data or restricted actions, determine whether you can get the information or perform the actions without needing to declare permissions. You can fulfill many use cases in your app, such as taking photos, pausing media playback, and displaying relevant ads, without needing to declare any permissions.</string>
한국어(strings.xml-ko)
<string name="test">앱에서 제한된 데이터나 제한된 작업에 액세스해야 할 수 있는 기능을 제공한다면 권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인하세요. 개발자는 권한을 선언하지 않고도 사진 찍기, 미디어 재생 일시중지, 관련 광고 표시 등 앱에서 여러 사용 사례를 처리할 수 있습니다.</string>
전체 문장 중 바꾸고 싶은 부분은 이 부분이다.
영어문장
If your app offers functionality that might require access to restricted data or restricted actions, determine whether you can get the information or perform the actions without needing to declare permissions. You can fulfill many use cases in your app, such as taking photos, pausing media playback, and displaying relevant ads, without needing to declare any permissions.
한국어 문장
앱에서 제한된 데이터나 제한된 작업에 액세스해야 할 수 있는 기능을 제공한다면 권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인하세요. 개발자는 권한을 선언하지 않고도 사진 찍기, 미디어 재생 일시중지, 관련 광고 표시 등 앱에서 여러 사용 사례를 처리할 수 있습니다.
이렇게 바꾸고 싶은 이 부분을 string(변수 change)으로 만들어 준다.
영어
<string name="test">If your app offers functionality that might require access to restricted data or restricted actions, determine whether you can get the information or perform the actions without needing to declare permissions. You can fulfill many use cases in your app, such as taking photos, pausing media playback, and displaying relevant ads, without needing to declare any permissions.</string>
<string name="change">you can get the information or perform the actions without needing to declare permissions</string>
한국어
<string name="test">앱에서 제한된 데이터나 제한된 작업에 액세스해야 할 수 있는 기능을 제공한다면 권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인하세요. 개발자는 권한을 선언하지 않고도 사진 찍기, 미디어 재생 일시중지, 관련 광고 표시 등 앱에서 여러 사용 사례를 처리할 수 있습니다.</string>
<string name="change">권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인</string>
설정하려고 하는 text에 android:bufferType="spannable"설정을 추가해준다.
MainActivity 코드는
public void changeColor() {
TextView changeTextView = findViewById(R.id.textView);
String content = changeTextView.getText().toString();
SpannableString span = new SpannableString(content);
String changeStr = getResources().getString(R.string.change);
int start = content.indexOf(changeStr);
int end = start + changeStr.length();
span.setSpan(new ForegroundColorSpan(Color.parseColor("#FF00BFFF")), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
changeTextView.setText(span);
}
span.setSpan(new ForegroundColorSpan(글자색), 시작지점, 끝지점, 옵션);
이렇게 사용해서 원하는 색상과 시작, 끝 지점을 선택할 수 있다.
- 옵션
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE : 왼쪽 제거 오른쪽 제거
- Spanned.SPAN_EXCLUSIVE_INCLUSIVE : 왼쪽 제거 오른쪽 포함
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE : 왼쪽 포함 오른쪽 제거
- Spanned.SPAN_INCLUSIVE_INCLUSIVE : 왼쪽 포함 오른쪽 포함
결과는 변경하려는 부분(change string)만 잘 변경된 것을 볼 수 있다.
전체 코드
MainActivity
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
changeColor();
}
public void changeColor() {
TextView changeTextView = findViewById(R.id.textView);
String content = changeTextView.getText().toString();
SpannableString span = new SpannableString(content);
String changeStr = getResources().getString(R.string.change);
int start = content.indexOf(changeStr);
int end = start + changeStr.length();
span.setSpan(new ForegroundColorSpan(Color.parseColor("#FF00BFFF")), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
changeTextView.setText(span);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/test"
android:bufferType="spannable"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
res -> values -> strings
strings.xml
<resources>
<string name="app_name">StringColorChangeTest</string>
<string name="test">If your app offers functionality that might require access to restricted data or restricted actions, determine whether you can get the information or perform the actions without needing to declare permissions. You can fulfill many use cases in your app, such as taking photos, pausing media playback, and displaying relevant ads, without needing to declare any permissions.</string>
<string name="change">you can get the information or perform the actions without needing to declare permissions</string>
</resources>
strings.xml(ko-rKR)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">StringColorChangeTest</string>
<string name="test">앱에서 제한된 데이터나 제한된 작업에 액세스해야 할 수 있는 기능을 제공한다면 권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인하세요. 개발자는 권한을 선언하지 않고도 사진 찍기, 미디어 재생 일시중지, 관련 광고 표시 등 앱에서 여러 사용 사례를 처리할 수 있습니다.</string>
<string name="change">권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인</string>
</resources>
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오 자바] Spinner 여러 개 사용 시, 코드 줄이는 방법 (0) | 2022.08.31 |
---|---|
[안드로이드 스튜디오 자바] CheckBox로 약관동의 만들기, Fragment에서 CheckBox (0) | 2022.08.31 |
[안드로이드 스튜디오] ViewBinding 사용 자바, 코틀린 코드 비교 (0) | 2022.08.19 |
[안드로이드 스튜디오 코틀린] OkHttp버전에 따른 JsonObject 사용법 (1) | 2022.07.27 |
[안드로이드 스튜디오 코틀린] JavaScript와 연결해주는 Android Bridge - Kotlin 정리 (0) | 2022.06.28 |