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; } }
5 Réponses :
Vous pouvez supprimer une vue enfant d'un parent en appelant SupprimerView (vue Affichage), par exemple comme celui-ci:
Oui, mais comment vais-je le supprimer sans l'identifiant attribué à tout. Les mises en page et les vues sont créées par programme.
Vous pouvez appeler vue.sevisiblighililililal (vue.gone) code> si vous souhaitez le supprimer de la mise en page, ou
vue.sevisibilité (vue.Invisible) code> si vous venez de vouloir le cacher. p>
Cela cache la vue, mais ne l'enlève pas de la pile.
supposant que votre identifiant linearlayout est my_linear_layout, faites-le simplement dans votre ONCLickListener: dans votre XML, assurez-vous de mettre l'identifiant: p>
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); code>
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 code> 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 () code>?
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.
Trouvez d'abord votre présentation parent à l'aide de
child.removeAllViews();
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 () code>;
Vous pouvez le faire comme obtenir l'identifiant de l'élément actuellement cliqué
et attribué à la mise en page racine et retirez à l'aide de ce code indiqué ci-dessous: P> linearLayout.removeView(layout);
La variable v code> 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
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 CODE> 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.