2013-06-19 3 views
1

Я хочу, чтобы добавить фрагмент в заголовок моей ListView, что может быть сделано с помощью XML, как здесь:Как вы можете динамически добавлять фрагмент в заголовок списка?

How to embed view of Fragment in the header of a ListFragment

Но я хочу, чтобы передать аргументы этого фрагмента, который, насколько я могу сказать, может быть сделано только динамически (например, getFragmentManager().beginTransaction().add().commit())

Так я Tyring:

getActivity().getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.my_fragment_container, fragment) 
       .commit(); 

my_fragment_container в заголовке, но я получаю:

No view found for id 0x7f0a0089 (com.twitter.android:id/my_fragment_container) for fragment MyFragment {423d3320 #4 id=0x7f0a0089} 

Возможно ли динамическое добавление фрагмента в заголовок? Или если я могу сделать это только с помощью xml, есть ли способ передать ему аргументы (например, setArguments())?

+0

Попробуйте установить вид заголовка в 'FrameLayout', а затем добавить в ваш фрагмент. – rciovati

ответ

5

Вещь ListView прикрепляет заголовок в какой-то момент позже, чем onResume().

Таким образом, вы должны добавить только фрагмент после Заголовок заголовка добавляется в иерархию представления. Кроме того, вам нужно удалить фрагмент из FragmentManager в onPause(), потому что в противном случае, возвращаясь к этому фрагменту, FragmentManager все равно будет знать ранее добавленный фрагмент и попытаться найти вид по указанному id. Если будет недоступно, пока до ListView не присоединяет заголовок.

Существует также полезная информация. Если вы:

  1. Пролистайте список вниз
  2. Нажмите некоторый элемент
  3. Перейти на другой экран/активности
  4. Нажмите HW назад

Теперь ListView позиционируется выглядеть так же, как это было перед выходом на экран в (3). Однако, HeaderFragment еще не прилагается. Затем, если вы прокрутите страницу до тех пор, пока заголовок не станет видимым, он будет прикреплен. Затем добавим HeaderFragment в представление заголовка и изменения высоты заголовка. И затем, странные вещи происходят в ListView. Я еще не решил это.

Если ваш HeaderFragment имеет фиксированную высоту, вы можете установить вид заголовка таким высоким и избежать этой проблемы в целом.

Предполагая, что вы показываете ListView в Fragment, вот как я решил это:

public class MyListFragment extends Fragment { 

    private Fragment headerFragment; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     headerFragment = HeaderFragment.newInstance(); 
    } 

    @Override 
    public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.list_layout, container, false); 

     ListView list = (ListView) v.findViewById(R.id.list); 
     View headerContainer = inflater.inflate(R.layout.list_header_container); 
     list.addHeaderView(headerContainer); 

     headerContainer.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
      @Override public void onViewDetachedFromWindow(View v) {} 
      @Override public void onViewAttachedToWindow(View v) { 
       getChildFragmentManager() 
        .beginTransaction() 
        .add(R.id.list_header_container, headerFragment) 
        .commit(); 
      } 
     }); 

     // Set adapter etc 

     return v; 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getChildFragmentManager() 
      .beginTransaction() 
      .remove(headerFragment) 
      .commit(); 
    } 
} 

list_header_container.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/list_header_container" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 
+0

Спасибо за ответ, но я решил это решить, установив заголовок из раздутого xml. Я поместил пользовательский фрагмент в xml, который подрезал фрагмент, который я действительно хотел, и жестко закодировал аргументы в конструкторе. – cstack

+0

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

+0

Какие идентификаторы не могут найти? Я думаю, что первые 3 параграфа ответа конкретно касаются этого случая. Или я чего-то не хватает? – mindeh

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