Я пытаюсь установить текст 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.
Конечно может, рекомендую пройти жизненный цикл деятельности.




Вам нужно установить его в потоке пользовательского интерфейса
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()).
@Ali, если onOSSubscriptionChanged содержится в классе активности, то нет.
@Bravewave, с чем вы сталкиваетесь, когда пробуете это?
@AntonA. прощение?
ошибка была в другом месте. stateChanges.getTo().getUserId() возвращал null
вам нужно инициализировать ваш 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 удален глобально
ошибка была в другом месте. stateChanges.getTo().getUserId() возвращал null
@Bravewave, тогда проблема не в вашем текстовом представлении, а в getUserId()
Попробуй это
runOnUiThread(new Runnable(){
@override
public void run() {
playerIdView.setText(stateChanges.getTo().getUserId());
}
})
Попробуйте использовать текстовое представление внутри runonUIthread. Если не сработало, поделитесь журналами