Witaj Sieciowy Szperaczu :)
Wiedz, że nie znajdziesz tutaj kodów źródłowych ani poradników jak kodzić dobre i przemyślane aplikacje na Androida.

Za to zobaczysz moje wolne przemyślenia, porady i pomysły. Dowiesz się też z czym miałem problemy, które napotkałem podczas swojej przygody z 'Andkiem' oraz, co ważniejsze, ich rozwiązania.
Pokazywanie postów oznaczonych etykietą problem. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą problem. Pokaż wszystkie posty

sobota, 18 czerwca 2011

OnItemClick czy OnItemSelected ?



No właśnie, jak to jest z tymi dwiema metodami?
  • OnItemClick 
  • OnItemSelected
Obie nadpisujemy implementując ich interfejsy (OnItemClickListener i OnItemSelectedListener)
OnItemClick możemy napisać w ten sposób:

1
2
3
4
5
6
7
8
OnItemClickListener onItemClickListener = new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position,
    long itemId) {
   ((TextView)findViewById(R.id.selection)).setText("Wybrales - "+items[position]);
   
  }
 };

OnItemSelected z kolei tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position,
        long itemId) {      
      ((TextView)findViewById(R.id.selection)).setText("Wybrales - "+items[position]);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
      ((TextView)findViewById(R.id.selection)).setText("Nic nie wybrales");
    }
  };

I teraz pytanie: która z tych metod zostanie kiedy 'uruchomiona'?


czytając 'Android: Beginning 2' w przykładach znajdujemy użycie 'onItemSelected' np. na Grid'zie, aby coś zrobić po dotknięciu elementu w siatce. To nie zadziała. Po części.

Kiedy dotykamy elementu zostaje wywołana metoda 'onItemClick', bo jest to kliknięcie, a nie zaznaczenie.

Aby dostać się do 'onItemSelected' musimy element zaznaczyć, użyć np. trackball'a, którego dodaje HTC do niektórych modeli telefonów, nie wiem jak jest z 'selectowaniem' na innych urządzeniach. w inny sposób nie udało mi się wywołać tej metody dotykając ekranu.

wtorek, 14 czerwca 2011

setContentView(R.layout.main); a ListActivity

Kolejny dzień, kolejny problem.
Co się stało? Chcąc pobawić się adapterami w Androidzie, po napisaniu kodu aplikacja cały czas się wysypywała, nie wiedzieć dlaczego, skoro kod był prosty, czysty i przejrzysty.
Moja główna klasa dziedziczyła po ListActivity zamiast Activity, co za tym idzie, przy osadzaniu listy w widoku, w ten sposób:




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends ListActivity {
 TextView selection;
 String[] items = {"lody", "burak", "cos", "Cluedo", "lampka", "wazon",
       "inne", "samochod"};
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                        
        setListAdapter(new ArrayAdapter<String>(
             this, 
             android.R.layout.simple_list_item_1, 
             items));        
                               
    }
}


Dlaczego kod nie działa? Dziwnym trafem, którego póki co nie jestem w stanie wytłumaczyć, wadzi tutaj setContentView(R.layout.main);. Kiedy się pozbędziemy tego, wszystko jest OK.
Rozwiązanie
Wszystko się wyjaśniło. W pliku odpowiedzialnym za widok (layout/main.xml):
1
2
3
4
5
6
7
<ListView 
 android:id="@android:id/list"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:drawSelectorOnTop="true"
 > 
</ListView>

Należy tutaj pamiętać, aby naszemu ListView nadać id o wartości: android:id="@android:id/list". Trzeba to zrobić, aby klasa dziedzicząca po ListActivity wiedziała, który ListView jest tym głównym. Bez tego ani rusz. Sprawa rozwiązana :)

poniedziałek, 13 czerwca 2011

EditText - automatyczny focus na starcie Activity - jak go wyłączyć?

Sprawdzając jaki arsenał przygotowało nam Google w postaci kontrolek widoku napotkałem mały problem.

Jeżeli dodamy do widoku pole EditText, które służy do wpisywania tekstu przez użytkownika, na starcie aktywności pole będzie 'sfokusowane' czyli pojawi się nam klawiaturka i od razu możemy wpisywać tekst. Fajne rozwiązanie, ale co jeśli nie chemy, aby po starcie EditText miał focus?

O tym chyba brać Googlowska zapomniała, bo (po  poszukiwaniach w sieci) jedynym, najprostszym i w pełni działającym rozwiązaniem jest wstawienie bezsensownie przed EditText znacznika:


1
2
3
<LinearLayout
    android:focusable="true" android:focusableInTouchMode="true"
    android:layout_width="0px" android:layout_height="0px"/>


który będzie niewidoczy i rozwiąże nasz problem.
Miejmy nadzieję, że w przyszłych wersjach systemu zostanie dodany atrybut o wartościach boolowskich w stylu 'autoFocus' :)

Źródło: http://stackoverflow.com/questions/1555109/stop-edittext-from-gaining-focus-at-activity-startup

niedziela, 12 czerwca 2011

Eclipse - Problem z ADT - po instalacji nie działa...

Po długiej przerwie, powrót do tematu :)

Kiedy odpaliłem swoje Zaćmienie od razu postanowiłem włączyć aktualizację wtyczek.
Wszystko pięknie się ściągnęło, nowe Androidowe platformy od Google, aktualizacje do wtyczek.
 No i bum. Nie działa. Zniknęło menu ADT z Eclipsa, nie mogę wejść w ustawienia ADT (Window -> Android SDK and AVD Manager), kiedy otwieram jakiś plik "androidowy" nie widzę aby plugin działał.

Widocznie Eclipse robiąc update, narobił niezłego bałaganu.
Szybko szperając w sieci znalazłem następujące, działające rozwiązanie:

  1. Zamykamy Eclipsa.
  2. Usuwamy z dysku folder ~/.eclipse/org.eclipse.platform_3.5.0_155965261 (gdzie ~ to nasza domyślna domowa ścieżka)
  3. Instalujemy plugin GEF ze strony http://download.eclipse.org/tools/gef/updates/releases
  4. Instalujemy plugin WST Server Adapters ze strony http://download.eclipse.org/releases/galileo/ 
  5. Instalujemy plugin ADT ze strony https://dl-ssl.google.com/android/eclipse
(Instalacja pluginów: Help -> Install New Software)


Taaadaaaa! :) Powinno ładnie śmigać, mi pomogło, chociaż musiałem procedurę powtórzyć 2 razy przez wyjątki Eclipsowe.