Pierwsza aplikacja

Instalacja za nami. Pora stworzyć coś bardziej funkcjonalnego niż Hello World!

Android dostarcza wielu kontrolek i wigetów. Przedstawię podstawowe i pokażę jak z nich korzystać.

Korzystanie z podstawowych kontrolek jest niezwykle proste. Wystarczy przeciągnąć metodą drag and drop wybrany widget na ekran. Usuwanie realizujemy zaznaczając element i naciskając klawisz delete.

Spróbujmy dodać kilka widgetów. Przeciągam Large Text. Następnie klikam na niego (PPM) prawym przyciskiem myszy i wybieram opcję Edit Text... Następnie klikam na New String. Na górze wpisuję pożądany tekst, a na dole jego nazwę. Zastanawiacie się pewnie dlaczego trzeba dodawać nowy string i go nazywać. Otóż wszystkie wartości przechowywane są w /res/values/string.xml. Jest to świetne rozwiązanie, jeśli tworzymy aplikacje w kilku wersjach językowych. System automatycznie wybiera wtedy odpowiedni plik.

Wracając do tematu. Przeciągnijmy jeszcze sobie parę. Po chwili wyklikałem sobie następujący układ:

Nie było w tym nic trudnego. Z radio button group usunąłem jeden element, a przycisk rozciągnąłem na całą szerokość ekranu. Warto spędzić tutaj chwilę i samemu się przekonać co i jak działa.

WAŻNE: Aby dostać się do kontrolki z poziomu kodu musimy znać jego id. Id ustawiamy klikając prawym przyciskiem myszy na elemencie i wybierając opcję: Assign ID... Następnie wpisujemy naszą nazwę i gotowe.

Pozostało nam teraz odpowiednio oprogramować kontrolki. W tym celu otwieramy naszą wygenerowaną klasę. U mnie jest to HelloWorldActivity.

Nie ma tutaj jeszcze zbyt wiele, ale raz jeszcze pragnę zwrócić uwagę na:

setContentView(R.layout.main);

Linijka ta pobiera dane z pliku z layoutem i na jego podstawie tworzy obiekty odpowiednich kontrolek. Często zdarzało mi się tego zapominać, albo ustawiać trochę później, co prowadzi do dziwnych błędów kompilatora. Ogólnie ustawiamy zawsze na początku i już.

No dobrze. Obiekty zostały utworzone. Nie mamy jednak jeszcze do nich dostępu. Pobieramy referencję za pomocą metody findViewById(). Jest ona dziedziczona z Activity.

Przy okazji ciekawostka z Eclipsa. Kierowana szczególnie do zapominalskich, ale nie tylko. Często zdarza mi się zapomnieć całej nazwy metody, ale znam chociaż jej część, jak w tym wypadku. Korzystam ze skrótu Ctrl+O. Daje nam to listę wszystkich dostępnych metod i wartości z tej kasy. Jeśli powtórzymy natomiast Ctrl+O dodane zostają także metody i wartości z klas po których dziedziczymy. W tym wypadku naciskam dwukrotnie Ctrl+O i wpisuję *view. Oto efekt:

Szukana przeze mnie metoda jest na 2. miejscu.

No ale wracając do tematu. findViewById() zwraca widok, do którego referencję przyjmuje jako parametr. Brzmi trochę niejasno, ale zaraz wszystko się wyjaśni:

EditText imie = (EditText) findViewById(R.id.imie);

Rzutowanie (EditText) jest dodane, ponieważ metoda zwraca widok, czyli coś bardziej ogólniejszego niż potrzebny EditText.

W ten sposób pobieramy sobie referencje do wszystkich widoków.

public class HelloWorldActivity extends Activity {

    TextView nazwa;
    EditText imie;
    RadioGroup plec;
    RatingBar ocena;
    Button przycisk;

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

        nazwa = (TextView) findViewById(R.id.nazwa);
        imie = (EditText) findViewById(R.id.imie);
        plec = (RadioGroup) findViewById(R.id.plec);
        ocena = (RatingBar) findViewById(R.id.ocena);
        przycisk = (Button) findViewById(R.id.przycisk);

    }
}

Przy okazji kolejna wskazówka do Eclipse. Często zaznaczany jest błąd, że wymagany jest import. W takim wypadku warto skorzystać ze skrótu Ctrl+Shift+O (Organize Imports). Zostanie to załatwione za nas.

Mamy teraz już pobrane referencje. Możemy w tym momencie pobierać wartości kontrolek, albo je zmieniać. Zmienię treść nagłówka i przypiszę akcję do przycisku.

public class HelloWorldActivity extends Activity {

	TextView nazwa;
	EditText imie;
	RadioGroup plec;
	RatingBar ocena;
	Button przycisk;
	Context context;

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

		nazwa = (TextView) findViewById(R.id.nazwa);
		imie = (EditText) findViewById(R.id.imie);
		plec = (RadioGroup) findViewById(R.id.plec);
		ocena = (RatingBar) findViewById(R.id.ocena);
		przycisk = (Button) findViewById(R.id.przycisk);

		nazwa.setText("editor.javastart.pl daje radę!");

		przycisk.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Toast.makeText(context, "Przycisk działa!", Toast.LENGTH_LONG).show();
			}
		});

	}
}

Zmiana tekstu dla napisu na górze nie jest jakoś specjalnie skomplikowana. Po prostu korzystam z metody setText(String nowaNazwa). Natomiast znacznie ciekawsze jest przypisanie akcji do przycisku.

Jeśli chcemy obsługiwać akcje przycisku, albo dowolnego innego elementu musimy przypisać do niego słuchacza. Jest to byt, który zajmuje się tylko nasłuchiwaniem danego elementu, jeśli wykryje akcję, to wywoływana zostaje jego metoda. W tym wypadku tworzę nową klasę anonimową i przesłaniam metodę onClick(). Wygląda to dosyć dziwnie, jeśli się z tym pierwszy raz spotykacie, ale spokojnie - jeśli zamierzacie programować w Androidzie, szybko się do tego przekonacie.

Jeśli kliknięcie zostaje wykryte wyświetlany jest Toast, czyli mała informacja u dołu ekranu. Wymaga ona jako parametru kontekstu na którym się ma pojawić, dlatego pobieram go wcześniej za pomocą

context = getApplicationContext();

A oto efekt:

Pozostała jeszcze jedna podstawowa informacja, którą chciałbym, żebyście po tym artykule znali. Otwieranie nowej aktywności. Celem będzie zmodyfikowanie aktualnej aplikacji, żeby po naciśnięciu przycisku OK został otworzony kolejny widok wraz z informacjami które wypełniliśmy aktualnym. Do dzieła. Po pierwsze stwórzmy sobie nowy layout dla nowej aktywności.

Skopiowałem main.xml. Usunąłem niepotrzebne kontrolki i dodałem kilka nowych textView. Nie zmieniałem ich tekstu. Zrobię to w aplikacji.

Teraz należy dodać nową aktywność. Tutaj podobnie jak wcześniej kopiuję HelloWorldActivity, zmieniam nazwę i usuwam niepotrzebny kod, oraz pobieram sobie referencje do moich kontrolek. W layoucie nadałem im wcześniej odpowiednie ID - patrz screen powyżej, dzięki czemu mogę się teraz po nich odwołać.

public class WynikActivity extends Activity {

	TextView imie;
	TextView plec;
	TextView ocena;

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

		imie = (TextView) findViewById(R.id.imie_wynik);
		plec = (TextView) findViewById(R.id.plec_wynik);
		ocena = (TextView) findViewById(R.id.ocena_wynik);

	}
}

Zauważcie także, że wczytuję teraz inny layout.

