2015-07-01 1 views
0

Я использую TableLayout как простой DataGrid в своем приложении. Строки добавляются в код. Проблема в; когда я меняю ориентацию экрана, на старой панели появляется новый макет таблицы.Дублирование Android TableLayout при изменении ориентации

Файл макета:

. 
. 
. 
<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/scrollView" 
    android:fillViewport="false" 
    > 

    <TableLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/dataGrid" 
     android:divider="?android:attr/dividerHorizontal" 
     android:showDividers="middle|end"> 

    </TableLayout> 
</ScrollView> 

</TableLayout> 

Функция вызывается для создания записей испытаний. Я называю это из public View onCreateView моего фрагмента.

private void fillDataGrid(TableLayout dataGrid,Context context) 
{ 

    int columnCount = 5; 
    int rowCount = 30; 

    List<TextView> fields = new ArrayList<>(); 

    TableRow row; 

    dataGrid.removeAllViews(); 
    dataGrid.invalidate(); 
    dataGrid.setStretchAllColumns(true); 

    for (int j=0;j<rowCount;j++) 
    { 
     row = new TableRow(context); 

     if (j%2 != 0) 
      row.setBackgroundColor(getResources(). 
       getColor(R.color.highlighted_text_material_light)); 

     for (int i = 0; i < columnCount; i++) 
     { 
      TextView field; 
      field = new TextView(context); 
      field.setText("field " + i); 
      fields.add(field); 
      row.addView(field); 
     } 

     dataGrid.addView(row); 
    } 
} 

Я знаю об избыточности List<TextView> fields = new ArrayList<>();. Я продолжаю использовать его позже.

Версии SDK:

minSdkVersion 14 
    targetSdkVersion 22 

ошибка встречается, в android.app.Fragment классе.

То, что я пытался до сих пор:

  1. Calling Invalidate() и requestLayout() методы для моего DataGrid TableLayout, родительским TableLayout и ScrollView.
  2. Попытка понять, сколько TableLayouts или ScrollViews дублированы. Результат был нет согласно моему тестовому коду.
  3. Добавление строк в xml и игнорирование функции fillDataGrid() не помогло решить проблему. Хотя строки добавляются/обрабатываются только в xml.

Что я узнал:

  • Это не вынести вопрос. Потому что когда я вызвал scrollView.setVisibility(View.INVISIBLE);, я все еще могу прокрутить дублированный TableLayout.

Вы можете посмотреть скриншоты, которые описывают ситуацию ниже.

спасибо.

Normal Table Layout

Error occured

ответ

0

Я нашел проблему. Я использовал,

getFragmentManager().beginTransaction() 
         .add(R.id.mainContainer, fragMain.newInstance("","")) 
         .commit(); 

, чтобы прикрепить свой первый фрагмент к моей основной деятельности в методе onCreate(). Поскольку 'onCreate()' вызывается при изменении ориентации, фрагмент был добавлен несколько раз.Правильный код:

getFragmentManager().beginTransaction() 
         .replace(R.id.mainContainer, fragMain.newInstance("","")) 
         .commit(); 

спасибо.

0

Я предполагаю, что у вас есть утечка памяти там ... где-нибудь в вашем коде есть сильная ссылка, которая сохраняет вид из сборщика мусора ...

Что это объект dataGrid, который вы даете fillDataGrid() в своем фрагменте? Может быть, вот недостаток в вашей конструкции

+0

«приватная статическая таблица данных данных» была моей декларацией. Я сделал локальную переменную и нестационарную, но это не сработало. Также я забыл упомянуть, что я добавил строки вручную в xml-файл и не манипулировал TableLayout в коде и произошла ошибка. – Taha

+0

хорошо, тогда сделайте MAT и узнайте, где вы держите свои ссылки: см. Здесь: https://developer.android.com/tools/debugging/debugging-memory.html или здесь: http: //android-developers.blogspot. де/2011/03/память-анализ-для-android.html –