RemoveAllViews не удаляет просмотры

Я пытаюсь удалить все дочерние представления линейного макета, но ничего не удалено, странная вещь – тот же самый код, который работает в другом приложении. Вот пример кода метода, который заполняет choiceHolder всякий раз, когда выбирается вкладка в нем (я удаляю все представление и отмечаю выбранный и закладываю на основе этого:

/** 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 – LinearLayout .

И вот картина, показывающая проблемы: Введите описание изображения здесь

Хорошо, что все мое приложение ведет себя одинаково, даже если обновлять список внутри, я все еще вижу список, который был раньше.

Решение, которое я нашел для этой проблемы, – удалить тег fullScreen из активности в AndroidManifest это было так:

 <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> Размер <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> 

Удалив android:theme="@style/FullscreenTheme" из активности BoxsMainActivity все работало. Надеюсь, это поможет кому-то …

Вы пробовали использовать .invalidate () или .postInvalidate () на choiceHolder?

В вашем xml-файле вы можете определить для тех же позиций на вашей странице больше макетов, пусть говорят, что у вас есть поверхность страницы, вы можете определить Layout 1 и Layout 2 с теми же свойствами, и у вас будет видимость, В вашем коде вы измените это при некоторых действиях, и вы переключите видимость.

Лучший способ убедиться, что что-то работает через представление, – запустить его через сообщение: например

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

Проблема может заключаться в том, что choiceHolder должен быть объявлен как «final» для вызова в «onClick» – размещение вызовов View в runnable, чтобы он не был объявлен как final, должен его исправить. Не существует ошибки компилятора, потому что она действительна для вызова метода, и вызов метода может по-прежнему приводить к появлению представления на экране, даже если родительский макет («choiceHolder») не сохранил ссылку на него, что позволяет удалить его.