Android TextView : "setText로 표시된 텍스트를 연결하지 마십시오"


136

다음과 같은 방법으로 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는 매우 흥미 롭습니다. 메뉴를 사용 Analyze -> Code Cleanup했으며 두 줄 이상에 대한 제안을 받았습니다.

여기에 이미지 설명을 입력하십시오

setText로 표시된 텍스트를 연결하지 마십시오. 자리 표시 자와 함께 리소스 문자열을 사용하십시오. 이하 ... (Ctrl + F1)

TextView # setText를 호출 할 때 :

  • Number # toString ()을 호출하여 숫자를 형식화하지 마십시오. 분수 구분 기호 및 로캘 별 숫자를 올바르게 처리하지 못합니다. 대신 적절한 형식 지정 (% d 또는 % f)과 함께 String # format을 사용하십시오.
  • 텍스트를 표시하기 위해 문자열 리터럴 (예 : "Hello")을 전달하지 마십시오. 하드 코드 된 텍스트는 다른 언어로 올바르게 번역 될 수 없습니다. 대신 Android 리소스 문자열을 사용해보십시오.
  • 텍스트 청크를 연결하여 메시지를 작성하지 마십시오. 이러한 메시지는 제대로 번역 할 수 없습니다.

내가 이것을 위해 무엇을 할 수 있습니까? 누구나 무엇이 무엇이고 어떻게해야하는지 설명 할 수 있습니까?


1
즉, 당신은 단지 통과해야 String로를 setText(). 예 : setText(name)대신 setText("" + name). 텍스트를 연결하면 메시지 알림으로 하드 코드 된 텍스트를 사용하는 것처럼 번역되지 않습니다
Mr Neo

그러나 줄 것이다 NPE경우 name입니다NULL
Pratik Butani

기능 을 사용하기 전에 점검 name하지 마십시오 . NULLsetText()
Mr Neo

2
문자열 리소스에 값을 연결하지 말고 대신 문자열 리소스에 자리 표시자를 사용하십시오. 따라서 string.xml에서 수행하는 작업 <string name="string_product_rate_with_ruppe_sign">Something %1$d</string> 및 Java 코드에서 다음과 같은 작업을 수행합니다. prodOriginalPriceView.setText(getString(R.string.string_product_rate_with_ruppe_sign), price); (xml 파일에서 형식을 지정할 수 있습니다. [ developer.android.com/guide/topics/resources/…
CodeBreakers

답변:


294

자원이 소요에서 getString 가져 오기 오버로드 버전은 varargs유형을 Object: 에는 getString (INT, java.lang.Object 상위를 ...) . 올바른 자리 표시 자와 함께 strings.xml에 문자열을 올바르게 설정 한 경우이 버전을 사용하여 최종 문자열의 형식화 된 버전을 검색 할 수 있습니다. 예 :

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

사용 getString(R.string.welcome_message, "Test", 0);

안드로이드는

 "Hello Test! you have 0 new messages"

setText("" + name);

첫 번째 예 prodNameView.setText("" + name);는 나에게 이해가되지 않습니다. TextView는 null 값을 처리 할 수 ​​있습니다. name이 null이면 텍스트가 그려지지 않습니다.


1
BigDecimal에서 float 값을 호출한다고 가정합니다. %1$fstrings.xml에서 문자열에 추가 한 후setText(getString(R.string.string_product_rate_with_ruppe_sign, new BigDecimal(price).setScale(2, RoundingMode.UP).floatValue() ));
Blackbelt

그것은 대답의 두 번째 부분에 있습니다. 보세요
Blackbelt

Integer를 보여주고 싶습니다 .String은 $ s와 Decimal $ d를 나타냅니다. 정수는?
reegan29

"자리 표시 자"를 의미하는 경우을 사용할 수 있습니다 %1$d. @ reegan29
Blackbelt

3
형식 유형을 나열하는 API를 찾는 사람은 developer.android.com/reference/java/util/Formatter#syntax
Brent Sandstrom

34

허용되는 답변에 % 1 $ s% 2 $ d 을 (를) 혼동하지 마십시오 . 여기에 몇 가지 추가 정보가 있습니다.

  • 형식 지정자는 다음 구문 일 수 있습니다.

% [ argument_index$]format_specifier

  1. 옵션 argument_index 는“%”다음에“$”로 끝나는 숫자로 지정되며 인수 목록에서 지정된 인수를 선택합니다. 첫 번째 인수는 "1 $"로 , 두 번째 인수는 "2 $" 등으로 참조됩니다 .
  2. 필요한 형식 지정 자는 인수의 형식을 지정 하는 방법을 나타내는 문자입니다. 주어진 인수에 대한 유효한 변환 세트는 인수의 데이터 유형 에 따라 다릅니다 .

회색 부분이 프로그래밍 방식으로 삽입되는 다음 형식의 문자열을 만듭니다.

여보세요 Test ! 당신은 0새 메시지

당신의 string resource:

<string name = "welcome_messages"> 안녕하세요 %1$s! 당신이 %2$d새로운 메시지를 </ 문자열>

를 수행 string substitution아래에 주어진 :

에는 getString (R.string.welcome_message, "Test", 0);

노트 :

  • % 1 $ s는 문자열 "Test"로 대체됩니다.
  • % 2 $ d는 문자열 "0"으로 대체됩니다.

16

나는 같은 보푸라기 오류 메시지에 부딪쳐서이 방법으로 해결했습니다.

처음에 내 코드는 다음과 같습니다

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변수는 이전에 정의되었으며 문자열에 추가하고 싶습니다. 결과적으로 내 코드는

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText(getString(R.string.blank, quantity));
}

그 후 내 오류가 사라졌습니다. 앱의 동작은 변경되지 않았으며 보풀 오류없이 원하는대로 수량이 계속 표시되었습니다.


10

스레드를 확인 하고 테스트되지 않은 자리 표시자를 사용해야합니다.

<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);

10

setText () 메소드 내부에 텍스트를 연결하지 마십시오 . String 에서 원하는 것을 연결하고 해당 String 값을 setText () 메소드에 넣으십시오 .

예 : 올바른 방법

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));

왜? 어떤 장점이 다른 장점이 있습니까?
Fureeish

4

문제는 ""모든 문자열의 시작 부분에 추가하기 때문 입니다.

lint는 전달되는 인수를 스캔 setText하고 경고를 생성합니다.

텍스트 청크를 연결하여 메시지를 작성하지 마십시오. 이러한 메시지는 제대로 번역 할 수 없습니다.

를 사용하여 모든 문자열을 연결합니다 "".

전달하는 인수가 이미 텍스트이므로이 연결을 제거하십시오. 또한 .toString()문자열을 연결하는 대신 다른 곳에서 필요한 경우 사용할 수 있습니다.""


0

i18n을 지원할 필요가없는 경우 Android Studio에서이 보푸라기 검사를 비활성화 할 수 있습니다

파일-> 설정-> 편집기-> 검사-> Android-> Lint-> TextView 국제화 (선택 취소)


0

당신은 이것을 사용할 수 있습니다, 그것은 나를 위해 작동합니다

title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));

0
prodNameView.setText("" + name); //this produce lint error

val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);

-1

화내 지마 너무 간단 해

String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
            mytextview.setText(result);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.