Należy również dodać nowe Activity do AndroidManifest. Tego często zapominam (zapewne nie tylko ja). Otwieramy plik manifestu. Wybieramy zakładkę Application (na dole). Następnie do Application Nodes dodajemy wartość klikając na Add..., wybieramy Activity. Po prawej stronie podajemy nazwę (wybieramy z listy po naciśnięciu Browse. Zapisujemy i gotowe.

Pozostało tylko przeprogramować akcję przycisku.

public void onClick(View v) {
	Intent intent = new Intent(context, WynikActivity.class);
	startActivity(intent);
}

W tym celu tworzę najpierw intencję, jako parametry podając aktualny kontekst (kontekst aktywności do którego aplikacja ma powrócić po zamknięciu wywoływanej) oraz docelową aktywność. Następnie wywołuję startActivity().

Powoduje to, co prawda, otworzenie aktywności, ale ich wartości pozostaną puste. Dlatego do intent dodamy dodatkowe informacje.

public void onClick(View v) {
	Intent intent = new Intent(context, WynikActivity.class);

	RadioButton radioButton = (RadioButton)plec.findViewById(plec.getCheckedRadioButtonId());
	String imieString = imie.getText().toString();

	intent.putExtra("imie", imieString);
	intent.putExtra("plec", radioButton.getText());
	intent.putExtra("ocena", ocena.getRating());

	startActivity(intent);
}

Pozostało je przechwycić w otwieranej aktywności i ustawić odpowiednie pola:

public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.wynik);

	imie = (TextView) findViewById(R.id.imie_wynik);
	plec = (TextView) findViewById(R.id.plec_wynik);
	ocena = (TextView) findViewById(R.id.ocena_wynik);

	Bundle bundle = getIntent().getExtras();

	String imieString = bundle.getString("imie");
	String plecString = bundle.getString("plec");
	String ocenaString = bundle.getFloat("ocena")+" gwiazdek";

	imie.setText(imieString);
	plec.setText(plecString);
	ocena.setText(ocenaString);

}

Po wypełnieniu pól dostajemy wynik:

To by było na tyle jeśli chodzi o ten artykuł. Dzięki za uwagę. Powodzenia.

Zadanie do własnego wykonania:

Napisz aplikację której pierwszy ekran zawiera trzy rzędy gwiazdek, a po naciśnięciu przycisku, w następnej aktywności, pojawia się ich suma.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

gal anonim

Cieszę się, że zabrałeś się za kurs Androida bo świetnie tłumaczysz, dokładnie w każdym razie. Mam nadzieję, że będziesz regularnie dodawał kolejne kursy. Pozdrawiam ;)

Krzysiek_Cr

To co powyżej

Mrt1

Gdy klikam prawym przyciskiem myszy na jakiś element to zamiast "assign id" mam "edit id". Po wpisaniu id, w klasie R nie tworzy się nowe id i nie mogę przez to użyć metody findViewById(R.id.moje_id), ponieważ w klasie R nie istnieje "moje_id". Proszę o pomoc co z tym zrobić.

Marcin Kunert

Edit i Assign pełnią taką samą rolę i są zależne od wersji ADT jakie posiadasz. Co do problemy z id: Upewnij się, że zapisałeś layout. Jeśli zawartość klasy R nie chce się odświeżyć, to po prostu ją usuń. System powinien automatycznie wygenerować nową.

marcin

mam ten sam problem, co kolega Mrt1 dodatkowo, po kazdym "edit it" i wcisnieciu OK, rozjezdza mi sie caly layout.. cholernie frustrujace jest ukladanie wszystkich elementow na nowo po kazdej edycji ID... da sie cos z tym zrobic?

Marcin Kunert

Dzieje się tak, ponieważ domyślnie ustawiany jest teraz RelativeLayout i elementy są ustawiane zależnie jeden od drugiego. Przez co jeśli zmieniasz nazwę elementu, to wszystkie inne które swoją pozycję opierały na nim tracą odnośnik. Prostszy do użycia jest LinearLayout, który zastosowałem w przykładzie wyżej. Więcej na temat Layoutów znajdziesz tutaj: http://javastart.pl/programowanie-android/podstawowe-layouty/

Problem

