1

char (mCharArray) の配列と、画面全体のサイズである 1 つの textView (tvChar) があるとします。ユーザーが画面 (tvChar) をクリックすると、textView は charArray 内の各文字を表示しますが、各反復で 1 秒の遅延が必要です。これを達成する方法は?

これは私が持っていた現在の解決策です。このコード スニペットは、fragment の 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();
        }
    });

runnable を実装する内部クラスを作成します。

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

クリック メソッド内でこれに似たアプローチを試すことができます。動作を同期させるために、すべての UI 更新がさらに 1 秒遅れます。必要なのは、各更新のスケジュールです。

    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 に答える