8
votes

Android - Suppression de la mise en page par programme

J'ai une activité qui fait une mise en page par programme à partir d'une préférence partagée en utilisant une boucle. Les vues de texte et les boutons sont enfermés dans une présentation linéaire. L'utilisateur peut saisir autant de points de vue qu'il le souhaite. Maintenant, le bouton sera un bouton Supprimer. Lorsque vous appuyez sur enfoncé, je veux supprimer la mise en page linéaire, le bouton et les autres TextViews sont contenus. Comment puis-je faire cela?

Voici mon code: P>

package com.dirkjan.myschools;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

LinearLayout subjectLeft, subjectRight;

Button addSubj;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    subjectLeft = (LinearLayout) findViewById(R.id.llSubjectLeft);
    subjectRight = (LinearLayout) findViewById(R.id.llSubjectRight);

    //Load the saved subjects
    SharedPreferences getSubjects = getSharedPreferences("SubjectInfo_Prefs", MODE_PRIVATE);
    SharedPreferences.Editor editor = getSubjects.edit();

    int subjectCount = getSubjects.getInt("count", 0);
    if (subjectCount > 0 ){
        for (int i = 1; i <= subjectCount; i++){
            //Set the linear layout for each subject
            LinearLayout ll = new LinearLayout(this);
            ll.setOrientation(LinearLayout.VERTICAL);
            LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

            float scale = getResources().getDisplayMetrics().density;
            //SET BOTTOM MARGIN
            float margin = 5; //RESIZE MARGIN HERE!
            int margs = (int) (margin * scale + 0.5f);

            //SET PADDING IN DP
            float padding = 5; //RESIZE PADDING HERE!
            int pads = (int) (padding * scale +0.5f);
            llParams.setMargins(0,0,0,margs);

            //SETTING THE LINEARLAYOUT PARAMS
            ll.setLayoutParams(llParams);
            ll.setPadding(pads, pads, pads, pads);

            //SETTING THE BACKGROUND COLOR OF THE LINEAR LAYOUT
            String chosenColor = getSubjects.getString("chosenColor" + i, "BLUE");

            if (chosenColor.equals("Green")){
                ll.setBackgroundResource(R.color.HoloGreen);
            }else if (chosenColor.equals("Blue")){
                ll.setBackgroundResource(R.color.HoloBlue);
            }else if (chosenColor.equals("Gray")){
                ll.setBackgroundResource(R.color.HoloGray);
            }else if (chosenColor.equals("Orange")){
                ll.setBackgroundResource(R.color.HoloOrange);
            }else {
                ll.setBackgroundResource(R.color.HoloYellow);
            }

            //ADDING THE LAYOUT TO THE APPROPRIATE CONTAINER (LEFT OR RIGHT)
            if (i % 2 == 1){
                subjectLeft.addView(ll);
            } else {
                subjectRight.addView(ll);
            }

            //SETTING THE SUBJECT NAME TEXTVIEW
            TextView SubjectName = new TextView(this);
            SubjectName.setText(getSubjects.getString("subjectName" + i, "Error"));
            SubjectName.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            SubjectName.setTextSize(22);
            SubjectName.setTypeface(Typeface.DEFAULT_BOLD);

            //SETTING THE SUBJECT NUMB TEXT VIEW
            TextView SubjectNumber = new TextView(this);
            SubjectNumber.setText(getSubjects.getString("subjectNumb" + i, "Error"));
            SubjectNumber.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            SubjectNumber.setTextSize(16);

            //Creating the divider line
            ImageView divider = new ImageView(this);
            LinearLayout.LayoutParams dividerParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 2);
            divider.setLayoutParams(dividerParams);
            divider.setBackgroundResource(R.color.Black);

            //Add Views into the Layout
            ll.addView(SubjectNumber);
            ll.addView(SubjectName);
            ll.addView(divider);
        }



    }

    addSubj = (Button) findViewById(R.id.buttonPlusSubject);
    addSubj.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent toAddSubj = new Intent(MainActivity.this,
                    AddSubjectActivity.class);
            startActivity(toAddSubj);
            finish();
        }
    });
}






@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}


2 commentaires

Le bouton est dans une mise en page relative, qui se trouve dans une mise en page linéaire où la disposition linéaire doit être retirée en cliquant sur le bouton de sorte que vous souhaitez supprimer la mise en page parent en cliquant sur une vue enfant? Ensuite, qu'en est-il de la vue enfantine de cette mise en page parent?


Ils seront tous supprimés avec la mise en page parent.


5 Réponses :


5
votes

Vous pouvez supprimer une vue enfant d'un parent en appelant SupprimerView (vue Affichage), par exemple comme celui-ci: XXX


1 commentaires

Oui, mais comment vais-je le supprimer sans l'identifiant attribué à tout. Les mises en page et les vues sont créées par programme.



14
votes

Vous pouvez appeler vue.sevisiblighililililal (vue.gone) si vous souhaitez le supprimer de la mise en page, ou vue.sevisibilité (vue.Invisible) si vous venez de vouloir le cacher.


1 commentaires

Cela cache la vue, mais ne l'enlève pas de la pile.



4
votes

supposant que votre identifiant linearlayout est my_linear_layout, faites-le simplement dans votre ONCLickListener: xxx

dans votre XML, assurez-vous de mettre l'identifiant: xxx


7 commentaires

Il n'y a pas d'identifiant attribué à la disposition linéaire car la mise en page est ajoutée par programme.


Dans ce cas, vous pouvez directement faire ll.setvisibilité (vue.gone);


Comment l'application saura-t-elle que LL est la mise en page parent où le bouton est contenu?


La méthode s'appliquera au linearlayout et tous ses enfants.


Ce que je veux dire, c'est qu'il y a beaucoup de mises en page linéaire. Et dans chaque mise en page linéaire, il y a une disposition relative où le bouton est contenu. Et il n'y a pas d'identifiant attribué sur les mises en page, les vues et les boutons. Comment vais-je définir le onclicklistener () ?


Je vois. Votre problème est plus complexe que je pensais d'abord. Peut-être que vous pouvez mettre vos linearlayouts dans une liste (arraylist par exemple). Ensuite, je suppose que vous pourrez l'obtenir de votre bouton. Pourriez-vous publier le code de vos deux fichiers XML s'il vous plaît?


Les fichiers XML ne sont pas nécessaires, je suppose. Parce que les mises en page sont créées par programme. Les informations par configuration et TextView sont stockées et récupérées à partir d'une préférence partagée.



16
votes

Trouvez d'abord votre présentation parent à l'aide de

child.removeAllViews();


3 commentaires

Je n'ai pas attribué d'identité à l'enfant que je veux supprimer. Comment puis-je faire cela sans avoir besoin d'attribuer un ID pour chaque mise en page, car cela devrait être fait par programme?


Qu'est-ce qui compte ici?


Vous pouvez obtenir des enfants en mode de mise en page en utilisant ll.getchildcount () ;



0
votes

Vous pouvez le faire comme obtenir l'identifiant de l'élément actuellement cliqué et attribué à la mise en page racine xxx pré>

et retirez à l'aide de ce code indiqué ci-dessous: P>

linearLayout.removeView(layout);


2 commentaires

La variable v ne semble pas apparaître dans la question de l'OP.


Oui, je donne l'exemple, v est la vue sur Onclick (View V) .Vous pouvez accéder à l'élément en utilisant "V" pour obtenir leurs identifiants