Witam! Napisalem wszystko tak samo jak w temacie i niestety wyswietla sie blad :( Uzywam Androida w wersji 2.2(Froyo).

Problem

Witam! Napisalem wszystko tak samo jak w temacie i niestety wyswietla sie blad... (Aplikacja xxx zostala niespodziwanie zatrzymana) Uzywam Androida w wersji 2.2(Froyo).

Kamil

Mrt1 - sprawdź czy zapisałeś plik z layoutem, bo jeżeli nie, to w klasie R nie zostanie wpisane nowe (Twoje id). Problem - sprawdź czy dokładnie wszystko jest tak jak w podanych przykładach bo wygląda na to, że coś się źle kompiluje i aplikacja się wykrzacz.

konrad

Witam, Mam podobny problem co jeden kolega powyżej... A mianowicie zarówno w emulatorze jak i na fizycznym telefonie wyskakuje mi komunikat: "Niestety, aplikacja HelloWorld została zatrzymana". Zna ktoś może przyczynę?

Adas

Witam, kurs bardzo dobry.. mam tylko jeden problem. A mianowicie po dodaniu widgetów główna klasa HelloWorldActivity się nie zmieniła i nic się nie wygenerowało :/ proszę o pomoc

AsasynRz

przy ustawieniu buttona nie powinno być new View.OnClickListener()? samo new OnClickLitener() mi nie przechodzi.

Tymon

Nie przechodzi ci, ponieważ nie zaimportowałeś na początku appki biblioteki android.view.View.OnClickListener i musiałeś użyć tzw. importu statycznego. Napisz na początku : import android.view.View.OnClickListener; i już tak nie trzeba będzie robić. Powiem Marcinowi, żeby dopisał do kodu instrukcje importu. Pozdr.

pawel

Wydaje mi się, że nie do końca, na początku mamy android.view.View, co gryzie sie z importowanym OnClickListener. Po dodaniu w kodzie View przed wywołaniem newClickListener rozwiązuje sprawę.

AsasynRz

problem z aktualizacją sekcji R.id może wynikać z błędnie nazwanego pliku xml. Musi się on zaczynać od "activity'. Warto o tym wspomnieć również w artykule.

android

Moj Twister https://play.google.com/store/apps/details?id=com.andrzej.gruntowskiTwister

Gabson

nazwa = (TextView) findViewById(R.id.nazwa); imie = (EditText) findViewById(R.id.imie); plec = (RadioGroup) findViewById(R.id.plec); ocena = (RatingBar) findViewById(R.id.ocena); przycisk = (Button) findViewById(R.id.przycisk); W tym miejscu mam jakiś błąd i nie wiem co z tym zrobić. Domyślam się ze nazwa imie itp. to sa te ID tylko docz ego to poprzypisywales a zwlaszcza plec bo nie moge takiego samego ID przypisac do dwoch tych wyborow. Mógłbyś podać do czego jakie ID przypisałes??

Piotrek1910

Pomiędzy (TextView) a findViewById... nie może być spacji.

Piotrek1910

Dajcie download do tego co programu. Będzie łatwiej się uczyć :).

Piotrek1910

Nie wiem czemu podkreśla mi: "przycisk.setOnClickListener(new OnClickListener() {"

Kamil1991

Mam taki problem. Stworzyliśmy dwie Activity, ja natomiast postanowiłem stworzyć jeszcze trzecią. Druga poprzez intend ma pobierac dane z pierwszej a trzecia z drugiej. Jednak wszystko dziala dobrze dopoki nie użyję w drugiej Activity putExtra. Wtedy program wyłącza sie przy przejściu z drugiej do trzeciej Activity. Siedziałem dzisiaj caly dzien szukając odpowiedzi niestety nie udalo mi sie rozwiązać problemu

Paulina

Witam. Otóż mam taki problem. Podczas tworzenia aplikacji w Eclipse dochodzę do ostatniego kroku gdzie należy kliknąć "Finish" i w tym momencie podświetla mi się Navigation Type: None i tak sobie mruga. Nie mam pojęcia gdzie jest błąd ponieważ wszystko robię krok po kroku i za każdym razem to samo. Bardzo proszę o pomoc

Hubert

Moim zdaniem straszne zamieszanie wprowadza to, że nie podajesz ID obiektów, które tworzysz. Wprowadza to niepotrzebne komplikacje, np: imie = (TextView) findViewById(R.id.imie_wynik); Poza tym kurs OK. Życzę powodzenia w dalszej pracy.

Hubert

Sorry. Nie zauważyłem screena z Outline. Post do usunięcia.

Marcin Kunert

Nic nie szkodzi. Dopiszę w artykule, żeby na przyszłość nie było wątpliwości :)

bizio

dobry intuicyjny kurs. nawet dla osób niezbyt biegłych w java. dobra robota

Michał

Mam problem z pierwszym programem, niby Eclipse nic nie podkreśla, ale na telefonie wyskakuje, że aplikacja została nieoczekiwanie zamknięta. Problem tkwi w tym fragmencie kodu: twNazwa = (TextView)findViewById(R.id.twNazwa); etImie= (EditText)findViewById(R.id.etImie); rgPlec = (RadioGroup)findViewById(R.id.rgPlec); rbOcena = (RatingBar)findViewById(R.id.rbOcena); bPrzycisk=(Button)findViewById(R.id.bOk); W logCatcie, znalezłem coś i po kliknięciu w to dwa razy przenosi mnie do linijki: rgPlec = (RadioGroup)findViewById(R.id.rgPlec); Po jej usunięciu wszystko działa. Pytanie dlaczego w tej linijce jest coś nie tak? Wszystkie nazwy i ID się zgadzają. Pozdrawiam.

