2014-01-10 4 views
5

Ich versuche, alle untergeordneten Ansichten eines linearen Layouts zu entfernen, aber nichts ist entfernt, die seltsame Sache ist der gleiche Code funktioniert in einer anderen Anwendung. Hier ist der Beispielcode der Methode, die die choiceHolder bevölkern, wenn ein Tab darin ausgewählt (ich alle Ansicht entfernen und die ausgewählten markieren und füllen auf das stützen.RemoveAllViews nicht Ansichten entfernen

/** a method to fill the upper bar where we choose the {@link CategoriesMyBox} 
* @param category 
*/ 
private void fillNavigationBar(CategoriesGetter category) { 
    TextView categoryTxt = new TextView(getActivity()); 
//  categoryTxt.setAllCaps(true); 
     LinearLayout.LayoutParams txtParams; 
     if (category.isSelected() /*|| (category.getId_categorie()==0 && allselected)*/) { 
     txtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     txtParams.gravity = Gravity.CENTER; 
     categoryTxt.setGravity(Gravity.CENTER); 
     categoryTxt.setTextSize(categoryTxt.getTextSize()); 
     txtParams.setMargins(10, 0, 10, 0); 
     categoryTxt.setPadding(5, 5, 5, 5); 
     if (category.getId_categorie() == 0) { 
      categoryTxt.setText(getResources().getString(R.string.all_boxs)); 
     }else { 
      categoryTxt.setText(category.getName_categorie()); 
     } 
     categoryTxt.setTextColor(Color.GREEN); 
     categoryTxt.setBackgroundDrawable(getResources().getDrawable(R.drawable.back_categories_selected)); 
//   categoryTxt.setBackgroundColor(Color.parseColor("#E3E8E6")); 
     categoryTxt.setTag(category); 


    }else { 

     txtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     txtParams.setMargins(10, 0, 10, 0); 
     categoryTxt.setGravity(Gravity.CENTER); 
     categoryTxt.setPadding(5, 5, 5, 5); 
     txtParams.gravity = Gravity.CENTER; 
     if (category.getId_categorie() == 0) { 
      categoryTxt.setText(getResources().getString(R.string.all_boxs)); 
     }else { 
      categoryTxt.setText((category.getName_categorie())); 
     } 
     categoryTxt.setTextColor(Color.GRAY); 
     categoryTxt.setBackgroundDrawable(getResources().getDrawable(R.drawable.back_categories)); 
//   categoryTxt.setBackgroundColor(Color.parseColor("#777777")); 
     categoryTxt.setTag(category); 
    } 
    choiceHolder.addView(categoryTxt, txtParams); 
    categoryTxt.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      CategoriesGetter cat = (CategoriesGetter)v.getTag(); 
      id_cat = cat.getId_categorie(); 
      for (int i = 0; i < categories.size(); i++) { 
       categories.get(i).setSelected(false); 
      } 
       cat.setSelected(true); 
    //    choiceHolder.removeAllViews(); 
      /*for(int i=0; i<((ViewGroup)choiceHolder).getChildCount(); ++i) { 
       View nextChild = ((ViewGroup)choiceHolder).getChildAt(i); 
       choiceHolder.removeView(nextChild); 
      }*/ 
      while (((ViewGroup)choiceHolder).getChildCount() >0) { 
       View nextChild = ((ViewGroup)choiceHolder).getChildAt(0); 
       choiceHolder.removeView(nextChild); 
      } 
//    choiceHolder.removeAllViewsInLayout(); 
      for (int i = 0; i < categories.size(); i++) { 

       fillNavigationBar(categories.get(i)); 
      } 
      callbackCategory.selectCategory(cat.getId_categorie()); 





     } 
    }); 
} 

choiceHolder ist ein LinearLayout

und hier ist ein Bild, um die Probleme zeigt. enter image description here

Nun meine Anwendung wird auf die gleiche Art und Weise verhalten, auch wenn die Aktualisierung der Liste innerhalb ich kann immer noch die Liste sehen, die zuvor

+0

