0

我已经建立了我的视图,并且一切都运行良好,除非我去更新显示的文本视图。

我正在使用 windowmanager.addView() 方法来为视图翻转器充气。翻转器中的一个视图包含一个文本视图。我想更新这个 textview,虽然这似乎是不可能的。

public void updateTextView(String inString) {
    TextView t = (TextView) findViewById(R.id.status);
    t.setText(inString);

    Log.d("INCOMING String IS FROM THIS!",
            inString + " : " + t.getText());
    flippy.setDisplayedChild(1);

}

日志消息显示 textview 具有正确的值,但实际视图本身仍显示 xml 中编码的默认字符串。

这是我尝试过的一些事情。

postInvalidate(); 无效();发布一个调用 invalidate 的新可运行文件。WindowManager.updateViewLayouts();

我有点茫然,关于如何让这个文本视图显示我的价值观的任何想法?

4

1 回答 1

0

你可以这样做:

WeakReference<ServiceClass> weakServ = new WeakReference<>(this);
volatile Handler uiH;
volatile TextView your_text_view;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    uiH = new Handler();
    ...
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View mainView = inflater.inflate(R.layout.activity_main, null);
    wm.addView(mainView)
    your_text_view = mainView.findViewById(R.id.your_text_view_id);
    your_text_view.setText("original text");
    ...
    yourUpdateTask();
}

void updateText(text) {
    //simulate runOnUiThread of activity to solved the problem
    uiH.post(new Runnable() { 
        @Override
        public void run() {
            your_text_view.setText(text);
        }
    });
}

void yourUpdateTask() {
    //timer is just an example to reproduce the problem
    final Timer t = new Timer();
    final TimerTask tt = new TimerTask() { 
        @Override
        public void run() { //has problem to update your_text_view with new string
               ...
               ServiceClass yourServ = weakServ.get();
               if (yourServ!= null) {
                   yourServ.updateText(new_text);
               }
           }
        }
    };
    t.scheduleAtFixedRate(tt, 0, 1000); //run every 1 second
}
于 2019-03-21T09:03:36.293 回答