Как объединить строку с XML-строками с setText и значениями, поступающими из представления

#android

#Android

Вопрос:

Я видел много вопросов и ответов в stack по этому поводу, но по какой-то причине они не работают в моем случае.

Я думаю, это может быть потому, что я работаю с элементами из представления напрямую.

Этот код работает;

 public class MainActivity extends AppCompatActivity {

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

    public void btnOnClickRegister(View view){
     TextView txtEmail = findViewById(R.id.txtEmail);
     EditText edtTxtEmail = findViewById(R.id.edtTxtEmail);
     txtEmail.setText("Email "  edtTxtEmail.getText().toString()); //hardcoded and will not translate
    }
}
  

В strings.xml;

 <string name="email">Email</string>
  

Я получаю следующее предупреждение;

Не объединяйте отображаемый текст с setText. Используйте строку ресурса с заполнителями.

Большинство вопросов и ответов решают это следующим образом;

 getString(R.string.email, VarContainingEmail);
  

с XML, который выглядит следующим образом;

 <string name="email">Email %s</string>
  

Если я попытаюсь это сделать, я получу следующее предупреждение;

Не удается разрешить метод ‘getString’ в ‘TextView’

Я только начинаю с Android studio и хотел бы решить эту проблему с самого начала.

Я использую Android Studio версии 4.0.1

Ответ №1:

Пожалуйста, попробуйте один раз таким образом, дайте мне знать, если не сработает

 <string name="email">Email, %1$s!</string>
  
 txtEmail.setText(getString(R.string.email, edtTxtEmail.getText().toString()));
  

Комментарии:

1. Я так и думал, но я получаю; Строка формата ’email’ не является допустимой строкой формата, поэтому ее не следует передавать в String.format

2. можете ли вы показать, как вы на самом деле пытаетесь использовать этот подход?

3. Я понял! Мне пришлось обновить все значения в файле res. Я обновлял только один, поэтому некоторые из них были недопустимой строкой. После обновления всех языков ошибка была исправлена.

4. Точно, @MadeInDreams пожалуйста, покажите, какие изменения вы внесли в код. Также укажите, находится ли этот код внутри фрагмента или действия. Если фрагмент используется getContext() для вызова getString() . Если activity использует this для вызова getString()

Ответ №2:

Возможно, вам потребуется использовать контекст, чтобы получить доступ к getString:

 context.getString(R.string.email, VarContainingEmail);
  

где может быть контекст this , если вы находитесь в activity

Редактировать: Итак, если вы находитесь в представлении, допустим, это представление является переменной view , вы можете использовать: view.getContext().getString(R.string.email, VarContainingEmail);

Комментарии:

1. Как мне объявить эту переменную и присвоить ей значение в моем контексте? Эта переменная не существует в моем контексте, потому что я считываю значение из представления.

2. в этом случае вы можете получить доступ к контексту, используя: view.getContext() , Я отредактировал свой ответ. Ваше представление может быть доступно с помощью this , в этом случае вы могли бы использовать this.getContext()