2014-02-21 3 views
2

Я пытаюсь сделать приложение, которое отображает большое количество текста и изображений в определенном макете, когда пользователь нажимает на соответствующий элемент списка. Поскольку мне нужны конкретные макеты .xml для отдельных «разделов», я хочу, чтобы только макет фрагмента изменился на соответствующую главу.Изменение фрагмента фрагмента динамически вместо замены фрагментов Android SDK

Googling говорит мне, что я могу сделать это с помощью фрагментов, но, насколько я понимаю, мне нужны отдельные классы фрагментов и .xml-макеты для каждой главы, которую я хочу реализовать. С 2 или 3 разделами, которые можно сделать, но с большим количеством глав, которые станут, как я думал, не проще просто сохранить два фрагмента (один со списком и один с текстом главы), но динамически изменить макет второй фрагмент, если пользователь нажимает на элемент в списке.

Можно ли это сделать с помощью некоторого кода, подобного этому (просто вслух)?

Int[] layouts = { 
     {R.layout.chapter1, R.layout.chapter2, R.layout.chapter3} 
    }; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    index = intent.getIntent("index", 0); 
    return inflater.inflate(layouts[index], container, false); 
} 

Или есть другой способ достичь этого?

ответ

3

Фрагменты в их ядре представляют собой обертки, содержащие состояния представлений. Вы можете использовать их для других целей, таких как обработка ресурсов, но в основном это только сегменты состояния Activity. Скорее всего, было бы неплохо иметь фрагмент для каждой отдельной главы, если каждая глава не имеет своего уникального состояния, которое необходимо сохранить. Однако, если представления являются статическими, то один фрагмент - это все, что вам действительно нужно.

В этом случае, вы просто должны иметь метод, как это:

public void setChapter(int chapter) 
{ 
    Context ctx = getActivity(); 
    if(ctx == null) { 
     // detached from Activity, so bail. 
     return; 
    } 

    if(chapter > layouts.length) { 
    return; 
    } 

    ViewGroup container = (ViewGroup) getView().findViewById(R.id.chapter_container); 
    container.removeAllViews(); 
    View chapterInflater = LayoutInflater.from(ctx).inflate(layouts[chapter], container); 
} 

Так что это будет уничтожить все точки зрения в настоящее время в контейнере, надуть новый, и поместить его в контейнер (наиболее вероятно, простой FrameLayout).

Код в исходном вопросе может использоваться для инициализации фрагмента, если вы хотите открыть его в определенный момент. onCreate_() методы вызывается только тогда, когда элементы «построены» или «созданы». onCreateView() не будет вызываться снова, поэтому вам нужен способ изменения макета после его установки.

+0

Итак, как я понимаю, ваш метод setChapter должен быть помещен в списокFragment, а затем у меня будет метод onClick с чем-то вроде _setChapter (i) _ где i - это идентификатор элемента, на который я нажал listView. Это правильно? – Thijs93H

+0

Нет. Предполагая, что ваш массив 'layouts' - это все главы для отображения. Это будет в любом фрагменте, отображающем макеты. Ваш ListView может получить фрагмент, вызвав метод getFragmentManager(). FindFragmentBy ___(); '. Затем он просто вызывает 'setChapter()' на возвращаемом фрагменте. – DeeV

+0

Ах, я понимаю! – Thijs93H

Смежные вопросы