Как получить доступ к значению TextView внутри раздутого макета

Мне нужно иметь доступ к двойнику в «квоте» текстового просмотра, чтобы выполнить с ним некоторые математические операции. Проблема в том, что я получаю ошибку в строке, где предполагается получить значение. Это может быть связано с тем, что текстовое представление находится в раздутом макете, я не уверен.

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

Поиск textview в основном классе, называя его квотой

quota = findViewById(R.id.textView_dailyData_BricksQuota);

Найдя текстовое представление в классе адаптера, назвав его dataBricksQuota, вместо этого попытался вызвать это в основном классе, но не работает

TextView dataBricksQuota = view.findViewById(R.id.textView_dailyData_BricksQuota); 

dataBricksQuota.setText(String.valueOf(project.getBricksQuota()));

Проблема возникает в первой строке этого оператора if, где я пытаюсь получить значение текстового представления в основном классе.

if (projectDay >= 2) {

    String currentBrickQuota = quota.getText().toString();

    double currentBrickQuotaDouble = Double.parseDouble(currentBrickQuota);

    double averageBrickRunningQuota = ((2 * currentBrickQuotaDouble + averageBricksNDatabase) / projectDay);
    String sql = "UPDATE activeProjectsTable SET averageBricks = ? WHERE ProjectId = (SELECT MAX(ProjectId) FROM activeProjectsTable)";
    AusWideDatabase.execSQL(sql, new Double[] {
        averageBrickRunningQuota
    });
}

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

Ошибка

Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:7333) 
    at android.widget.TextView.performClick(TextView.java:14160) 
    at android.view.View.performClickInternal(View.java:7299) 
    at android.view.View.access$3200(View.java:846) 
    at android.view.View$PerformClick.run(View.java:27774) 
    at android.os.Handler.handleCallback(Handler.java:873) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:6981) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
    at com.auswide.auswideapp.dailyData.LoadEodChecklist(dailyData.java:145)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
    at android.view.View.performClick(View.java:7333) 
    at android.widget.TextView.performClick(TextView.java:14160) 
    at android.view.View.performClickInternal(View.java:7299) 
    at android.view.View.access$3200(View.java:846) 
    at android.view.View$PerformClick.run(View.java:27774) 
    at android.os.Handler.handleCallback(Handler.java:873) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:6981) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

убедитесь, что идентификатор существует в раздутом макете.

John Joe 15.05.2019 05:08

Переменная quota не получает правильную ссылку, поэтому проверьте, присутствует ли textView_dailyData_BricksQuota в соответствующем макете.

Molly 15.05.2019 06:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

Вы можете сделать это, если передадите контекст своего основного класса. Код будет следующим

TextView textView = ((Activity)context).findViewById(R.id.yourTextView); // -> context must be context of your main class
textView.setText("Hello world"); // -> textView variable is not null, so it will assign text to textView

Другим способом было бы раздувание всего макета, но я не нахожу это полезным в этом случае.

Ура, это сработало. Мне было интересно, имеет ли это какое-то отношение к контексту. И проходить его сейчас имеет смысл.

Astrazo 18.05.2019 10:58

Другие вопросы по теме