onCreate на фрагменте всегда начинаются с плохой позиции

Ваш первый порт вызова должен быть документацией , который объясняет это разумно ясно:

Брошено, чтобы указать, что к массиву был обращен незаконный индекс. Индекс является либо отрицательным, либо большим или равным размеру массива.

Так, например:

int[] array = new int[5];
int boom = array[10]; // Throws the exception

Как избежать этого. ., не делайте этого. Будьте осторожны с вашими индексами массива.

Одной из проблем, с которыми иногда сталкиваются люди, является то, что массивы 1-индексируются, например

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
    System.out.println(array[index]);
}

Это пропустит первый элемент (индекс 0 ) и выдают исключение, когда индекс равен 5. Действующие индексы здесь 0-4 включительно. Правильный, идиоматический оператор for здесь будет:

for (int index = 0; index < array.length; index++)

(Предполагается, что вы нуждаетесь в индексе, конечно. Если вы можете использовать расширенный для цикла, сделайте это.)

-1
задан andrea ciuffoli 16 January 2019 в 14:02
поделиться

2 ответа

Моя идея состоит в том, что функция onCreate каждого фрагмента должна вызываться после пролистывания, так что перед созданием следующей страницы.

Из "swipe" я предполагаю, что вы размещаете фрагменты в ViewPager. Он имеет ограничение экрана за пределами страницы , которое контролирует, сколько фрагментов предварительно создано на каждой стороне текущей страницы. По умолчанию это 1, поэтому на странице 0 также создается фрагмент страницы 1.

Если вы действительно хотите, чтобы фрагмент onCreate() запускался именно тогда, когда фрагмент становится видимым, установите для предела страницы за пределами экрана значение 0. Установка предела для страницы в 0 не работает, так как минимум по умолчанию 1.

Если вам просто интересно определить, когда фрагмент становится видимым, вы можете подключиться к setUserVisibleHint() .

0
ответ дан laalto 16 January 2019 в 14:02
поделиться

хорошо решено с этим

private boolean isViewShown = false;
private boolean isFragmentLoaded = false;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser   && !isFragmentLoaded) {
        isViewShown = true;
        TableLayout table = (TableLayout)getActivity().findViewById(R.id.table);
        display_album(table);

        isFragmentLoaded = true;
    } else {
        isViewShown = false;
    }
}
0
ответ дан andrea ciuffoli 16 January 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: