Ajouter un layout lors d'un click [Résolu]

Signaler
Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
-
Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
-
Bonjour à tous, étant débutant sur android, ja'ai un peu de mal à comprendre pourquoi certaine chose de fonctionne pas comme je voudrais.
J'ai créer un linear-layout dans mes ressource et je souhaite insérer ce dernier lors d'un évènement clic, mais malheureusement mon code fait planté l’application.

voici le linear_layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/anim_linear"
    android:id="@+id/anim_linear"
    android:name="anim_linear">
</LinearLayout>


le activity_main:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/fondPrincipal"
    android:id="@+id/layoutPrincipal">

    <Button
        style="@style/bouton"
        android:id="@+id/boutonMillieu"
        android:text="@string/cliquezMoi2"/>
</RelativeLayout>


et le java:

package fr.test;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity
{
    private RelativeLayout layoutPrincipal;
    private LinearLayout animLinear;

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        layoutPrincipal = findViewById(R.id.layoutPrincipal);
        Button boutonMillieu = findViewById(R.id.boutonMillieu);

        boutonMillieu.setOnClickListener(new ClickBoutonMillieu());
    }

    class ClickBoutonMillieu implements View.OnClickListener
    {
        @Override
        public void onClick(View v)
        {
            //animLinear = (LinearLayout) findViewById(R.id.anim_linear);
            animLinear = (LinearLayout) getResources().getLayout(R.layout.anim_linear);
            layoutPrincipal.addView(animLinear);
        }
    }
}


du coup, dés que je click sur le bouton du milieu, l'appli plante.
Merci pour coup de main.
Configuration: Linux / Firefox 78.0

3 réponses

Messages postés
14817
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2020
2 555
Hello,

Ce n'est pas comme ceci que l'on récupère une View à partir d'une ressource de type Layout. Il faut utiliser LayoutInflater

final LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout linearLayout = (LinearLayout)inflater.inflate(R.layout.anim_linear, null);

Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
1
Merci pour la réponse rapide, cependant, comment doit on procéder pour ajouter le layout une fois qu'on l'a récupéré., j'ai bien tenté un addView(linearLyout) mais rien ne s'ajoute lors du clic

class ClickBoutonMillieu implements View.OnClickListener
    {
        @Override
        public void onClick(View v)
        {
            final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            LinearLayout linearLayout = (LinearLayout)inflater.inflate(R.layout.anim_linear, null);

            layoutPrincipal.addView(linearLayout);
        }
    }
Messages postés
83
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
23 août 2020
1
Bien, je pense avoir trouvé la "bonne" façon de faire.
j'ai remplacer cette ligne:
LinearLayout linearLayout = (LinearLayout)inflater.inflate(R.layout.anim_linear, null);

par:
LinearLayout linearLayout = (LinearLayout)inflater.inflate(R.layout.anim_linear, layoutPrincipal, false);


maintenant ça fonctionne.
Merci de m'avoir mis sur la bonne voie