2015-04-20 69 views
20

我創建了一個自定義視圖:自定義視圖的構造函數不會被調用在Android 5.0.2

public class SomeView extends View 

該自定義視圖的構造函數:

public SomeView (Context context) 
{ 
    super(context); 
} 
// Called when view is inflated from xml 
public SomeView (Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 
// Perform inflation from XML and apply a class-specific base style from a theme attribute. 
public SomeView (Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
} 

我也嘗試了第四構造從API 21沒有運氣:

public VeediView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
{ 
    super(context, attrs,defStyleAttr, defStyleRes); 
} 

在xml佈局我定義這個視圖和事情工作正常。

Galaxy S2上的測試工作正常,視圖構造函數被調用,但在Nexus-7 android 5.0.2上運行應用程序時,構造函數根本不會被調用。

任何想法爲什麼?

它可能與根設備有關嗎?

的相關XML視圖:

<com.package.name 

     android:id="@+id/scene" 
     android:onClick="startx" 
     style="@style/txt_money_style" 
     android:layout_width="72dp" 
     android:layout_height="72dp" 
     android:background="@drawable/wtbtn" 
     android:layout_gravity="right" 
     android:gravity="center_vertical|right" 
     /> 
+0

我很確定它被調用,並且該錯誤不在Android中。我們完全基於自定義視圖構建了一個應用程序,並且5.0.2上沒有任何問題。也許這是你的設備/自定義Rom或你的代碼的問題。 –

+0

猜測:您的視圖是不可見的,並且存在一種新的優化,將這些視圖的構建推遲到實際需要時。 – yoah

+0

你在5.0.2屏幕上看到這個視圖嗎? –

回答

0

事情是我得到這個代碼,並沒有開發它自己和亂投醫後,事實證明,該應用程序有多個佈局文件:

佈局大,佈局小等...

我只在佈局文件夾中定義了自定義視圖,因此切換到調用常規視圖的其他屏幕尺寸。

我想其他人可以從我的錯誤中學習,我希望的Android Studio或Eclipse可以支持某種形式的setContentView(R.layout.activity_scene)及相關文件調試選項

所以答案是,以確保所有佈局有定義的自定義視圖

+0

在你的情況下,你從其他befores中得到這段代碼,當編輯一些視圖有一些佈局文件夾中定義了多個視圖時,你會感到困惑。這是正常的,不是你的錯誤。很難保證你沒有做到的任何事情。 我覺得在佈局文件夾中定義的customview xml對於你來說已經足夠了。在多個佈局中創建多個定義的customview xml文件用於支持使用手機屏幕大小的平板電腦屏幕大小。 –

6

在21個API現在孤單一4th constructor它可能是你的XML調用此。

從文檔:

公共視圖(上下文的背景下,AttributeSet中的ATTRS,INT defStyleAttr,INT defStyleRes)

在API級別21

從XML執行通貨膨脹和應用類來自主題屬性或樣式資源的特定基本樣式。 View的這個構造函數允許子類在膨脹時使用他們自己的基礎樣式。

當確定特定屬性的最終值,存在開始發揮作用的四個輸入:

  1. 在給定的AttributeSet的任何屬性值。
  2. 在AttributeSet(名爲「style」)中指定的樣式資源。
  3. defStyleAttr指定的默認樣式。
  4. defStyleRes指定的默認樣式。
  5. 此主題中的基本值。

這些輸入中的每一個都按順序考慮,第一個輸入優先於下列輸入。換句話說,如果在你提供的AttributeSet中,那麼按鈕的文本將始終爲黑色,而不管在任何樣式中指定了什麼。

參數

上下文視圖運行中,上下文,通過它可以訪問當前主題,資源等 ATTRS被充氣視圖的XML標籤的屬性。 defStyleAttr當前主題中的一個屬性,其中包含對爲視圖提供默認值的樣式資源的引用。可以爲0以不尋找默認值。 defStyleRes爲視圖提供默認值的樣式資源的資源標識符,僅在defStyleAttr爲0或在主題中找不到時使用。可以爲0以不尋找默認值。

+0

謝謝,我試過沒有運氣 –

4

我認爲你應該使用這個構造函數佳豪:

public SomeView (Context context) 
{ 
    this(context , null); 
} 
// Called when view is inflated from xml 
public SomeView (Context context, AttributeSet attrs) 
{ 
    this(context, attrs , 0); 
} 
// Perform inflation from XML and apply a class-specific base style from a theme attribute. 
public SomeView (Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
    // Initialize customize constructor here 
} 
+0

我已經有這個構造函數 –

+0

我的代碼與你的代碼不同。如果這是樣本,請編輯您的新代碼並清楚地說明。我用這個構造函數爲每個我使用過的customviews。它適用於我測試過的每個設備。 (S5,nexus 4,Oppo ..) –

1

這裏是指View.java類的源代碼。如果你檢查出來,你會看到,總是調用public View(Context context)。如果您認爲它沒有被調用,但是您看到了該視圖,那麼在檢測它是否被調用的部分中,問題相當於,而不是Android代碼。你應該看看那裏。它可能是AS中的日誌代碼或一些錯誤的過濾器,或類似的。

從源代碼中你也可以看到,這是新的構造函數,在Android 5.0中使用的更高,具有最多的實現。

public View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
相關問題