如何在动态创建的Android TextView中更新文本?

时间:2019-02-19 22:57:30

标签: android

我是Android开发的新手,需要我快速开发简单的应用程序。我需要动态生成views的列表,并在每个列表中使用计时器,所以我当前的代码如下:

public class MainActivity extends AppCompatActivity {
    private List<TextView> times = new ArrayList<>();
    private Handler handler;

    private void initWatchlist() {
        LinearLayout line = new LinearLayout(this);
        line.setOrientation(LinearLayout.HORIZONTAL);

        TextView time = new TextView(this);
        time.setText(sdf.format(new Date()));
        time.setTextSize(32);
        line.addView(time);
        times.add(time);

        //add couple of other views to line
        //...

        LinearLayout watchlist = findViewById(R.id.watchlist);
        watchlist.addView(line);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initWatchlist();

        Thread thread = new Thread(){
            private Calendar previousDate = Calendar.getInstance();
            public void run(){
                if (previousDate.get(Calendar.MINUTE) != Calendar.getInstance().get(Calendar.MINUTE)) {
                    for (TextView textView : times) {
                        textView.setText(sdf.format(new Date()));
                    }
                }
            }
        };

        handler = new Handler();
        handler.post(thread);
    }

    //other code
}

所以问题是我的Thread似乎实际上什么都没做。我没有看到自己的textviews更新时间。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

要更新UI,您需要在主线程上运行代码。一种方法是创建一个使用MainLooper的处理程序,如下所示

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

由于您处于活动状态,因此也可以使用https://github.com/atwwei/ngx-dfp/blob/master/src/app/page/page.component.html#L14

答案 1 :(得分:0)

我很傻。我的线程实际上很快完成了,因为它不包含while(true){}之类的东西。

通过在我的thread.run()函数中添加额外的handler.postDelayed(thread,1000)解决了该问题。