2011-06-04 19 views
5

Kodda özel bir görünüm oluşturdum (bunun için XML düzeni tanımlanmadı) ve Çocuğun Views ID'sinin doğru tanımlanmasını nasıl sağlayacağımı merak ediyorum. I DO DO 'ya benzer bir kimlik tanımlayan bir xml dosyası var. Ama en azından, benim için bir AttribSet geçirecek bir xml düzenine sahip olmadığımdan, bunu anlıyorum .. bu yüzden benim kurucularım sadece (İçerik bağlamında) türleri.Özel Görünüm - Kimliklerini findViewById() aracılığıyla bulunabilecekleri şekilde nasıl ayarlayabilirim?

<resources> 
    <item type="id" name="textview1"/> 
    <item type="id" name="textview2"/> 
</resources> 

Ve görünümü bu satırlar boyunca bir şey arar: Burada

public class MyView extends View { 

    protected RelativeLayout baseLayout; 
    protected TextView textView1; 
    protected TextView textView2; 

    public MyView(Context context) { 
     super(context); 
     LayoutParams fill = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     setLayoutParams(fill); 

     Resources res = getResources(); 

     baseLayout = new RelativeLayout(context); 
     baseLayout.setLayoutParams(fill); 

     textView1 = new TextView(context); 
     textView1.setId(R.id.textview1); 
     // other init stuff here 

     textView2 = new TextView(context); 
     textView2.setId(R.id.textview2); 
     // other init stuff here 

     baseLayout.addView(textView1); 
     baseLayout.addView(textView2); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     // *snip lots of stuff* 

     baseLayout.draw(canvas); 
    } 

    // This is only here because findViewById() returns NULL when I search 
    public TextView getTextView1() { 
     return textView1; 
    } 

    // This is only here because findViewById() returns NULL when I search 
    public TextView getTextView2() { 
     return textView2; 
    } 

} 

görünümü kullanan Etkinlik var ..

public class MyActivity extends Activity { 

    // This is only here because findViewById() returns NULL when I search 
    private MyView myView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Resources res = getResources(); 

     myView = new myView(this); 
     setContentView(myView); 

     // This returns NULL. :/  
     // final TextView textView1 = (TextView) findViewById(R.id.textView1); 

     // This is only here because findViewById() returns NULL when I search.. 
     final TextView textView1 = myView.getTextView1(); 
     final Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation); 
     textView1.setAnimation(anim); 
     anim.setAnimationListener(new AnimationListener() { 
      @Override 
      public void onAnimationEnd(Animation _anim) { 
       Log.v("InsideAnimation", "Animation ended"); 
       textView1.setVisibility(View.INVISIBLE); 
      } 
      @Override 
      public void onAnimationRepeat(Animation _anim) { 
       Log.v("InsideAnimation", "Animation repeated"); 
      } 
      @Override 
      public void onAnimationStart(Animation _anim) { 
       Log.v("InsideAnimation", "Animation started"); 
      } 
     }); 
     anim.reset(); 
     textView1.startAnimation(anim); 
    } 
} 

temel sorun (animasyon ı yüklemek olmasıdır ki xml) 'de tanımlanır ve başlangıç ​​kesinlikle hiçbir şey yapmaz. "Animasyon başlatıldı" bir Log ifadesi alıyorum ama bu kadar. Asla bitmez ve taklit ettiğimde hiçbir zaman bir şey yapmaz. Başlıyor gibi, ama aslında çalışmıyor. I düşünmek sorunu belki de animasyon üzerinde çalışmak için xml id düzen tanımları kullanmayı bekliyor, ancak findViewById() NULL döndürdüğünden, bu parçanın bozuk olduğunu varsayıyorum (ve böylece animasyon çalışmaz). Yani ... en azından şimdilik, ID ayarlayarak neyi yanlış yaptığımı öğrenmek istiyorum, böylece ViewViewById(), NULL değil doğru görüntüyü döndürür ... Ve sonra muhtemelen animasyon çalışacaktır . (ya da bu noktadan sonra hala çalışmıyorsa, belki de xml yerine koddaki animasyonu tanımlamaya da bakmam gerekecek)

