2013-07-17 66 views
1

好的人,我在這裏認真地堅持下去。深夜的東西,當你已經嘗試了所有的東西...更改Android複合TextView中的圖像 - 無法正常工作

我有一個複合的TextView與圖像在左邊。圖像(只是說「加載」的小圖片)設置爲:

Drawable img = getBaseContext().getResources().getDrawable(R.drawable.loading); 
img.setBounds(0, 0, 120, 120); 
tv.setCompoundDrawables(img, null, null, null); 

tv是TextView變量。這工作正常。不過,後來我想更換新繪製的圖像,我試圖再次撥打setCompoundDrawables:

tv.setCompoundDrawables(new_img, null, null, null); 

我還試圖獲得可繪爲TextView的陣列和更換左之一,如下所示:

Drawable[] drw = tv.getCompoundDrawables(); 
drw[0] = new_img; 

代碼在調試模式下運行正常。沒有例外發生。 UI線程中執行的所有UI處理。圖像似乎沒問題,等等,但顯示不變。我需要以某種方式刷新顯示嗎?

順便說一句,如果有問題,TextView會添加到垂直LinearLayout中。我很確定我錯過了一些明顯的東西,但我看不到它。提前謝謝了。

(是的,我知道我可以用的ImageView和TextView的香草代替我的設計,但是性能方面的原因我寧願堅持一個複合的TextView如果可能的話)

+0

您可以使用帶有自定義適配器的列表視圖,並使用延遲加載來顯示圖像。這樣一來,從你這邊來看就不那麼複雜了。 –

+0

第二種方法我不希望工作正常,至少沒有'invalidate()'和'requestLayout()'。我期望通過觀察'TextView'源代碼來工作的第一種方法(我從未嘗試過自己改變這些...)。你可以嘗試用四個'null'值調用'setCompoundDrawables()',然後用新圖像調用'setCompoundDrawables()'。原則上,這四個'''''會使你回到原來的狀態,在這種情況下,新的'setCompoundDrawables()'應該和原來的一樣。 – CommonsWare

+0

非常感謝你們。我不熟悉延遲加載,所以會看起來。此外,自定義適配器聽起來值得一試。 –

回答

2

確定。我得到了這個工作,但Android似乎對它的工作方式非常挑剔。如果有人幫助其他人,我會發布答案。

這是有效的代碼。沒有什麼特別的,直到你閱讀下面的評論,顯示其他方法無效。

// resize the images. these methods seem to be very particular about how the bounds are set 
img.setBounds(new Rect(0, 0, 120, 120)); // it likes this 
tvp.setCompoundDrawables(img, null, null, null); // this works for sure when combined with setBounds(Rect) 

// what didn't work... (would have to more experimenting with what works and what doesn't) 
//img.setBounds(0, 0, 240, 240); // it didn't like this! 

//Drawable[] drw = tvp.getCompoundDrawables(); 
//drw[0] = img;  // it didn't like this technique of assigning a new image 

//tvp.setCompoundDrawablesRelativeWithIntrinsicBounds(img, null, null, null); // no good, as it uses original (intrinsic) size of the image 
//tvp.setCompoundDrawablesRelative(img, null, null, null); // doesn't like this - nothing bad happens; it just doesn't change the image 

希望這可以幫助別人。乾杯,湯姆

相關問題