Marcin Kunert

Hej Michał, upewnij się, czy na layoucie na pewno użyłeś RadioGroup, a nie RadioButton, łatwo tutaj o pomyłkę.

Michał

Wielkie piwo dla Ciebie :) Chodziło o to, że w naszej aplikacji kontrolka RadioGroup składa się z dwóch RadioButtonów, i klikając PPM, na kontrolkę RadioGrup, żeby zmienić jej ID, nie zauważyłem, że zaznaczył mi się jeden z RadioButtonów, a nie cała kontrolka RadioGrup. I w rzeczywistości zmieniłem ID jednego z przycisków dlatego aplikacja nie działała. Teraz wszystko śmiga :) Jeszcze raz dzięki

Asylum_of_glass

Załączam swoje rozwiązanie zadania z gwiazdkami, być może komuś się przyda. :) https://docs.google.com/file/d/0B4TXxIf6gB-nRzNxQ1NJVXN6R2M/edit?usp=sharing

MarekM

Pobrałem zawartość z pod podanego linka. Mam pewnie banalne pytanie ale jak otworzyć taki komplet plików by wyglądało to jak nowo utworzony projekt a nie pojedyncze pliki?

lolo

Czy nie jest tak, że listenery są starym rozwiązaniem a nowe to atrybut android:OnClick?

Marcin Kunert

Kwestia jak komu wygodniej. Możesz ustawiać w xml'u, możesz w kodzie. Wg mnie bardziej elegancko jest jak masz atrybuty w xml'u.

lolo

Moim zdaniem również bardziej eleganckie jest użycie atrybutu w xml'u ale w większości kursów androida używane są listenery.

gallo

Wszystko na początku było jasne i zrozumiałe póki pisał Sławek. Teraz to jakaś masakra jest. Coś dodane, nie wytłumaczone... Skąd się pojawiło w kodzie? TextView nazwa; EditText imie; RadioGroup plec; RatingBar ocena; Button przycisk; Context context; Trzeba samemu to wpisać? Jakie to ma odwołanie do wrzuconych drag and drop bloczków? Zrobiłem wszystko jak trzeba i wywala błąd przy findViewById a poczatkowe komentarze pod każym artykułem "świetny kurs Androida bo świetnie tłumaczysz" wygląda mi jakby autor strony zachęcał kolegów do takich komentarzy... Na początku spoko, ale jak pod prawie kazdym artykułem takie coś jest to już śmierdzi...

Marcin Kunert

Te linie to deklaracja zmiennych i tak, zmienne deklarujemy ręcznie. Podejrzewam, że błędy w Twoim kodzie spowodowane są faktem, że nie ustawiłeś elementom ich id, albo odwołujesz się do takich które nie istnieją. Kod: widok = (TextView) findViewById(R.id.id_widoku); powoduje przypisanie do zmiennej jej widoku o id: "id_widoku", w xml odpowiada za to ta linia: <TextView android:id="@+id/id_widoku" (...) /> Fakt, że ludzie są zadowoleni z darmowego kursu i pozostawiając pozytywne komentarze motywują nas do dalszej pracy bardzo mnie cieszy, no ale zawsze musi się niestety znaleźć ktoś komu coś przeszkadza.

lolo

Muszę przyznać, że kurs Androida nie jest najmocniejsza stroną JavaStart. A co do: TextView nazwa; EditText imie; RadioGroup plec; RatingBar ocena; Button przycisk; Context context; Są to deklaracje obiektów klas TextView, EditText, RadioGroup, RatingBar, Button oraz Context. Następnie pobierane są referencje do tych wszystkich elementów które zostały wyklikane: nazwa = (TextView) findViewById(R.id.nazwa); imie = (EditText) findViewById(R.id.imie); plec = (RadioGroup) findViewById(R.id.plec); ocena = (RatingBar) findViewById(R.id.ocena); przycisk = (Button) findViewById(R.id.przycisk); Jakąś konkretną treść ma ten błąd? Podziel się kodem łatwiej będzie znaleźć błąd np. daj link w komentarzu do archiwum z projektem albo na forum zrób temat i tam kod zamieść.

