Android TextView : "setText로 표시된 텍스트 연결 안 함"
setText()를 사용하여 텍스트를 설정하는 방법은 다음과 같습니다.
prodNameView.setText("" + name);
prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" + new BigDecimal(price).setScale(2, RoundingMode.UP)));
첫번째는 단순한 사용이고 두번째는 텍스트를 포맷 텍스트로 설정하는 것입니다.
Android Studio가 너무 재미있어요, 메뉴를 사용해봤는데 위의 두 줄에 대한 제안을 받았습니다.
setText와 함께 표시되는 텍스트를 연결하지 마십시오.플레이스홀더와 함께 리소스 문자열을 사용합니다.덜...(Ctrl+F1)
TextView#set 호출 시텍스트:
- Number# toString()을 호출하여 형식 번호를 지정하지 마십시오. 이 경우 분수 구분자와 로케일별 숫자를 제대로 처리할 수 없습니다.대신 적합한 형식 사양(%d 또는 %f)이 있는 String# 형식을 사용해 보십시오.
- 문자열 리터럴(예: "Hello")을 전달하여 텍스트를 표시하지 마십시오.하드코딩된 텍스트는 다른 언어로 제대로 번역할 수 없습니다.대신 Android 리소스 문자열을 사용하는 것을 고려해 보십시오.
- 텍스트 청크를 연결하여 메시지를 작성하지 마십시오.이러한 메시지는 제대로 번역할 수 없습니다.
내가 이걸 위해 무엇을 할 수 있을까요?누구든지 그것이 무엇인지 그리고 제가 무엇을 해야 하는지 설명을 도와줄 수 있습니까?
리소스에 getString의 오버로드 버전이 있으며 이 버전은 다음과 같습니다.varargs
활자의Object
: getString(int, java.lang).개체...).strings.xml에서 문자열을 올바르게 설정한 경우 올바른 자리 표시자를 사용하여 이 버전을 사용하여 최종 문자열의 형식화된 버전을 검색할 수 있습니다.예.
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
getString(R.string.welcome_message, "Test", 0);
Android는 문자열을 반환합니다.
"Hello Test! you have 0 new messages"
대해서 setText("" + name);
당신의 첫번째 예는,prodNameView.setText("" + name);
말이 안 돼요 TextView는 null할 수 .TextView는 null 값을 처리할 수 있습니다.이름이 null이면 텍스트가 그려지지 않습니다.
수락한 답변에서 %1$s 및 %2$d와 혼동하지 마십시오.여기 몇 가지 추가 정보가 있습니다.
- 형식 지정자는 다음 구문일 수 있습니다.
%[
argument_index
$]format_specifier
- 옵션인 argument_index는 "%" 뒤에 "$"로 끝나는 숫자로 지정되며 인수 목록에서 지정된 인수를 선택합니다.첫 번째 인수는 "1$", 두 번째 인수는 "2$" 등으로 참조됩니다.
- 필수 형식 지정자는 인수의 형식 지정 방법을 나타내는 문자입니다.지정된 인수에 대한 유효한 변환 집합은 인수의 데이터 유형에 따라 달라집니다.
예
회색 부분을 프로그래밍 방식으로 삽입한 다음과 같은 형식의 문자열을 생성합니다.
안녕하세요.
Test
! 당신이 가지고 계신0
새 메시지
당신의.string resource
:
"welcome_">< "welcome_">안녕하세요.
%1$s
! 당신은 가지고 있습니다.%2$d
>지 </string >
하라구요.string substitution
아래에 제시된 바와 같이:
getString(R)).문자열).welcome_message,
"Test"
,0
);
참고:
- %1$s이(가) "테스트" 문자열로 대체됩니다.
- %2$d는 문자열 "0"으로 대체됩니다.
같은 보풀 오류 메시지를 우연히 발견하고 이런 식으로 해결했습니다.
처음에 내 코드는:
private void displayQuantity(int quantity) {
TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
quantityTextView.setText("" + quantity);
}
다음 오류가 발생했습니다.
Do not concatenate text displayed with setText. Use resource string with placeholders.
그래서 제가 추가를 해봤습니다.strings.xml
<string name="blank">%d</string>
제 첫번째 "" + 제 번호(수량)의 자리 표시자입니다.
참고: 내quantity
variable은 이전에 정의된 것으로 문자열에 추가하고자 했던 것입니다.결과적으로 나의 코드는
private void displayQuantity(int quantity) {
TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
quantityTextView.setText(getString(R.string.blank, quantity));
}
이 일이 있은 후로, 저의 실수는 사라졌습니다.앱의 동작은 변하지 않았고 내 수량은 보풀 오류 없이 지금 내가 원하는 대로 계속 표시되었습니다.
setText() 메서드 안에 텍스트를 연결하지 말고 String에서 원하는 것을 연결하고 해당 String 값을 setText() 메서드 안에 넣습니다.
ex: 올바른 방법
int min = 120;
int sec = 200;
int hrs = 2;
String minutes = String.format("%02d", mins);
String seconds = String.format("%02d", secs);
String newTime = hrs+":"+minutes+":"+seconds;
text.setText(minutes);
setText()를 다음과 같이 연결하지 마십시오.
text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));
이 스레드를 확인하고 이 스레드와 같은 자리 표시자를 사용해야 합니다(테스트되지 않음).
<string name="string_product_rate_with_ruppe_sign">Price : %1$d</string>
String text = String.format(getString(R.string.string_product_rate_with_ruppe_sign),new BigDecimal(price).setScale(2, RoundingMode.UP));
prodOriginalPriceView.setText(text);
화내지 마요, 너무 간단해요.
String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
mytextview.setText(result);
문제는 당신이 돈을 내고 있기 때문입니다.""
모든 줄의 맨 처음에
lint는 전달되는 인수를 검색합니다.setText
다음과 같은 경고가 관련된 경우 경고를 생성합니다.
텍스트 청크를 연결하여 메시지를 작성하지 마십시오.이러한 메시지는 제대로 번역할 수 없습니다.
모든 문자열을 연결할 때""
.
전달 중인 인수가 이미 텍스트이므로 이 연결을 제거합니다.또한 사용할 수 있습니다..toString()
당신의 문자열을 연결하는 대신에 다른 곳이 필요하다면.""
String으로 고쳤습니다.체재를 갖추다
다음을 위하여:
textViewAddress.setText("Address"+address+"\n"+"nCountry"+"\n"+"City"+"city"+"\n"+"State"+"state")
다음:
textViewAddress.setText(
String.format("Address:%s\nCountry:%s\nCity:%s\nState:%s", address, country, city, state));
이걸 쓰면 돼요, 저한테 효과가 있어요.
title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));
prodNameView.setText("" + name); //this produce lint error
val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);
리소스에 액세스할 수 없고 Kotlin을 사용하는 경우와 유사한 경우 다음을 수행할 수 있습니다.
val v = "hello"
"placeholder $v placeholder".let {
textView.text = it
}
i18n을 지원할 필요가 없는 경우 Android Studio에서 이 보풀 검사를 비활성화할 수 있습니다.
파일 -> 설정 -> 편집기 -> 검사 -> 안드로이드 -> 보풀 -> TextView 국제화 (불체크)
답변이 너무 늦었지만 우선 변수에 데이터를 저장한 다음 변수 이름을 입력하면 될 것 같습니다. 예:-
// Java syntax
String a = ("" + name);
String b = "" + String.format(getString(R.string.string_product_rate_with_ruppe_sign);
String c = "" + new BigDecimal(price).setScale(2, RoundingMode.UP));
prodNameView.setText(a);
prodOriginalPriceView.setText(b, c);
textView인 경우 editText에서 myTextView.text = ("Hello World")를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/33164886/android-textview-do-not-concatenate-text-displayed-with-settext
'bestsource' 카테고리의 다른 글
이미지 또는 스팬 태그를 사용하지 않고 CSS를 통해 UL/LI HTML 목록에서 Bullet 색상을 설정하는 방법 (0) | 2023.10.26 |
---|---|
CORS - httprequest를 '사전 비행'하려면 어떻게 해야 합니까? (0) | 2023.10.26 |
파이썬에서 데이터베이스 연결 풀링을 위한 가장 좋은 솔루션은 무엇입니까? (0) | 2023.10.26 |
ng-required vs required 사용 (0) | 2023.10.26 |
페이지 변경 청취자에서 페이지 설정 보기 더 이상 사용되지 않음 (0) | 2023.10.26 |