24 września 2011

ListView w res/layout czy android.app.ListActivity?

To chyba jedno z tych pytań dotyczących zalet definiowania widoku (rozkładu elementów graficznych na ekranie) deklaratywnie jako zasób w res/layout w porównaniu z oprogramowywaniem go jako podklasa android.app.Activity.

W przykładzie Hello, Views > List View użyto tego drugiego podejścia, w którym widok w większości budowany jest w ramach podklasy android.app.ListActivity z rozkładem R.layout.list_item.

Przeglądając android.widget.ListView trafiłem na możliwość definiowania wielu elementów deklaratywnie, tak że ostatecznie moja wersja prezentuje się nieznacznie inaczej. Chciałoby się wręcz napisać lepiej, ale tutaj moja skromność bierze górę, więc pozostanę przy skromniej.
package pl.japila.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ContactsActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);

        ListView lv = (ListView) findViewById(R.id.listView1);
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}
Użyty widok R.id.listView1 wygląda następująco:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/listView1"
     android:layout_height="fill_parent""
     android:layout_width="fill_parent""
     android:entries="@array/names_array"
     android:textFilterEnabled="true"
     android:clickable="true">
</ListView>
Rozumiem, że jeśli pozycje na liście są statyczne (jak w przykładzie) to android:entries (linia 6) w znaczniku ListView wystarczy. Zastanawia mnie, czy istnieje jakakolwiek przewaga użycia klasy android.app.ListActivity. Na chwilę obecną nie widzę żadnej. W końcu zawsze mogę dostać się do odpowiedniego elementu widoku przez View.findViewById() lub Activity.findViewById(), więc mogę równie wiele w obu przypadkach. Czy ktoś mógłby uchylić rąbka tajemnicy, dlaczego/kiedy powinienem stosować jedno nad drugie?

5 komentarzy:

  1. Czy platforma NetBeans "wspiera" Androida? Mam na myśli czy istnieje coś w stylu Gui Buildera dal tych aplikacji analogicznie jak Java ME.

    OdpowiedzUsuń
  2. Przewaga deklarowania nad oprogramowaniem jest taka że zasoby moga byc dynamicznie wybierane do wczytania przez DVM więcej zależności od np rozdzielczości ekranu, orientacji, i wielu innych rzeczy.

    OdpowiedzUsuń
  3. @kadoel, nie mam pojęcia na temat wsparcia Android w NetBeans. Zaniechaj poszukiwań na rzecz Eclipse ADT - szkoda czasu na poszukiwania (a do nowych skrótów klawiszowych przywykniesz :))

    @Krzysiek, moje pytanie zmierzało raczej do rozwiązania problemu przy założeniu, że definiuję układ (layout) w zewnętrznym pliku xml, a mam wybrać Activity lub ListActivity.

    OdpowiedzUsuń
  4. @kadoel, NBAndroid znalazłeś? Ma na pewno podstawową obsługę. Uruchamianie na emulatorze/telefonie. Tyle na razie wykorzystałem.

    @Jacek, Eclipse ma GUI Buildera dla Androida? Nie żebym używał takich cudów, ale ciekawi mnie porównanie NBAndroida i Eclipse ADT

    OdpowiedzUsuń