2011-10-19 16 views
5

Sadece findViewById() kullanarak özel bir Görünüm yakalamaya çalışırken bir sorunla karşılaşıyorum. Özel görünüm, aksi halde doğru şekilde görüntüler ve çalışır. Ne yazık ki, gösterdiği bazı verileri değiştirebilmem gerekiyor, bu yüzden yapılması gerekiyor.Android ClassCastException Özel Görünüm'ü aldıktan sonra

Benim XML şöyle görünür:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.TheProject.TheApp.Chart 
    android:id="@+id/chart" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

</LinearLayout> 

Sorunun insanların yanlışlıkla bunun yerine kendi alt sınıfının XML bileşeni "Görünüm" adını olmasıdır bazen biliyorum. Benim etkinlik'ın onCreate() yönteminin içinde

, bu var:

bir ClassCastException atar
myChart=(Chart)findViewById(R.id.chart); //where myChart is an object of type Chart 

.

Biraz deneme karar verdi ve hala ClassCastException alınan eğer yerine görmek için bu kadar çizgiyi değiştirdi:
View chart=(View)findViewById(R.id.chart); 

Bu

iyi çalıştı, findViewById bana Görünüm vererek hiçbir sorun olmayacağını söylüyor. Ama bana bir grafik vermek istemiyor.

Grafik sınıfı gittiği sürece, doğru şekilde göründüğü gibi görünen Görünümün gerçekten basit bir alt sınıfıdır.

public class Chart extends View{ 
    public Chart(Context context) { 
    super(context);  
    init(); 
} 

public Chart(Context context, AttributeSet attrs) { 
    super(context, attrs);  
    init(); 
} 

public Chart(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle);   
    init();  
} 
    /* More stuff below like onDraw, onMeasure, setData, etc. */ 
} 

Muhtemelen aptalca bir şey yapıyorum. Herhangi bir fikrin var mı? Yardım ettiğin için teşekkür ederim!

+0

Grafikte kurucular var mı? – Phil

+0

Evet. Grafikte 3 kurucu var. Yayınlarımı göstermek için düzenledim. – Schmidget

cevap

3

Sadece meraktan dolayı, xml başka bir düzende <include> etiketi ile kullanılıyor mu?

Bence

<include layout="@layout/some_layout.xml"> ve yanlış widget'lar başlamıştı bir viewflipper başka xml düzeni de dahil olmak nerede aynen böyle bir sorunu vardı. Tüm harici düzeni <merge></merge> etiketlerinde temel düzende doğru bir şekilde birleştirmek için sarmak zorunda kaldım.

İçeriğiniz ekleniyorsa, düzeninizi değiştirmeyi deneyin.

<?xml version="1.0" encoding="utf-8"?> 
<merge> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.TheProject.TheApp.Chart 
    android:id="@+id/chart" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

</LinearLayout> 
</merge> 

düzenleme: çek dışarı birleştirme Olasılıkla bir hata olduğunu

+0

Bu düzeltildi! Teşekkürler! – Schmidget

+0

Çok teşekkür ederim! – ArtemStorozhuk

-1

findViewById her zaman Görünüm nesnesini döndürür. Yalnızca görünüm sınıfında belirtilen yöntemlere erişebileceksiniz ve Grafik sınıfınızın yöntemlerinden hiçbiri erişilemez.

Grafiğe özgü yöntemlerden veya verilerden herhangi birine erişmeniz gerekiyorsa, görüntüleme nesnesini Grafik'e eklemeniz gerekir.

+0

Bu sadece bu kadar. View nesnesini bir grafiğe dökmek, bana ClassCastException özelliğini veriyor. – Schmidget

+0

Grafik Grafiği = (Chart) findViewById (R.id.chart); Bu istisna neden olur? Hmm, bu hatayı yapması gerekmediği için kafam karıştı. Bazen böyle bir hata oluştuğunda, hata olmamasına rağmen, tutulmayı tekrar açarım ve projeyi temizlerim. – blessenm

+0

Ben de öyle düşünüyordum. Üretilen kodun, son zamanlarda çok fazla olduğu anlaşılan, bence sarhoş olduğunu düşünüyorum. Her zaman bir arada, mükemmel çalışan kod, artık bir düğme veya bir şey bulamadığı için çalışmayı durdurmaya karar verir. Projeyi zaten temizledim, ancak yardımcı olmadı. – Schmidget

2

çalışma şekli hakkında this link.

Düzeltilecek geçici çözüm: Layout XML'de CustomView ve findViewById() için yeni 'id' değeri kullanın.

+0

haklısın, benim için çalıştı ... teşekkürler –