2011-06-27 6 views
15

Konwertuję istniejącą aplikację na fragment API przy użyciu biblioteki zgodności. Czytałem, że powinieneś zaktualizować klasy, które rozszerzają aktywność, aby teraz używać FragmentActivity. W większości przypadków jest to w porządku, ale co z klasami, które rozszerzają ListActivity lub MapActivity? Jaki jest preferowany sposób obsługi tego? Miałem nadzieję, że istnieje ListFragmentActivity lub coś podobnego, ale ja go nie widzę.Co zrobić z ListActivity/MapActivity podczas konwersji do fragmentów przy użyciu biblioteki zgodności?

Odpowiedz

5
Nie

jest ListFragment: http://developer.android.com/reference/android/app/ListFragment.html

Dla MapActivity niestety trzeba będzie nadal korzystać z tego; nie ma w tym celu API Fragmentu.

+2

Dzięki, ale ListFragment nie jest narzędziem FragmentActivity, więc mam problemy z moją strukturą dziedziczenia, która oczekuje od FragmentActivity. Im więcej pracuję nad tym, tym bardziej wydaje się, że będzie to wymagać całkowitego przepisania, a nie tylko aktualizacji typów klas i drobnych poprawek, takich jak Google. – CACuzcatlan

+2

@CACuzcatlan: Możesz podać link, w którym "Google" "twierdzi", że wszystko, czego potrzebujesz, to "tylko aktualizowanie typów zajęć i drobnych poprawek". Mając to na uwadze, konwertowanie "ListActivity" na "ListFragment" jest dość proste, prostsze niż większość migracji migracji fragmentów, IMHO. – CommonsWare

+0

Przepraszam, przesadziłem. Powinienem powiedzieć, że to było wrażenie, które dostałem. – CACuzcatlan

8

Przynajmniej dla ListActivity Można go zmienić na FragmentActivity (nadal wdrażaniu OnItemCLickListener) i wymienić:

LV = getListView(), aby LV = (ListView) findViewById (R.id.your_list_view_id)

i

setListAdapter (favAdapter) do lv.setAdapter (adapter)

+2

Jeśli identyfikator twojego ListView to '@ android: id/list', możesz to zrobić: 'ListView lv = (ListView) findViewById (android.R.id.list);'. Będziesz także chcieć zamienić 'onListItemClick()' na 'lv.setOnItemClickListener (new ListView.OnItemClickListener() {...' – bmaupin

+1

Skomentowałem to również w odpowiedzi @bmaupin, ale czy możemy po prostu tworzyć metody "getListView() "który zwraca" (ListView) findViewById (R.id.your_list_view_id) "i" setListAdapter (adapter) ", który robi" getListView() .setAdapter (adapter) ", aby zająć się tymi rzeczami, czy też nie zadziałałoby? – ankushg

+0

@Akush, który też by działał.Będziesz przeszukiwał hierarchię widoków za każdym razem, gdy wywołasz metodę getListView(), która jest marginalnie mniej wydajna –

12

to co mam zrobić, gdy przekształcenie ListActivity API fragmenty:

  1. Wymień lv = getListView(); z lv = (ListView) findViewById(android.R.id.list);

  2. Wymień setListAdapter(adapter); z lv.setAdapter(adapter);

  3. Jeśli nadpisane onListItemClick(), wymień go lv.setOnItemClickListener(new ListView.OnItemClickListener() {...

  4. Musisz ustawić pusty pogląd (który pokazuje gdy nie ma wyników) ręcznie: lv.setEmptyView(findViewById(android.R.id.empty));

    Jeśli używam CursorLoader, ja normalnie umieścić to w 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. Mówiąc o cursor loaders, będę również konwertować aktywność do korzystania CursorLoader jeśli nie jest już w tym momencie

+1

Czy wystarczy dodać nową metodę getListView() do FragmentActivity, która zwróciła ListView a następnie dodać inną metodę setListAdapter (adapter), która nazwał setAdapter (adapter) dla tego działania? – ankushg

+0

Twoje rozwiązanie działało idealnie, thx 4 udostępnij je! – vinidog

+0

@Ankush, które też by działały. ng hierarchii widoku przy każdym wywołaniu funkcji getListView(), która jest marginalnie mniej wydajna. –

0

Możliwe jest przekonwertowanie ListActivity na FragmentActivity.

  1. Extend FragmentActivity zamiast ListActivity
  2. Tworzenie res/layout/your_activity.xml z pustym ListView z android:id="@+id/your_activity_list_view"
  3. W onCreate swojej działalności setContentView(R.layout.your_activity);
  4. zmienić Również onCreate swojej działalności jawnie pobrać ListView po prostu napompowane:

.

ListView lv = (ListView) findViewById(R.id.your_activity_list_view); 
lv.setAdapter(adapter); 
lv.setOnItemClickListener(this);