在Android中逐字显示一个字符串到TextView上

8

我有这段代码:

public void setText(String s){
    TextView tv= (TextView)HomeActivity.tf.getView().findViewById(R.id.textViewFragment);


    char c;
    for(int i=0; i< s.length(); i++){
        c= s.charAt(i);

        tv.append(String.valueOf(c));

        try{
            Thread.sleep(100);
        }catch(Exception e){}
    }
}

问题在于我无法让TextView逐个显示字母。循环完成并执行所有操作后,文本才会显示出来。 我希望它可以逐个显示字母,为TextView添加动画效果。

尝试使用 tv.setText(String.valueOf(c)) - GIRIDHARAN
那对我没用。我使用append()是因为我想让之前的字符保留下来。我想要在每个append之间刷新屏幕。 - Plasius
然后获取先前的文本并将其附加到“tv.setText(tv.getText()。toString()+ String.valueOf(c))”这样的内容。 - GIRIDHARAN
我已经尝试过了,但它不起作用。 - Plasius
我已经在这里找到了这个问题的答案。 [在这里找到了解决方案](https://dev59.com/j2w15IYBdhLWcg3wT55c) - Krishna Satwaji Khandagale
我在这里找到了你问题的答案。链接地址 - Krishna Satwaji Khandagale
3个回答

6

这段代码有效。

    public void setText(final String s)
    {
    TextView tv= (TextView)HomeActivity.tf.getView().findViewById(R.id.textViewFragment);
    final int[] i = new int[1];
    i[0] = 0;
    final int length = s.length();
    final Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            char c= s.charAt(i[0]);
            Log.d("Strange",""+c);
            tv.append(String.valueOf(c));
            i[0]++;
        }
    };

    final Timer timer = new Timer();
    TimerTask taskEverySplitSecond = new TimerTask() {
        @Override
        public void run() {
            handler.sendEmptyMessage(0);
            if (i[0] == length - 1) {
                timer.cancel();
            }
        }
    };
    timer.schedule(taskEverySplitSecond, 1, 500);
}

直接使用这个方法,只需要在你的 onCreate() 中调用它即可。 - Parag Kadam
好的,知道了。干杯 :) - Parag Kadam

1

如果有人仍在寻找更好的解决方案(带有字母动画),可以试试淡入TextView

这个TextView库直接继承自原生的TextView类,这意味着支持所有原生的TextView方法,包括多行支持。它还具有一些自己的方法和属性,可以完全控制View。


1
更简单
Thread thread = new Thread() {
    int i;

    @Override
    public void run() {
        try {
            for (i = 0; i < text.length(); i++) { // use your variable text.leght()
                Thread.sleep(1000);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(text.substring(0, i));
                    }
                });
            }
        } catch (InterruptedException e) {
        }
    }
};

thread.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接