Konrad

Powiem szczerze, że kurs Androida jest kiepski. Dużo rzeczy omijasz. To ma być dla początkujących. Kurs javy dużo lepszy. Przykładowo: "EditText imie = (EditText) findViewById(R.id.imie); Rzutowanie (EditText) jest dodane, ponieważ metoda zwraca widok, czyli coś bardziej ogólniejszego niż potrzebny EditText. W ten sposób pobieramy sobie referencje do wszystkich widoków." Opisałeś metodę, ale powinno być podane krok po kroku gdzie kliknąć i co wstawić.

Mariusz

Chłopaki chyba trochę przesadzacie..... magiczne zdanie: EditText imie = (EditText) findViewById(R.id.imie); powinno być jasne po przeczytaniu kursu Sławka ( np. temat o rzutowaniu). Tutaj rozwijany jest kurs androida i jak rozumiem zakłada się, że podstawy javy są już znane. Bez sensu byłoby tłumaczenie niektórych rzeczy ponieważ byłoby to powielanie tego o czym pisał Sławek. Ewentualnie można by dodać pewne odnośniki do kursu javy w "zawiłych" miejscach jednak ich brak to żaden wielki problem. I tak jest to NAJLEPSZY kurs wprowadzający do Androida jaki dostępny jest w j. polskim. Dzięki za ten kurs Marcin

PRT

Takie głupie pytanie - nazwy kontrolek wyświetlone na ekranie - imię, płeć, ocena - to osobne TextView, czy da się jakoś ustawić, żeby wyświetlała się nazwa kontrolki?

Marcin Kunert

Kontrolki są zdefiniowane każda osobno. Nie bardzo rozumiem natomiast pytania. Nazwa kontrolki, czyli w przypadku Androida - id służy do złapania referencji do danego widoku w kodzie.

PRT

Przepraszam, że niedokładnie się wyraziłem. Pytałem czy to osobne TextView, czy jakoś ustawione wyświetlanie dodatkowego tekstu z nazwą kontrolki nad kontrolką. ;)

Marcin Kunert

Nie na za co przepraszać :) Tak, to osobne TextView z domyślym tekstem który zmieniamy w czasie wykonywania aplikacji.

Michał

Strasznie zagmatwane i wiele rzeczy pomijasz milczeniem przez co ciężko jest się połapać. Przykładowo brakuje mi wrzuconych gdzieś pełnych listingów kodu żebym mógł sprawdzić jak to wygląda w całości u Ciebie. Brakuje include'ów których używasz. A tekst w stylu "usuwamy niepotrzebny kod" nie pomaga mi dojść co tak naprawdę mam usunąć... Wrzuć gdzieś pełne listingi, proszę:)

Marcin Kunert

Na dniach postaram się przejrzeć całość i ewentualnie poprawić. Pisałem to 1,5 roku temu, na pewno przyda się świeże spojrzenie :)

Michał

to akurat wiem:-) Brakuje jeszcze zaznaczenia do którego pliku jest listing. Jeszcze jak widać w listingu nazwę klasy to jest OK, ale gdy np. listing jest odnośnie onClick() to na początku zacząłem dodawać to do WynikActivity (bo na tym kilka linii wcześniej pisałem). BTW w związku z tym zamieszaniem na razie kod mi nie działa ;-) Może dodaj na "wklejto" listingi i tu podlinkuj to zawsze łatwiej będzie spojrzeć na całość. Pozdro =]

anafresha

Cały program który był przykładem: http://www.wklejto.pl/183285

Adik

Można prosić o ponowny upload ?

anafresha

Całe kod rozwiązanego zadania: http://www.wklejto.pl/183287 Mam nadzieje że się przyda :D

anafresha

a co do includów....jeżeli przepisany kod się pluje to warto wcisnąć ctrl+shift+o . Co samo importuje includy.

LLL

