2013-09-03 14 views
5

olmasına neden olur. Özel bir View sahibim. Görüş için kurucuda iki alt görünüm oluşturup ekliyorum. Ancak, LayoutParams.addRule() kullanmak bazı sorunlara neden oluyor. Bir tarafta görünümü incelemek durumundaLayoutParams'a ABOVE programsal eklenmesi, görünüm yüksekliğinin 0

setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 


    mLayoutParams = new LayoutParams(width, height); 
    mLayoutParams.leftMargin = left; 
    mLayoutParams.topMargin = top; 

    mImage = new ImageView(getContext()); 
    mImage.setImageDrawable(getResources().getDrawable(R.drawable.my_image_drawable)); 
    mImage.setScaleType(ScaleType.FIT_XY); 
    mImage.setId(R.id.my_image_id); 
    addView(mImage, mLayoutParams); 

    mText = new TextView(getContext()); 
    mText.setText(R.string.my_text); 
    mText.setId(R.id.my_text_id); 
    LayoutParams textParams = new LayoutParams(200, 40); 
    // textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works 
    textParams.addRule(ABOVE, mImage.getId()); //Doesn't work 

    addView(mText, textParams); 

: Ben ABOVE kullanmaya çalıştığınızda böyle CENTER_HORIZONTAL çalışma gibi Kurallar, ancak, Subview İşte 0.

yüksekliğinde biter benim kurucusundaki kodudur Device Monitor ile emülatör, metnin layout_height olduğunu görebiliyorum, ancak üst, alt ve yükseklik parametreleri 0'dır. measuredHeight, ekran genişliği ile aynı görünmektedir. Ben kurallar ekleyerek yanlış bir şey yaptığını

  1. Am?
  2. Kuralları eklemek için daha iyi bir yer var mı? İlk önce bir şeylerin olması gerekiyor mu?
  3. Başka alternatifler var mı? TextView'un FILL_PARENT, gravite BOTTOM yüksekliğinde olması ve alt kenar boşluğunun görüntü işlerinin yüksekliğine ayarlanması, ancak metnin üzerinde başka bir görünüm ekleyebilmem gerekir ve bunun için çalışmaz.
+0

'Image' öğenizin' TextView 'öğesinin altında olması için bir kural eklemeyi deneyin. Bir şeyler "RelativeLayout" a eklendiğinde, aksi belirtilmedikçe sol üst tarafa eklenirler. Sanırım ne olabilirdi 'Image' için' ImageView 'üzerinde hiçbir yer yok – codeMagic

+0

Ah, üzgünüm, kodumda bunu özledim. 'mLayoutParams', tanımlı bir sol, üst, genişlik ve yüksekliğe sahiptir. Nereye gideceğini bilmek için yeterli olmaz mıydı? @codeMagic, kodu güncelledim. – karl

+0

"ALIGN_BOTTOM" ifadesini "mImage" olarak eklemek hiçbir şeyi değiştirmez. Bunun yerine "BELOW" olarak değiştirirsem, dairesel bağımlılık hatası alıyorum. Metnin resmin üzerinde olmasını ve resmin sabit bir konumunun olmasını istiyorum. – karl

cevap

1

Kodunuzda nerede yükseklik denetimi yapıyorsunuz? OnCreate veya onCreateView içinde bir yer varsa, herhangi bir bilgi almayacaksınız. Düzen iki geçişli bir işlemdir ve bu iki yöntemde iki geçiş tamamlanmaz.

Böyle ".post" yöntemini kullanarak bu yöntemlerde yüksekliği elde etmek gerekebilir:

 myView.post(new Runnable() { 
     @Override 
      public void run() { 
       int height = myView.getHeight(); 
      } 
     }); 

çalıştırılabilir UI iş parçacığı üzerinde çalışması yapar, ama her iki geçer sonra çağrılan, geçmek ve düzen geçmek, tamamladı. Bu nedenle, ilk ölçümleri bilmeden merkezi bir merkeze dayalı bir kural belirlemeye çalışmak başarısız olur.

+0

Görüntü için kullanılan genişlik ve yükseklik paramları bir yerlerden geçirilir başka bir şey değil, sıfırdan ve doğru olmadıklarını doğruladım. – karl

0
// try this 
mText = new TextView(getContext()); 
mText.setText(R.string.my_text); 
mText.setId(R.id.my_text_id); 
RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(200, 40); 
// textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works 
textParams.addRule(RelativeLayout.ABOVE, mImage.getId()); //Doesn't work 

addView(mText, textParams); 
İlgili konular