Sie müssen viel mehr Code posten, im Moment kann man nur raten, was Sie falsch machen: Vergessen Sie vielleicht, die unerwünschten Elemente aus der 'categories' Liste zu entfernen? –

+0

es ist nicht nur ein Problem in der Liste, aber in jeder Komponente wie der Preisklasse ist eine Bibliothek, die funktioniert gut in vielen meiner Anwendungen, aber hier sehen Sie die visuelle links dahinter ist es wie ein Stapel von Bildern, auch wenn ich ein Fragment in ersetzen ein Rahmen Ich kann immer noch das vorherige Fragment in der Rückseite sehen. –

+1

SHOW XML UND MEHR CODES – keshav

Antwort

4

die Lösung, die ich für dieses Problem gefunden ist den fullScreen Thema Tag aus der Tätigkeit in den AndroidManifest entfernt es so war:

<application 
    android:name="com.paperpad.mybox.ApplicationInit" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.paperpad.mybox.activities.SplashActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.crashlytics.ApiKey" 
     android:value="023e7fe8a4a93f93ffe7510201929d081b125313" /> 

    <activity 
     android:name="com.paperpad.mybox.activities.BoxsMainActivity" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:label="@string/title_activity_boxs_main" 
     android:theme="@style/FullscreenTheme" > 
    </activity> 
    <activity 
     android:name="com.paperpad.mybox.LoginActivity" 
     android:label="@string/title_activity_login" 
     android:windowSoftInputMode="adjustResize|stateVisible" > 
    </activity> 
</application> 

von android:theme="@style/FullscreenTheme" aus der Tätigkeit zu entfernen BoxsMainActivity alle gearbeitet. hoffe, das hilft jemandem ...

1

Hav Haben Sie versucht, .invalidate() oder .postInvalidate() für den choiceHolder?

+0

Dies behebt nicht das Problem, es ist nicht nur ein Problem mit dem ChoiceHolder, sondern mit den ganzen Ansichten der Anwendung. –

+0

Die Tatsache, dass es "endgültig" ist, bedeutet, dass Sie wahrscheinlich diesen Codeblock initialisiert haben, bevor er die Ansichten enthielt. Wenn Sie es verwenden, hat es sie wahrscheinlich nicht richtig hinzugefügt. Wir müssen mehr Code sehen. Ich habe das mehrmals in meinem Code gehabt ... – Jim

+0

@Jim der choiceHolder ist eine globale Variable (nicht eine letzte), die in der onCreateView-Methode initialisiert wurde. –

1

In Ihrer XML-Datei können Sie für die gleichen Positionen auf Ihrer Seite mehr Layouts definieren. Sagen wir, Sie haben eine Oberfläche auf der Unterseite der Seite, Sie können Layout 1 und Layout 2 mit den gleichen Eigenschaften definieren Die Sichtbarkeit ist verschwunden, in Ihrem Code ändern Sie dies bei einigen Aktionen und Sie wechseln die Sichtbarkeit.

2

Der beste Weg, um sicher etwas zu machen, läuft über eine Ansicht, es über einen Beitrag zu laufen ist: zB

someView.post(new Runnable(){ 
    @Override 
    public void run() 
    { 
     someView.removeAllViews(); 
    } 
} 
+2

Ich habe versucht, dass es zu entfernenAllViews, aber tut nichts. –

+0

Danke, es hat für mich funktioniert. :) –

1

Das Problem könnte sein, dass choiceHolder als „final“ deklariert werden muss aufgerufen werden " onClick "- Wenn Sie die View-Aufrufe in eine ausführbare Datei einfügen, damit sie nicht als endgültig deklariert wird, sollten Sie sie beheben. Es gibt keinen Compilerfehler, weil es zulässig ist, eine Methode aufzurufen, und der Methodenaufruf kann immer noch dazu führen, dass die Ansicht auf dem Bildschirm angezeigt wird, obwohl das übergeordnete Layout ("choiceHolder") keine Referenz enthält, die es ermöglicht, sie zu entfernen.

+0

Der 'ChoiceHolder' wird als globale Variable deklariert. Die Sache, die die gleiche Arbeit an 35 Anwendung habe, habe ich bereits das gleiche Prinzip ... –