Mam pytanie odnosnie przypisywania akcji danemu przyciskowi. A mianowicie, w tutorialu na oficjalnej stronie developer.android.com wyczytalem, ze przycisk mozna zaprogramowac poprzez wejscie do activity_main.xml i dodanie przyciskowi atrybutu android:onClick="...tutaj nazwa metody ktora musimy potem zdefiniowac w naszym activity...". Trzeba tez oczywiscie zaimportowac android.view.View, ale nie wystepuje potem uzycie onClickListenera oraz nie tworzymy obiektu "przycisk" klasy Button, tak ja to ma miejsce w tym artykule. Jak widac istnieja dwa sposoby, w takim razie ktory jest lepszy? ... Link do strony: developer.android.com/training/basics/firstapp/starting-activity.html

Michał

A ja mam pytanie, czy w polu typu "TextView" można wyświetlić liczbę będącą wynikiem działania matematycznego funkcji zwracającej np: liczbę całkowitą lub zmiennoprzecinkową? Jak to zrobić?

Marcin Kunert

Pewnie. Trzeba jednak uważać podając liczbę całkowitą, bo zostanie ona zinterpretowana jako wartość w pliku R (jako referencja do wartości w strings.xml. Żeby wyświetlić liczbę całkowitą trzeba ją najpierw przekonwertować do wartości String, czyli np: textView.setText(Integer.toString(liczba));

Michał

zauważyłem że w Intent można użyć zamiast "context" po prostu "this"? np tak: Intent intent = new Intent(this, Activity.class); Jaka jest różnica pomiędzy tymi dwoma sposobami?

G.Jeszka

Lub getApplicationContext() w to miejsce, z innej beki to trzeci radiobutton powinien być dla gender =)

Hubert 1337

Za każdym razem, gdy dodaję jakiś napis mam przy nim ostrzeżenie "hardcoded string should have use @string resource" program działa, ale tyle ostrzeżen irytuje. mogę to usunąć poprzez dodanie @string/ przed tekstem ale wtedy wyświetla się razem z tym w aplikacji. zna ktoś może rozwiązanie problemu?

Marcin Kunert

Masz co najmniej 2 opcje: * dodaj ten ciąg znaków do pliku res/values/strings.xml np tak: <string name="twoja_nazwa">To będzie się wyświetlało</string> i wtedy możesz użyć jako @string/twoja_nazwa * jeśli nie planujesz nidy tłumaczyć aplikacji, to możesz wyłączyć te ostrzeżenia: Window->Preferences->Android->Lint Error Checking-> Sekcja interationalization -> HardcodedText

Hubert 1337

Dzięki za szybką odpowiedź, wybrałem pierwszą opcję, aby uczyć się dobrych nawyków od początku.

Uczeń

Usunąłem sobie napis "Hello Word" i nie mogę sobie Assignować ID :/. Mam okienko tekstowe, tylko teraz pytanie jak zrobić żeby ono "działało" tzn. aby można było coś w nie wpisać i zatwierdzić ??

Marcin Kunert

Nie do końca rozumiem pytanie. Musisz użyć kontrolki EditText. Po prostu przeciągasz ją sobie na layout i nadajesz ID. W kodzie wpisujesz EditText imie = (EditText) findViewById(R.id.twoje_id);

Dzeku

Szanuje Twoja prace, widac ze znasz sie na tym co robisz, ale w odroznieniu do innych osob odwiedzajacych ten blog ja uwazam ze pomijasz zbyt wiele szczegolow np "context = getApplicationContext()" nie podales miejsca w kodzie w ktorym umiesciles te linijke, podobnie kiedy dodajesz widget'y piszesz tylko ze kilka rzeczy dodales kilka rzeczy odjales, musisz wziac pod uwage fakt ze nie wszyscy sa na rownym poziomie zaawansowania i kurs taki jak ten powinien prezentowac kazdy najmniejszy szczegol aplikacji, zeby osoby ktore dopiero zaczynaja swoja przygodze z Androidem mogly zauwazyc pewne reguly i powtarzalnosc niektorych dzialan.

Dzeku

Przepraszam juz widze te linijke - „context = getApplicationContext()”

Konialdo

Nie mam żadnych błędów a mimo to, po kliknięciu buttona wyskakuje komunikat, że "aplikacja przestała działać". Ktoś też ma taki problem lub wie jaka jest tego przyczyna?

Marcin Kunert

Przyczyna jest zapisana w widoku LogCat w Eclipse.

Lolo

Jeśli nadal nie wiesz dlaczego Ci wyskakuje komunikat to proponuję założyć na forum temat i tam wrzucić kod wraz z logami z LogCata. To może ktoś pomoże bo inaczej nikt nie będzie zgadywał.

