Что делать с ListActivity/MapActivity при преобразовании во фрагменты с помощью библиотеки совместимости?

Я конвертирую существующее приложение в Fragments API, используя библиотеку совместимости. Я читал, что вы должны обновить классы, которые расширяют Activity, чтобы теперь использовать FragmentActivity. В большинстве случаев это нормально, но как насчет классов, расширяющих ListActivity или MapActivity? Каков предпочтительный способ справиться с этим? Я надеялся, что существует ListFragmentActivity или что-то в этом роде, но я его не вижу.


person CACuzcatlan    schedule 27.06.2011    source источник


Ответы (4)


Существует ListFragment: http://developer.android.com/reference/android/app/ListFragment.html

Для MapActivity, к сожалению, вам придется продолжать использовать это; для него нет Fragment API.

person hackbod    schedule 27.06.2011
comment
Спасибо, но ListFragment не является FragmentActivity, поэтому у меня проблемы с моей структурой наследования, которая ожидает FragmentActivity. Чем больше я работаю над этим, тем больше кажется, что его нужно будет полностью переписать, а не просто обновить типы классов и небольшие корректировки, как заявлял Google. - person CACuzcatlan; 27.06.2011
comment
@CACuzcatlan: Вы можете указать ссылку, где Google заявил, что все, что вам нужно, это просто обновить типы классов и небольшие корректировки. При этом преобразование ListActivity в ListFragment довольно просто, проще, чем большинство миграций активности-фрагментов, ИМХО. - person CommonsWare; 28.06.2011
comment
Извините, я преувеличил. Я должен сказать, что это было впечатление, которое я получил. - person CACuzcatlan; 28.06.2011
comment
В ListFragment я не могу использовать getActionBar(), но хорошо в FragmentActivity. Что я должен делать? - person Waza_Be; 18.10.2011
comment
Панель действий принадлежит всему окну. Ваши фрагменты должны поделиться им. Вам просто нужно подумать о том, как вы хотите поделиться этим, и делать все, что вы решите. Если вам нужно получить его напрямую из фрагмента, используйте Fragment.getActivity(). Если ваш фрагмент помещает в него действия, просто заполните меню в своем фрагменте, как обычно. Этот код показывает размещение виджета поиска: developer.android.com/resources/samples/ApiDemos/src/com/ - person hackbod; 19.10.2011

Вот что я делаю при преобразовании ListActivity в API фрагментов:

  1. Замените lv = getListView(); на lv = (ListView) findViewById(android.R.id.list);

  2. Замените setListAdapter(adapter); на lv.setAdapter(adapter);

  3. Если вы переопределили onListItemClick(), замените его на lv.setOnItemClickListener(new ListView.OnItemClickListener() {...

  4. Вам придется установить пустой вид (который показывает, когда нет результатов) вручную: lv.setEmptyView(findViewById(android.R.id.empty));

    Если я использую CursorLoader, я обычно помещаю это в onLoadFinished():

    // if there are no results
    if (data.getCount() == 0) {
        // let the user know
        lv.setEmptyView(findViewById(android.R.id.empty));
    } else {
        // otherwise clear it, so it won't flash in between cursor loads
        lv.setEmptyView(null);
    }
    
  5. Говоря о загрузчиках курсоров, я также преобразую действие для использования CursorLoader, если оно к этому моменту еще нет

person bmaupin    schedule 02.08.2012
comment
Достаточно ли просто добавить новый метод getListView() в FragmentActivity, который возвращает ListView, а затем добавить еще один метод setListAdapter(адаптер), вызывающий setAdapter(адаптер) для этого действия? - person ankushg; 15.01.2013
comment
@Ankush, это тоже сработает. Вы будете искать иерархию представлений каждый раз, когда будете вызывать getListView(), что немного менее эффективно. - person Carlos P; 24.06.2014

По крайней мере, для ListActivity вы можете изменить его на FragmentActivity (все еще реализуя OnItemCLickListener) и заменить:

lv=getListView() to lv=(ListView) findViewById(R.id.your_list_view_id)

а также

setListAdapter(favAdapter) to lv.setAdapter(адаптер)

person Billy Tobon    schedule 21.09.2011
comment
Если идентификатор вашего ListView @android:id/list, вы можете сделать это: ListView lv = (ListView) findViewById(android.R.id.list);. Вы также можете заменить onListItemClick() на lv.setOnItemClickListener(new ListView.OnItemClickListener() {... - person bmaupin; 16.01.2012
comment
Я также прокомментировал это ответ @bmaupin, но можем ли мы просто создать методы getListView(), которые возвращают (ListView) findViewById(R.id.your_list_view_id) и setListAdapter(adapter), который делает getListView().setAdapter(adapter) для позаботиться об этих вещах или это не сработает? - person ankushg; 15.01.2013
comment
@Ankush, это тоже сработает. Вы будете искать иерархию представлений каждый раз, когда будете вызывать getListView(), что немного менее эффективно. - person Carlos P; 24.06.2014

Можно преобразовать ListActivity в FragmentActivity.

  1. Продлить FragmentActivity вместо ListActivity
  2. Создайте res/layout/your_activity.xml с пустым ListView с android:id="@+id/your_activity_list_view"
  3. В onCreate вашей деятельности setContentView(R.layout.your_activity);
  4. Также измените onCreate своей активности, чтобы явно получить ListView, которое вы только что раздули.

.

ListView lv = (ListView) findViewById(R.id.your_activity_list_view);
lv.setAdapter(adapter);
lv.setOnItemClickListener(this);
person Ellesmera    schedule 12.08.2013