2015-02-03 2 views
1

Допустим, у меня есть массив char (mCharArray) и один textView (tvChar), который является размером всего экрана. Я хочу, чтобы, когда пользователь нажимает на экран (tvChar), textView отображает каждый символ внутри charArray, однако он должен иметь как бы 1 секунду задержки на каждой итерации. Как это сделать?Как добавить некоторую задержку после каждой итерации массива, каждая итерация изменяет свойство вида. Android

Это текущее решение, которое у меня было. Этот фрагмент кода является частью 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); 
     } 
    }); 
} 

UPDATE: Спасибо за ответы на все вопросы, хотя никто на самом деле не работает, когда я попробовал их, вы, ребята, помогите мне дать некоторую интуицию.

я в конечном итоге добавив обработчик потоков на 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(); 
      } 
     } 
    } 
} 

ответ

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)); 
    } 
0

Он не обновляется, потому что вы спите в основной теме. Всякий раз, когда вы используете View#post или View#postDelayed, вы на самом деле даете код View backed Handler, который запускает runnable в основном потоке пользовательского интерфейса. Поскольку вы спите в основном потоке, пользовательский интерфейс никогда не обновляется. Вы просто постоянно обновляете текстовое представление с новыми данными, прежде чем текстовое изображение еще раз рисует.

Что вам нужно сделать, это вместо того, чтобы цикл через все ваши массивы символов, просто сделать что-то вроде этого:

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); 
     } 
    }); 
+0

Брешь в это не на самом деле отменить обновление, потому что вы можете нажать кнопка очень быстро, и вы начнете публиковать много, много runnables, которые не могут быть отменены. Обычно вы просто создаете своего собственного обработчика. – DeeV