2014-01-17 49 views
8

下面是我的代碼爲我定製View爲什麼onMeasure()在我的自定義視圖中調用兩次?

XML佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res/com.project.summary" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="@color/BgColor"> 

    <com.project.summary.customview.CustomView 
     android:id="@+id/customView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:colorValue="@color/textRed" 
     app:textString="This the Custom View!!!" 
     app:textSize="20sp" 
     /> 

</LinearLayout> 

代碼在我CustomView.java

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    Log.e("140117", "onMeasure()"+this.getHeight()+"||"+this.getWidth()); 
} 

代碼的測試活動:

public class CustomViewActivity extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.customview_layout); 
    } 
} 

logcat輸出:

01-17 13:47:01.203: E/140117(11467): onMeasure()0||0 
01-17 13:47:01.243: E/140117(11467): onMeasure()28||212 

我搜索的StackOverflow,但沒有人給出一個明確的答案。有人能幫助我嗎?

+0

這是正常的事情。如果你在'RelativeLayout'中,你幾乎肯定會測量兩次或更多。 – kcoppock

+0

@ kcoppock:謝謝你的回覆,你能告訴我它爲什麼會打兩次嗎?觸發器是什麼?當設置我的customview權重屬性時,onMeasure()被調用四次!爲什麼? – linguowu

+0

看到這個答案:http://stackoverflow.com/a/4069077/321697 – kcoppock

回答

0

在過去,當我遇到與此類似的問題時,這是因爲我的「onAnAction」代碼應該放在活動的onCreate中的類代碼AKA中,而不是在自定義視圖的類中。

這可能工作,但不能保證,它通常需要一些擺弄和理解android生命週期。

9

父視圖可能會多次調用measure()對其子元素。例如,父母可以用未指定的維度來測量每個孩子一次,以找出他們想要的大小,然後如果所有孩子的無約束尺寸的總和過大或過小,則再次用實際數字對它們調用measure()(也就是說,如果孩子們不同意他們各自獲得多少空間,那麼父母會介入並在第二次通過時設置規則)。 作爲https://developer.android.com/guide/topics/ui/how-android-draws.html說。

0

你錯過了什麼在你的問題?因爲如果你重寫onMeasure,你必須調用setMeasuredDimension(int,int),否則你會得到一個IllegalStateException。在你的問題中,你似乎沒有任何例外。

相關問題