Android gebruikt lay-outs als een sjabloon voor het maken van meerdere layout-exemplaren

OK, dus ik begrijp hoe ik de include-tag moet gebruiken, maar ik heb een probleem ontdekt.

Ik wil in principe een lay-out gedefinieerd in xml met daarin een aantal TextView s en een ImageView . Ik wil vervolgens een array herhalen en velden opvullen in de XML-indeling, afhankelijk van wat zich in een array bevindt (die wordt ingevuld tijdens runtime). Dus meerdere kopieën maken van de XML-lay-out en de velden vullen met unieke gegevens. Nu heb ik geen idee hoe je deze LinearLayout op deze manier kunt hergebruiken als de TextView s en ImageView binnenin het een constante id en ik moet meerdere kopieën van deze lay-out maken.

Is er een manier om een ​​bron op te blazen en er vervolgens een kopie van te maken, dan zou dat werken ... Dus

LinearLayout one = new LinearLayout(inflater.inflate(R.layout.home, container, false));

^ Er is helaas geen constructeur als deze.

De enige andere manier is om dit allemaal programmatisch te doen, maar ik zou liever de eigenschappen van de views en de LinearLayout in xml hebben dan in de code. Het is alsof ik wil dat de LinearLayout een sjabloon is waarvan je kopieën kunt maken, denk ik ... Echt niet zeker of dat mogelijk is.

24

2 antwoord

Je kunt dit eenvoudig doen, je moet het gewoon afbreken. Eerst laadt u de lay-out waarop u uw dynamische weergaven wilt invoegen. Vervolgens blaas je je subview op en vul je hem zo vaak in als je nodig hebt. Vervolgens voegt u de weergave toe aan de bovenliggende lay-out en stelt u ten slotte de inhoudsweergave van de activiteit in op de bovenliggende weergave.

Hier is een voorbeeld:

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main,
            null);

    for (int i = 0; i < 3; i++) {
        View custom = inflater.inflate(R.layout.custom, null);
        TextView tv = (TextView) custom.findViewById(R.id.text);
        tv.setText("Custom View " + i);
        parent.addView(custom);
    }

    setContentView(parent);

hier is het bestand main.xml dat ik invoeg:

<?xml version="1.0" encoding="utf-8"?>



en hier is de custom.xml-weergave die ik opblaas, vul en dynamisch invoeg:

<?xml version="1.0" encoding="utf-8"?>


    

        

        
    


Ik hoop dat dit voorbeeld helpt!

42
toegevoegd
yaa, dat is het. thanx
toegevoegd de auteur Crowni, de bron
Enige manier om dit in fragment te gebruiken? getActivity() .setContentView (ouder maakt het hele verhaal kapot maar ik zie het resultaat. Ook ik scheen deze fout vaak te krijgen na het implementeren van dit android.content.res.Resources $ NotFoundException: String resource ID # 0x7f0e00a2
toegevoegd de auteur KasparTr, de bron
Is er een manier om de lay-out tijdens de lus eenvoudig te kopiëren in plaats van elke iteratie inflator.inflate() te gebruiken? Het lijkt me dat opblazen erg duur is in vergelijking met gewoon kopiëren.
toegevoegd de auteur Scott Biggs, de bron
Bedankt! Goed voorbeeld van inflator ook!
toegevoegd de auteur Mailis Toompuu, de bron
Hartelijk bedankt! Dat heeft het gesorteerd ... Ik denk dat ik mijn hoofd rond de verschillende inflate (....) oproepen moet nemen.
toegevoegd de auteur gunboatmedia, de bron

Om nog steeds op zoek te gaan naar een vergelijkbare oplossing, kun je blijkbaar ook include direct in xml gebruiken en nog steeds naar hen verwijzen in code:

LinearLayout row1 = (LinearLayout) findViewById(R.id.row1)
TextView text1 = row1.findViewById(R.id.text);

LinearLayout row2 = (LinearLayout) findViewById(R.id.row2)
TextView text2 = row2.findViewById(R.id.text);

Source: Romain Guy

7
toegevoegd