2016-02-13 71 views
0

我有一個ImageView,我需要在Java中獲取圖像寬度和高度,並將它們存儲在一些變量中,並根據需要使用它一些次,但是當我想保存高度和寬度值時,它會將NULL值返回給消息字符串。如何從匿名內部類獲取價值?

我創造了一些外界方法,並傳遞價值給它的存儲值,但它沒有工作過,同樣我創建一個文本視圖和我分配值TextView的文本,它顯示在屏幕上,但是當我用getText()對於GET文本它獲得文本視圖的默認文本,看看,沒有任何方式從內部類獲取價值,有什麼辦法從匿名內部類獲取價值?

final String[] message = new String[2]; 
final ImageView iv = (ImageView)findViewById(R.id.main_item2); 
final TextView tv = (TextView)findViewById(R.id.storePostions); 
ViewTreeObserver vto = iv.getViewTreeObserver(); 
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
     iv.getViewTreeObserver().removeOnPreDrawListener(this); 
     int finalHeight, finalWidth; 
     finalHeight = iv.getMeasuredHeight(); 
     finalWidth = iv.getMeasuredWidth(); 
     message[0] = String.valueOf(finalHeight); 
     message[1] = String.valueOf(finalWidth); 
     return true; 
    } 
}); 

Toast.makeText(MainActivity.this, "finalHeight = " + message[0] + " ,finalWidth = " + message[1], Toast.LENGTH_LONG).show(); 
// show "finalHeight = NULL ,finalWidth = NULL" 

回答

1

你的代碼應該得到的值就好了,你的問題是,代碼運行之前,你輸出它。 onPreDraw()中的所有代碼不會立即執行,而是定義並設置爲稍後運行,無論何時vto的「preDraw」事件發生。您在Toast.makeText的電話會在「稍後」到來之前發生。

要延遲Toast.makeText()呼叫,您有兩個選項。你可以把它放在類似的「稍後運行」塊中,或者你可以使用某種類型的線程間協調工具。對於前一種選擇,請添加另一個OnPreDrawListener並將呼叫置於此處。你已經知道如何做到這一點。

對於後一種選擇,我推薦CountDownLatch。在調用Toast.makeText()之前,在它上面初始化它,最後在onPreDraw()await()的最後加上1,countDown()。這將保證,在await()呼叫返回時,帶有countDown()呼叫的代碼已完成。請注意,這僅適用於兩個代碼段運行在不同線程中。否則,它將永遠停滯不前。我敢肯定,在這種情況下,他們確實在不同的線程中運行,但請記住一般情況。

+0

謝謝,那麼如何運行onPreDraw(),然後運行Toast方法? – MojtabaSh

+0

@MojtabaSh我編輯了一些建議。 – Douglas