Programlı Olarak Görünümlere Görünüm Ekleme


179

Diyelim ki LinearLayoutprogramımda Java kodundan bir Görünümüm var ve buna bir Görünüm eklemek istiyorum. Bunun için hangi yöntem kullanılır? Bildiğim XML, nasıl yapıldığını sormuyorum, ama bunun yerine, nasıl bu örnek kod satırları boyunca bir şeyler yapabilirim?

(One View).add(Another View)

Swing'de yapabileceđin gibi.

Yanıtlar:


248

Aramak addViewdoğru cevaptır, ancak çalışmasını sağlamak için bundan daha fazlasını yapmanız gerekir.

Bir yapıcı (örn. Button myButton = new Button();) Aracılığıyla bir Görünüm oluşturursanız setLayoutParams, yeni oluşturulan çocuğunuzu üst görünüme eklemeden önce üst görünümün LayoutParams iç sınıfının bir örneğini ileterek yeni oluşturulan görünümü çağırmanız gerekir .

Örneğin, onCreate()LinearLayout'unuzun kimliğini varsayarak işlevinizde aşağıdaki kodu kullanabilirsiniz R.id.main:

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

LayoutParams ayarını yaptığınızdan emin olmak önemlidir. Her görünüm için en az bir layout_width ve layout_height parametresi gerekir. Ayrıca doğru iç sınıfı almak da önemlidir. Ben TableRow.LayoutParams bir örnek alt görünümünde setLayoutParams geçmediğini anlayana kadar Views bir TableRow ekledi almak için mücadele etti.


5
Görünümü programlı olarak nasıl oluşturursunuz, ancak bu yeni görünüm için özel olarak yazdığınız bir XML mizanpaj dosyasını kullanarak?
SK9

9
@ SK9 Bir Bağlamdan, genellikle geçerli Etkinlikten alabileceğiniz bir LayoutInflater kullanırsınız. Şuna benzer: LayoutInflater myInflater = getLayoutInflater; View myView = myInflater.inflate (R.layout.myLayout, üst, yanlış);
Brian Cooley

1
Aslında getLayoutInflater () yöntemi, Window sınıfından gelir (Context'ten değil) ve Activity'de bir kolaylık yöntemidir.
Brian Cooley

2
Bir kodlama uygulaması olarak, bir nesnenin bir LinearLayout öğesinden RelativeLayout öğesine dönüşürse, yeniden düzenleme yapmayacak şekilde ViewGroup'a veya her zaman en genel biçimine dönüştürülen findViewById üzerinde.
Joel Teply

1
Bunlar bazı detaylar: D
Vivek Solanki

51

henüz ilgilenen herkes için:

bulduğum en iyi yol, şişirme statik Görünüm yöntemini kullanmaktır.

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

ViewXML'niz R.layout.myView gibi bir şeydir

bir görünüm eklemek için bir ViewGroup'a ihtiyacınız olduğunu unutmayın (aklınıza gelebilecek herhangi bir düzendir)

örnek olarak, zaten şişirilmiş bir parçanız olduğunu ve kök görünümün bir düzen olduğunu bildiğinizi ve ona bir görünüm eklemek istediğinizi varsayalım:

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);

Ayrıca, statik yöntem yazabilirsiniz, böyle bir şey addView(View v){ // your code after get view }bir görünüm alacağını kullanılarak tespit findViewById(int resourceID)veya kardeşin gibi şişirilmiş inflatedViewsadece fragmanı örneğin genişletmek için ....
zgc7009

22

Bu geç ama bu birine yardımcı olabilir :) :) Görünümü programlı olarak eklemek için

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

Bu, tüm görünümünüzü programsal olarak oluşturur. İstediğiniz sayıda görünümü aynı şekilde ekleyebilirsiniz. Umarım bu yardımcı olabilir. :)



3

Etkinlikten görünüm eklemenin bir yolu daha

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);

0

Programlı olarak kısıtlama koyma fikri yorucu olabilir. Aşağıdaki bu çözüm, kısıtlama, doğrusal vb. Herhangi bir düzen için işe yarayacaktır. sahip olmak.

Tek yapmanız gereken, görünümü programlı olarak ve alt öğe olarak FrameLayout'a addChild()yöntemi kullanarak şişirmek . Ardından çalışma zamanı sırasında görüşünüz şişirilir ve doğru konuma yerleştirilir. Android önerilerine göre, FrameLayout'a [link] yalnızca bir childView eklemelisiniz .

Kodunuzun, belirli bir konumda programlı olarak TextView oluşturmak istediğinizi varsayalım:

Aşama 1:

Şişirilecek görünümü içeren mizanpajınızda, doğru konuma bir FrameLayout yerleştirin ve "id" deyin.

Adım 2 Çalışma zamanı sırasında şişirmek istediğiniz görünüm olarak kök öğeyle bir düzen oluşturun, düzen dosyasını "textview.xml" olarak adlandırın:

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

</TextView>

BTW, frameLayout öğenizin düzen parametrelerini her zaman wrap_content olarak ayarlayın; aksi takdirde çerçeve düzeni üst öğe, yani etkinlik yani telefon ekranı kadar büyük olur.

android:layout_width="wrap_content"
android:layout_height="wrap_content"

Ayarlanmadıysa, çerçevenin alt görünümü varsayılan olarak çerçeve düzeninin sol üst kısmına gittiğinden, görünümünüz ekranın sol üst kısmına uçar.

Aşama 3

Oncreate yönteminizde şunları yapın:

FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);

(Son parametre ayarının Not findViewByIdiçin nullçağırarak ve görünümü ilave addView()kap görünümü (frameLayout) basitçe geçirilmesi ile şişirilmiş bir görünümü bağlama aynıdır true3. parametresinde findViewById(). Daha fazla bilgi için, bakınız , bu .)


0

Siz de geçersiz kıldığınızda tüm özellikleri onLayoutaramak zorundasınız super.onLayoutya da görünüm şişirilmiş olmayacak emin olun!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.