Herhangi bir yardım veya öneri takdir edilir.

cevap

0

Tahminimce, TextView'iniz bu noktada başlatılmadı. Animasyonunuzu oncreate-metodu dışında tetiklemeye çalışın. Ayrıca, MyView'ınız Görünüm'den genişletilir ve İçeride bir RelativeLayout oluşturuyorsunuzdur. Bunu yaparsanız, ayrıca doğrudan RelativeLayout adresinin sınıfını genişletmek olabilir ve siz haven't Faaliyetinizdeki sizin RelativeLayout referansı var çünkü o da sorun olabilir

mRelativeLayout = new MyRelativeLayout(context) 
mRelativeLayout.findViewById(R.id.textview1) 

böyle bir şey yapmak. İlk tahminim daha olası olsa da ...

Oh, ve RelativeLayout'unuzu xml olarak tasarlayabilirsiniz. Burada programsal olarak bir Düzen kullanmanın gerçek bir noktasını göremiyorum ...

+0

TextView IS'nin örneklendiğini garanti edebilirim .. Bunu test etmek için Log.v ifadelerini (daha önce hiç yayınlamadan önce) çalıştırdım.Anlatımın çıktısı, kimliği ile bulmaya çalışmak çıktısından önce mevcuttu. Görünümü genişletmek için - zaten View yerine RelativeLayout'u genişletmeyi zaten denedim ... ama bunu yaptığımda, onDraw yönteminde sahip olduğum diğer şeyler artık çizmiyor (ki eminim ki potansiyel olarak düzeltebiliyorum, ama ben Neden çizemediğinden emin değilsin ... ama hiçbir şey-değil, değil. (devam) –

+0

Ancak, sadece sadece findViewById() .. yerine çalışabilirim myView.findViewById() çalıştırmayı deneyebilirsiniz. Yedikten sonra size haber vereceğim. Sadece bir xml düzeni içinde tasarlama açısından. Bunu yapabileceğimi biliyorum (ve aslında zaten var). Ama problem şu ki, ekranın boyutlarına dayanan değerleri hesaplamak istiyorum ... XML kullanmazsa, xml yerine kod içinde çalışıyorum. Programımın, karşılaştığım her tür ekran için bir xml düzenine sahip olmak zorunda kalmadan, birden fazla ekranda aynı görünmesini istiyorum ... Bununla birlikte, bahsettiğiniz şeyi deneyeceğim. –

+0

Bu yüzden bana RelativeLayout'u veren bir yöntem ekledim ve sonra myRelativeLayout.findViewById (R.id.textview1) 'i çalıştırdım ve aslında doğru nesneyi döndürdüm, bu yüzden önerdiğiniz şey işe yaradı. :) Ne yazık ki, animasyon hala hiçbir şey yapmıyor gibi görünüyor .. Sooooo .. Ben de kod içinde animasyon programlamak zorunda kalabilirsiniz. Bilmiyorum. Ben yeni bir programcı değilim - sadece Android için yeni ve bana garip gelen bazı şeyler yapar. –

1

Görünüm kodlama java için bir setID-method var.

+0

Erm .. bu benim kullandığım şey değil mi? –

+0

Gerçekten de. Ancak setId'yi kullandığınız garip görünüyor (R.id ...). Sorunu şimdi yanlış anlamış olabilirdim, ancak mevcut kimliğine başvurarak bir kimliği başlatmıyorsunuz (ki bu da var değil). Eğer bu doğruysa, sadece argümanı R.id .. 'den gerçek bir nr'ye çevirmeniz yeterlidir. Sry açık ve aptalca olduğunu düşündüğüm şeyleri söylersem: p – keyser

+0

Kimlik sadece xml'de var. Nesneyi oluşturduğumda, onunla ilişkili bir kimliği yoktur (xml'de nesneyi bir @ id + etiketi ile tanımlamadığımdan). Bu yüzden xml (ilk kod bloğumda) bir kimlik tanımladım ve daha sonra bu görünümü daha sonra geri alabilmek için bu kimliğe bağlarım. Np, Martin - Başka bir şeyden bahsediyor olsaydın, bilmiyordum. –

İlgili konular