Можно ли установить текст Android TextView вне метода onCreate ()?

Я пытаюсь установить текст TextView в своем приложении для Android, используя следующую функцию:

@Override
public void onOSSubscriptionChanged(OSSubscriptionStateChanges stateChanges) {
    if (!stateChanges.getFrom().getSubscribed() && stateChanges.getTo().getSubscribed()) {
        new AlertDialog.Builder(this)
                .setMessage("You have successfully subscribed to push notifications!")
                .show();
        // Get player ID and output to Main Activity
        TextView playerIdView = findViewById(R.id.playerIdView);
        playerIdView.setText(stateChanges.getTo().getUserId());
    }

    Log.i("Debug", "onOSPermissionsChanged: " + stateChanges);
}

При этом OneSignal API используется для получения уникального идентификатора пользователя, который возвращается в виде строки. После некоторой отладки я понял, что содержимое TextView не может быть изменено вне метода onCreate(). Однако требуется параметр stateChanges, который существует только в onOSSubscriptionChanged. Есть ли способ обойти это?

Обновлено: ошибка была в другом месте. stateChanges.getTo().getUserId() возвращал null.

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

Nagendra Hari Karthick 06.07.2018 13:12

Конечно может, рекомендую пройти жизненный цикл деятельности.

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

Ответы 3

Вам нужно установить его в потоке пользовательского интерфейса

playerIdView.post(new Runnable() {
    public void run() {
       playerIdView.setText(stateChanges.getTo().getUserId());
    } 
});

или же

Handler mainHandler = new Handler(Looper.getMainLooper());

Runnable myRunnable = new Runnable() {
    @Override 
    public void run() {
       playerIdView.setText(stateChanges.getTo().getUserId());} 
    };
mainHandler.post(myRunnable);

И вам нужно вызвать findViewById() из класса, расширяющего Activity (или любого класса, у которого есть findViewById()).

SynAck 06.07.2018 13:20

@Ali, если onOSSubscriptionChanged содержится в классе активности, то нет.

Anton A. 06.07.2018 13:21

@Bravewave, с чем вы сталкиваетесь, когда пробуете это?

Anton A. 06.07.2018 13:30

@AntonA. прощение?

Bravewave 06.07.2018 13:31

ошибка была в другом месте. stateChanges.getTo().getUserId() возвращал null

Bravewave 06.07.2018 13:39

вам нужно инициализировать ваш textview в вашем методе onCreateView(), и после этого вы можете использовать этот textView практически где угодно, пока вы находитесь в потоке пользовательского интерфейса. Так что измените свой код на ниже:

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

TextView playerIdView;

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

  playerIdView = findViewById(R.id.playerIdView);   

}

а затем в вашем методе onSSubscription просто сделайте следующее:

 @Override
public void onOSSubscriptionChanged(OSSubscriptionStateChanges stateChanges) {
    if (!stateChanges.getFrom().getSubscribed() && stateChanges.getTo().getSubscribed()) {
        new AlertDialog.Builder(this)
                .setMessage("You have successfully subscribed to push notifications!")
                .show();
        // Get player ID and output to Main Activity
        playerIdView.setText(stateChanges.getTo().getUserId());
    }

    Log.i("Debug", "onOSPermissionsChanged: " + stateChanges);
}

Текст все еще не обновляется. TextView удален глобально

Bravewave 06.07.2018 13:30

ошибка была в другом месте. stateChanges.getTo().getUserId() возвращал null

Bravewave 06.07.2018 13:39

@Bravewave, тогда проблема не в вашем текстовом представлении, а в getUserId()

Umair 06.07.2018 13:42

Попробуй это

    runOnUiThread(new Runnable(){
        @override
        public void run() {
            playerIdView.setText(stateChanges.getTo().getUserId());
        }
    })

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