Создание многоязычного приложения на Java. Получение ошибки при вставке значения String из R.string
XML-файла ресурса:
public static final String TTT = (String) getText(R.string.TTT);
Это сообщение об ошибке:
Ошибка: невозможно создать статическую ссылку на нестатический метод getText (int) из типа Context
Как это вызвано и как я могу это решить?
getString()
когда они вам нужны. Таким образом, ваше приложение правильно адаптируется к изменению пользователем выбранного языка.Ответы:
Поскольку
getText()
он нестатичен, вы не можете вызвать его из статического метода.Чтобы понять почему, вы должны понимать разницу между ними.
Экземплярные (нестатические) методы работают с объектами определенного типа (класса). Они создаются с помощью нового, например:
Чтобы вызвать метод экземпляра, вы вызываете его в instance (
myObject
):Однако статический метод / поле может быть вызван только для типа напрямую, скажем так:Предыдущий оператор неверен. Можно также ссылаться на статические поля со ссылкой на объект, например,myObject.staticMethod()
но это не рекомендуется, потому что это не дает понять, что они являются переменными класса.И они не могут работать вместе, поскольку работают с разными пространствами данных (данные экземпляра и данные класса).
Позвольте мне попытаться объяснить. Рассмотрим этот класс (псевдокод):
Теперь у меня есть следующий вариант использования:
Какие ценности?
Хорошо
Другими словами,
TTT
это данные, общие для всех экземпляров типа. Так что нет смысла говоритьВозникает вопрос, почему TTT статический или почему getText () не статический?
Удалите,
static
и эта ошибка должна исчезнуть, но, не понимая, что делает ваш шрифт, это всего лишь липкая пластырь до следующей ошибки. Каковы требованияgetText()
, чтобы он был нестатичным?источник
Уже есть несколько хороших ответов с объяснением того, почему смесь нестатических
Context
методовgetText()
не может использоваться с вашимstatic final String
.Хороший вопрос: почему вы хотите это сделать? Вы пытаетесь загрузить
String
из своегоstrings
ресурса и ввести его значение вpublic static
поле. Я предполагаю, что это так, что некоторые из ваших других классов могут получить к нему доступ? Если да, то в этом нет необходимости. Вместо этого передайтеContext
в другие классы и вызывайтеcontext.getText(R.string.TTT)
из них.И вызвать это из своего
Activity
:Это позволит вам получить доступ к вашему
String
ресурсу без необходимости использоватьpublic static
поле.источник
String a[] = context.getTextArray(R.array.myStringArray);
; однако это дает мне ошибкуThe method getTextArray(int) is undefined for the type Context
- почему он должен быть undefined, если он работает с getText?Context
нет вызываемого методаgetTextArray
, но он естьgetText
. Возможно, вы думаете о том,Resources
что естьgetTextArray
для других, которые находят это в поиске:
Я часто получаю это, когда случайно вызываю функцию, используя имя класса, а не имя объекта. Обычно это происходит потому, что я даю им слишком похожие имена: P
то есть:
Очевидно, что это статический метод. (кое-что хорошо) Но то, что я действительно хотел сделать (в большинстве случаев было)
Это такая глупая ошибка, но каждые пару месяцев я трачу около 30 минут на возню с vars в определениях «MyClass», чтобы выяснить, что я делаю не так, хотя на самом деле это просто опечатка.
Забавное примечание: переполнение стека подчеркивает синтаксис, чтобы сделать ошибку здесь действительно очевидной.
источник
Вы можете сделать свою переменную нестатической
или сделайте метод getText статическим (если это вообще возможно)
источник
getText является членом вашей Activity, поэтому он должен вызываться, когда существует "this". Ваша статическая переменная инициализируется, когда ваш класс загружается до создания вашей Activity.
Поскольку вы хотите, чтобы переменная инициализировалась из строки ресурса, она не может быть статической. Если вы хотите, чтобы он был статическим, вы можете инициализировать его значением String.
источник
Вы не можете ссылаться на статическую переменную из нестатического метода. Чтобы понять это, вам нужно понять разницу между статикой и нестатикой.
Статические переменные - это переменные класса, они принадлежат классу с их единственным экземпляром, созданным только первым. Нестатические переменные инициализируются каждый раз, когда вы создаете объект класса.
Теперь, переходя к вашему вопросу, когда вы используете оператор new (), мы будем создавать копию каждого нестатического поля для каждого объекта, но это не относится к статическим полям. Вот почему он дает ошибку времени компиляции, если вы ссылаетесь на статическую переменную из нестатического метода.
источник
Этот вопрос не нов, и существующие ответы дают хорошую теоретическую основу. Я просто хочу добавить более прагматичный ответ.
getText - это метод абстрактного класса Context, и для его вызова нужен экземпляр его подкласса (Activity, Service, Application или другой). Проблема в том, что общедоступные статические конечные переменные инициализируются до создания любого экземпляра Context.
Есть несколько способов решить эту проблему:
источник