[英]Can the text of an Android TextView be set outside of the onCreate() method?
我正在嘗試使用以下功能在Android應用程序中設置TextView的文本:
@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來獲取用戶的唯一ID,該ID作為字符串返回。 經過一些調試后,我意識到不能在onCreate()
方法之外更改TextView
的內容。 但是,需要stateChanges
參數,該參數僅存在於onOSSubscriptionChanged
。 有什么辦法可以解決這個問題?
編輯:錯誤是在其他地方。 stateChanges.getTo().getUserId()
返回null
。
您需要在UI線程上進行設置
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);
您需要在onCreateView()
方法中初始化textview
,此后,只要您在UI線程中,就textView
幾乎任何地方使用該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);
}
嘗試這個
runOnUiThread(new Runnable(){
@override
public void run() {
playerIdView.setText(stateChanges.getTo().getUserId());
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.