2011-03-25 12 views
6

android belgelerin Benim okuma yöntemlerini bulur (sonraki düzen isteği üzerine bir düzen ekranı üretmektir) forceLayout() ve hemen bir düzen isteği göndermek gerekiyordu requestLayout() (), ancak reklamı yapılan gibi davranmaya onları alamıyorum. Ben ardına seti Thread.sleep önce metni ve bir yaparsanız Özellikle, Uyku ben aradaki() forceLayout() ve requestLayout çağrı olsun veya, aynı anda her iki metinleri ayarlamadan önce bitmesini bekler. Lütfen UI iş parçacığında bir Thread.Sleep çağırmama hakkında çok saçmalık vermeyin. Ben de (sürece ben uyku süresi ile müdahale etmeyecek kadar kısa kene saati ve bitirmek için Uyku izin verecek kadar uzun zamanlayıcı süresini sahip olarak mükemmel çalışan bir countDownTimer içinde Thread.Sleep sarın edin. Şudur bir örnek:. i doğru alırsanız böyle bir şey olması demekforceLayout(), requestLayout()

int i=0; 
TextView tv2; 
TextView tv1; 
LinearLayout ll; 
Button bt; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ll=new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    tv1=new TextView(this); 
    tv2=new TextView(this); 
    bt=new Button(this); 
    bt.setText("Press to start"); 
    ll.addView(bt); 
    ll.addView(tv1); 
    ll.addView(tv2); 
    tv2.setText(""); 
    setContentView(ll); 
    bt.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      tv1.setText("starting sleep"); 
      new CountDownTimer(6000,50){ 
       public void onTick(long msuf) 
       {if(i==1) 
        { 
       try{ 
       Thread.sleep(4000); 
       tv2.setText("waking up"); 
       } 
      catch(InterruptedException e){}; 
      } 
       i++; 
       } 
       public void onFinish(){}}.start(); 
       }   
     }); 

     } 
+0

Ayrıca bkz. Http://stackoverflow.com/questions/13856180/usage-of-forcelayout-requestlayout-and-invalidate – Suragch

cevap

11

[UI iş parçacığı içinde sleep() arama konusunda saçma bir sürü]:

//...inside onTick() 
try { 
    tv2.setText("almost waking up"); // first setText() 
    Thread.sleep(4000); 
    tv2.setText("waking up"); // second seText() 
} 

Eğer ana iş parçacığı uyku yaparsanız, sadece bir şey işlemeyi durduracak: geçerli yöntem, iş parçacığı döngüsü ve ileti sırası. Bir kez daha uyandığında, yöntemin yürütülmesini tamamlayacak, w Birincisini geçersiz kılarak ikinci setText()'u itin ve sonra iplik döngüsünü bırakın ve UI yenilemesini yapın, sadece ikinci metni gösterir.

Değil requestLayout() ne de forceLayout() aslında hemen UI yenileme yapabilir yapacaklar hem zamanlama iplik döngü içinde bir düzen isteği. Emin değilim, ama aralarındaki fark requestLayout() kendi üst yılında boyutu/konumunu değişti bir görünüm tarafından çağrılan olduğunu düşünüyorum ve forceLayout() yeniden edilecek onun çocukları ihtiyacı olan bir ViewGroup tarafından çağrılan -dışında.

Bu nedenle [UI iplik sleep() arama konusunda daha fazla saçma]. Eğer çoklu kullanım uğraşmak istemiyorsanız böyle şeyler bir ana iş parçacığı işleyicisi üzerinde postDelayed() dediğin için, muhtemelen en iyi çözümdür.

+0

Düzeni (her şey) yeniden çizmeye zorlayabileceğime dair bir tavsiyeniz var mı? Ben çağırmaktan daha başka bir şey – WarrenFaith

+0

@WarrenFaith düşünemiyorum (... ama dokunulabilir, bu yüzden VideoView orada olup biliyorum) Ben sonucu ancak çalışan bir VideoView görünürlüğü görünmüyorsa geçiş bir sorunu var Düzeninizin kökünde requestLayout() 'veya' invalidate() '. Ben olsa bir 'VideoView' sorunu olduğunu düşünürdüm. Hem "GONE" hem de "GÖRÜNMEZ" ile denediniz mi? – bigstones

+0

evet ve hayır değişiklikler. Görünürle başlarsam ve gitmeyi denersem, sadece bir diyalog penceresi açıldığında giderim. Görünmez ile başlarken aynı – WarrenFaith