Intereting Posts
Тост, созданный в IntentService, никогда не уходит Android Lint: игнорировать библиотечные проекты Gradle: как включить локальную банку из зависимого Java-проекта в сборке Android? Рекомендуемый способ загрузки (неинтерактивных) анимаций (сделанных с использованием Maya) в OpenGL ES на iOS и Android Чтение данных из электронных таблиц google docs Android отправляет изображение на сервер через MultipartEntity – настройка Content-type? Внедрение OAuth2 с учетными данными пароля владельца ресурса на Android Постоянное распознавание речи Android возвращает ERROR_NO_MATCH слишком быстро Реагировать. Systrace не показывает JS и Native Modules Thread Android – быстрый способ получить скрытые изображения и папки Open failed: EACCES (разрешение отклонено) Как я могу добавить facebook SDK в проект Android? Parse.com datastore не закрепляет более одного несохраненного объекта Установите первоначально выбранный индекс / id объекта в BottomNavigationView Есть ли 9-патч-загрузчик для iPhone?

Добавить фрагмент в виде заголовка ListView

Я ориентирую приложение Android на API 15 и минимум 8. Поэтому я использую библиотеку поддержки для управления фрагментами. У меня есть набор фрагментов, которые я использую в нескольких частях приложения.

Теперь в работе у меня есть ListView в макете:

<ListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/listOfEvents" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> 

Я хотел бы добавить фрагмент моего в заголовок ListView. Я пробовал это:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.event_open); listOfEvents = (ListView) findViewById(R.id.listOfEvents); Fragment fragment = new SortingStandardFragment(); getSupportFragmentManager() .beginTransaction() .add(fragment, null) .commit(); View fragmentView = fragment.getView(); // problem: fragment is null! listOfEvents.addHeaderView(fragmentView); } 

Но я получаю сообщение об ошибке, так как instance.getView () возвращает значение null (ссылки api reference docs говорят, что я должен поместить идентификатор GroupView в вызов add, но где я должен поместить GroupView в макет? Есть ли другой способ попасть в метку ?

Solutions Collecting From Web of "Добавить фрагмент в виде заголовка ListView"

Я решил это, создав новый макет, содержащий только фрагмент, который мне нужен в заголовке списка:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/myFragmentEmbedded" android:name=".SortingStandardFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

И в коде действия:

 LayoutInflater inflater = getLayoutInflater(); header = inflater.inflate(R.layout.myLayout, null); listOfEvents.addHeaderView(header); SortingStandardFragmenttitleFragment = (SortingStandardFragment) getSupportFragmentManager() .findFragmentById(R.id.myFragmentEmbedded); 

Мне нужна версия без необходимости прибегать к еще одному файлу xml, так что вот оно:

 Fragment fragment = ... FrameLayout v = new FrameLayout(getActivity()); v.setId(42); listView.addHeaderView(v, null, false); FragmentManager fm = getActivity().getSupportFragmentManager(); fm.beginTransaction().add(v.getId(), fragment).commit(); 

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

  • События жизненного цикла отправляются в поток пользовательского интерфейса
  • Fragment.onCreateView – это событие жизненного цикла
  • Activity.onCreate – это событие жизненного цикла
  • .getView() возвращает созданный вид в Fragment.onCreateView
  • commit сообщение о событии жизненного цикла

Заключение: результат commit виден из следующего цикла, который после onCreate .

Можно попытаться принудительно commit с помощью getSupportFragmentManager().executePendingTransactions() после чтения документации на нем.