2012-01-06 14 views
19

Çocuk görüşlerinden birinin (bir ImageButton) tıklatıldığında arka plan rengini değiştirmek istediğim bir LinearLayout var. Bunu yapabilirim, ancak hemen değil - değişiklik daha sonraya kadar ekranda görünmüyor (bir onResume çağrısı sırasında düşünüyorum). Bir sonraki kod satırı yürütmeden önce, düzenin arkaplan ayarlandıktan sonra yeniden çizilmesinin nasıl zorlanacağını öğrenmek istiyorum.Bir sonraki kod satırı yürütülmeden hemen önce görüntünün yeniden çizilmesine zorlama

public void onClick(View v) { 

    LinearLayout parentLayout = (LinearLayout) v.getParent(); 
    parentLayout.setBackgroundResource(R.color.my_color); 
    SystemClock.sleep(1000); //ms 

} 

uyku komutu yeniden çizme başında veya sonunda olur olup olmadığını test etmek içeride: İşte düğmesine uygun OnClickListener onClick yöntemidir. Sonuç: sonra. Bu konuyla ilgili çoğu soru (here ve here gibi), görünümde invalidate() yönteminin kullanılmasını söyler. Arka plan ve uyku çizgileri arasında parentLayout.invalidate();, parentLayout.postInvalidate(); ve parentLayout.refreshDrawableState(); komutlarını kullanıyorum, bunların hepsi boşuna. Yeniden çizme hala uyku komutundan sonra gerçekleşir. Bana hemen nasıl yapıldığını söyleyen var mı?

Diğer olası yararlı bilgiler: LinearLayout bir ListView satırına bağlıdır ve yukarıdaki OnClickListener, etkinliğin kendisinde değil, SimpleCursorAdapter öğesini genişleten bir özel sınıftadır. (Bu şekilde ListView'deki her satır için bir dinleyici ayarlayabilirim.)

+0

Bunun için tam cevabı alamayacaksınız, en azından bir tane bulamadım. Bize niçin yeniden çizilecek görüşe ihtiyacınız olduğunu söyler misiniz? Sorunu çözmek için başka çözümler de olabilir. – manjusg

+0

@manjusg Yapmaya çalıştığım şey, normal olarak bir görünümün arka plan seçicisiyle xml olarak yapılıyor (arka plan, geri çağrılmadan önce sağa doğru basıldığında arka arkaya kısaca değişir), ancak farklı bir görünümün arka planını değiştirmek istiyorum. basılan düğme - yani düğmeyi içeren düzen ve ayrıca bir metin görüntüsü. – pvans

+0

@manjusg Liste görünümümün satırları metin ve silme düğmesi içeriyor, ve metin görünümü de dahil olmak üzere tüm satırın, silinmeden ve kaldırılmadan önce kısaca vurgulanması istiyorum. Böylece, kullanıcının demek istediği sıra. Belki de xml'de bir seçici ile bağlantı görünümlerini geçmenin bir yolu var mı? – pvans

cevap

2

Tamam, sonunda bu soruna bir çözüm buldum ve basit. Bir OnClickLIstener'da bir OnTouchListener'da yapmam gerektiğinde, çekilebilir değişiklikleri yürüttüğüm problemdi. ACTION_DOWN adlı düğüme ait bir OnTouchListener ayarladıktan sonra ana düzeninde setBackgroundColor öğesini çalıştırırsam, değişiklik hemen gerçekleşir.

Alternatif, daha az sağlam bir çözüm this post'dan gelir. Ana mizanpaj artalanı için bir seçiciyi xml'de, daha sonra yukarıda belirtilen OnTouchListener'da, bu düzende setPressed (true) komutunu çalıştırabilirsiniz. Bu harika bir çözüm değildir çünkü seçici, görünümün koddaki özelliklerini doğrudan değiştirmekten çok daha az özgürlüğe sahip olur. Örneğin, farklı bir düğmeye basarak mizanpaj arka planını farklı bir renge ayarlayamadınız.

Bu konuda önerilerde bulunanlara teşekkürler!

1

Değişiklikleri yapın ve listview.invalidate() işlevini çağırın. Bu değişiklikleri UI

+0

Bu kodda, ListView'a doğrudan erişimim yok, çünkü bu etkinlik, bağdaştırıcı sınıfında değil. Bu satırı kullanarak ListView'a başvurabilirim: 'mActivity.mListView.invalidate();' (mActivity, Context'ten çağıran çağrı etkinliğidir, mListView, ListView'e başvuran etkinliğin genel bir alanıdır), ancak bu satırı önce ekleme uyku hala sorunu çözmez. – pvans

3

'da yansıtmak üzerenumaralı telefonu arayarak draw(canvas) numaralı telefonu arayarak deneyebilirsiniz. onLayout(), onMeasure, draw() veya onDraw() geçersiz kılmadıysanız, varsayılan uygulama çalıştırılacak. Bununla ilgili tek sorun, ya Tuval'i almanız ya da el ile oluşturmanız gerekiyor.

Android, özellikle normal güncelleştirmelerin dışında çizim yapmaktan kaçınmak için tasarlandığı için bu yaklaşımı uygulamak kesinlikle tavsiye edilmemektedir. invalidate()'un hemen gerçekleşmediği doğruysa, yeniden çizmeyi teşvik etmenin en güvenli ve en iyi yolu budur. Çizim dışında çizim işlemek istiyorsanız, Android bunu SurfaceHolder sınıfı ile yapmanın bir yolunu sunar.

+0

Hmm. Kesinlikle cesaret kırıcı uygulamalardan kaçınmayı tercih ederim. Soruya yorum yapmaya çalıştığım şey hakkında daha fazla bilgi ekliyorum. – pvans

+0

Düşünülmesi gereken bir şey: Android yönergeleri, UI iş parçacığını bir nedenle engellemeyi kesinlikle teşvik etmemektedir. SystemClock.sleep() 'komutunu yerleştirerek, UI iş parçacığını engelliyorsunuz. Bu teori testi için ise, harika! Lütfen bulgularınızı bize bildirin. Eğer bu gerçek bir dünya uygulaması içinse, programınızı yeniden düşünmenizi kuvvetle düşünürdüm. –

+0

Uyku sadece test içindir. Yine de meraktan dolayı, bir tıklama ile ilgili geri arama eylemi arasında bir duraklamanın nasıl uygulanmasını önerirsiniz? – pvans

İlgili konular