1

假设我有一个 char 数组(mCharArray)和一个 textView(tvChar),它是整个屏幕的大小。我想要这样,当用户单击屏幕(tvChar)时,textView 会显示 charArray 中的每个字符,但是在每次迭代中它应该有 1 秒的延迟。如何做到这一点?

这是我目前的解决方案。此代码片段来自片段的 onViewCreated 部分。问题是,文本不会更新,它仅适用于 char 数组的最后一个元素。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    tvChar = (TextView) view.findViewById(R.id.tv_char);
    tvChar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // not sure how to pause after each iteration...
            v.postDelayed(new Runnable() {
                @Override
                public void run() {
                    for (char element : mCharArray) {
                        synchronized (tvChar) {
                            tvChar.setText(String.valueOf(element));

                            tvChar.notify();

                            try {
                                tvChar.wait(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }, 1000);
        }
    });
}

更新:感谢所有答案,虽然当我尝试它们时没有一个真正有效,但你们帮助我给出一些直觉。

我最终在 onCreate 上添加了线程处理程序

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mCharArray = getArguments().getCharArray(SENTENCE_KEY);
    }

    handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            this.obtainMessage();
            tvChar.setText(Character.toString((char)msg.arg1));
        }
    };
}

在 setOnclickListener 中创建一个新线程

tvChar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            thread = new Thread(new ChangeCharThread());
            thread.start();
        }
    });

创建一个实现可运行的内部类。

class ChangeCharThread implements Runnable{
    @Override
    public void run() {
        Message msg = Message.obtain();

        for (char ch : mCharArray){
            msg.arg1 = ch;

            handler.sendMessage(msg);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
4

2 回答 2

1

您可以在 click 方法中尝试类似的方法。每次 UI 更新都会延迟一秒以同步行为。需要的是每次更新的时间表:

    for (int i= 0; i< mCharArray.length; i++) {
            EventDetail.handler.postDelayed(new Runnable()
            {
                public void run()
                {
                    tvChar.setText(String.valueOf(mCharArray[i]));
                }
            }, 1000 *(i+1)); 
    }
于 2015-02-03T05:28:15.870 回答
0

它不会更新,因为您正在主线程上睡觉。每当您使用View#post或实际将代码提供给在主 UI 线程上运行可运行View#postDelayed对象的 View时。Handler因为你在主线程上睡觉,所以 UI 永远不会被更新。在 textview 再次绘制之前,您只是不断地用新数据更新 textview。

您需要做的不是循环遍历所有字符数组,而是执行以下操作:

boolean running
int count;
tvChar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (running) {
               running = false;
            } else {
               v.postDelayed(new Runnable() {
                 @Override
                 public void run() {
                    char element = mCharArray[count % mCharArray.length];
                    tvChar.setText(String.valueOf(element));
                    count++;
                    if (running) {
                      v.postDelayed(1000);
                    }
             }, 1000);
        }
    });
于 2015-02-03T05:30:08.950 回答