Lolo

A przy okazji mała prośba o małe porządki na forum. Przydało by się pousuwać tematy/posty zrobione przez spamboty, usunięcie ich i założenie jakiejs captcha przy rejestracji, żeby spamboty nie rejestrowały się. Bo to trochę stwarza, że forum jest opuszczone i na pewno niektórych zniechęca do wchodzenia na nie.

Konialdo

Dziękuje za odpowiedzi, nie spodziewałem się tak szybkiego odzewu ;) Problem rozwiązałem, po prostu znalazłem delikatnie inną metodę w internecie.

aleksanderwiel

Witam, chciałem prosić o pomoc w problemie z przyciskiem, gdyż mi nie działa :(. Zanim wskażę na błąd to pierw podam ważne informacje, które mogą się przydać podczas rozwiązania tego błędu. Mam stworzone dwa widoki o nazwie: HelloWorldActivity i DrugiWidokActivity. Dodałem je do pliku Manifest, ale nie w tym rzecz. W widoku HelloWorldActivity mam problem z tym: przycisk.setOnClickListener(new OnClickListener() { // setOnClickListener i OnClickListener mam zaznaczone jako błąd public void onClick(View v) { // Tu mam View oznaczone jako błąd Toast.makeText(context, "Przenoszę Cię dalej...", Toast.LENGTH_LONG).show(); // Natomiast tu błędem jest context } }); } Proszę o pomoc :(

lolo

Zwykle IDE pokazuje jakąś treść błędu jak gdzieś wykrywa błąd. Może bibliotek nie zaimportowałeś i dlatego zaznacza Ci to wszystko jako błąd? Albo stworzyłeś Activity ale nie rozszerzają one klasy Activity i stąd też mogą być błędy. Proponuję założyć nowy wątek na forum (link na górze strony oraz pod polem do wpisywania komentarzy), tam opisać problem i najlepiej załączyć spakowany projekt bo tak łatwiej będzie znaleźć błąd.

Nieznasz

Niestety próbuję ustawić kontrolki zgodnie z Twoją ideą, a także jakkolwiek inaczej i cały czas nakłada mi się jedna kontrolka na drugą nie mogę ich ustawić względem siebie. Czy ja coś pominąłem??

Janusz

Mam problem z funkcją setText() ponieważ ona po prostu mi nie działa, robię wszystko zgodnie z poradnikiem krok po kroku nawet robiłem wszystko od nowa na nowym projekcie i problem jest nadal. Od razu mówię że nie pominąłem żadnej linii kodu. Gdy mam za komentowane wywołanie funkcji setText() wszystko działa lecz gdy ją od komentuję aplikacja nie chce mi się uruchomić. W czym może być problem??? nazwa.setText("Moja Pierwsza Aplikacja");

lolo

A nie zgłasza żadnego błędu?

lolo

A nie zgłasza żadnego błędu?

Janusz

nie właśnie nic nie zgłaszało ale już sobie poradziłem z tym problemem, wystarczył reset Eclipse, właściwie to nie wiem dlaczego po tym wszystko zaczęło działać :D

Hajto

Byłbym wdzięczny, gdyby do kursu było dołączone więcej zadań do wykonania samodzielnie. Moim największym problemem w nauce programowania jest znalezienie sobie jakiegoś tematu na projekt, który mógłbym sam zrealizować. Fajnie by było gdybyście zamieścili kilka takich zadanek, wraz z przykładami.

Marcin

Lekcja ' Pierwsza aplikacja" a przyznam, że trochę sporo problemów z nią miałem, jeżeli chodzi o problem ze słuchaczami to u mnie pomogło utworzenie klasy w której będą listenery: public void saveonclicklisteners(){ save.setOnClickListener(new OnClickListener(){ public void onClick(View V){ ... }); i oczywiscie zaraz po referencjach findviewbyid trzeba dodać wywołanie tej klasy : saveonclicklisteners(); na koniec jeszcze pytanko, troche czytałem ale chce się upewnić, czy jak dodam opisie przycisku w xml aktywności, android:OnClick=nameclass to efekt jest taki sam jak bym używał słuchaczy ? bo nie ukrywam, że ta pierwsza opcja jest wygodniejsza dla mnie. Pozdrawiam !