使用WindowManager.addView()并更新TextView

时间:2013-07-10 18:27:59

标签: java android textview window-managers

我的视图已经构建完毕,一切正常,除非我去更新显示的文本视图。

我使用windowmanager.addView()方法来扩展视图翻转器。 fliper中的一个视图包含textview。我想更新这个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的新runnable。 WindowManager.updateViewLayouts();

我有点失落,关于如何让这个textview显示我的价值观的任何想法?

1 个答案:

答案 0 :(得分: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
}