2013-09-11 8 views
1

В моей деятельности у меня есть метод, который делает размер шрифта больше или меньше, в зависимости от ширины TextView. Я делаю setText в TextView, чтобы ввести новое значение (которое, скорее всего, увеличит или уменьшит ширину ViewText), а затем перейдет прямо в мой метод. Моя проблема заключается в том, что при вводе моего метода размер TextView еще не изменился, поэтому я предполагаю, что поток пользовательского интерфейса занимает немного больше времени для выполнения изменения размера TextView, и мой метод не работает из-за этого , Итак, как мне подождать после потока пользовательского интерфейса, чтобы я мог правильно выполнить код моего метода?Как подождать после пользовательского интерфейса в Android?

Это код моей основной деятельности. Метод texteAffichage просто устанавливает то, что находится в моем TextView, и gestionPolice изменяет размер шрифта, если это необходимо. Когда я делаю sysout в gestionPolice, я никогда не получаю текущую ширину TextView, потому что кажется, что у него не было времени сделать это.

affichage.setText(texteAffichage((Button) v)); 
gestionPolice(); 
+1

если вы звоните 'setText' и ваш метод в том же потоке, что ваш метод не должен вызываться до того, как' setText' закончена ... Я думаю, что может произойти что-то еще. –

+0

Разум публикует ваш код? – prijupaul

+0

Кажется, что очень маленькая задержка в 10 секунд устраняет мою проблему! –

ответ

0

Вы можете задержка код с использованием Handler:

Handler h = new Handler(); 

h.postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     // DO DELAYED STUFF 
    } 
}, your_variable_amount_of_time); // e.g. 3000 milliseconds 

Примечание стороны: Я не думаю, что ваша проблема возникает потому, что метод SetText (...) принимает слишком много времени. Отправьте свой код, чтобы другие могли его посмотреть.

+1

Задержка фиксированного количества времени, как правило, плохая идея. – wtsang02

+1

Это хорошо работает, спасибо! –

+0

Добро пожаловать. Какое значение вы задали для задержки? –

1

Мое предложение было бы что-то вроде:

 tv.setText("someText"); 
     new Handler().postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       int width = tv.getWidth(); 
       // your code reacting to the change in width 
      } 
     }, 50); 

50 милисекунд должны быть достаточны для изменения пользовательского интерфейса для завершения, но достаточно быстро, чтобы пользователь не заметил.

Как правильно указывает Саймон, это не обязательно лучшее решение. Чтобы дать вам пример того, как можно использовать GlobalLayoutListener:

final ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      width = tv.getWidth(); 
      // your code reacting to the change in width 

     } 
    }); 
+0

Это хорошо работает, спасибо! –

+0

Добро пожаловать. Просто обнаружил, что в TextViews есть метод addTextChangedListener, который, возможно, был более чистым, но не смог подтвердить его как рабочее решение. Пока setText не вызвал ни одного из методов прослушивателя при выпуске setText. Тем не менее, 50 мс задержка делает трюк в любом случае. – cYrixmorten

Смежные вопросы