Program do prowadzenia statystyk na meczu tenisowym

0

Witam! Chcę napisać aplikację na Androida(java|android studio), która będzie miała wiele ekranów(activity). Będzie to mianowicie program, dzięki któremu osoba trzecia na meczu tenisa będzie mogła zapisywać wynik meczu punkt po punkcie. Program będzie wyświetlał statystyki meczu i takie tam ;). Na pierwszym ekranie program pyta się o imiona graczy i ile setów ma trwać mecz. Na drugim ekranie będzie widać wynik meczu oraz trzy przyciski: dodanie punktu pierwszemu graczowi, drugiemu oraz statystyki z tego meczu. Moje pytanie brzmi: Jak zrobić, żeby druga aktywność(ekran) znała zmienne z pierwszego? (np. nazwy graczy). A może powinienem utworzyć klasę gracz, która będzie przechowywała ilość jego punktów oraz statystyki? Jest to mój pierwszy program tego typu, więc mam trochę mętlik w głowie. Proszę o jakiekolwiek porady, sugestie. Pozdrawiam!

1

Zrób klasę trzymającą dane, potem zrób jej jeden obiekt i ustawiaj go na każdym ekranie jakimś setterem. W niej trzymaj graczy, punktację itd., a na ekranach tylko pobierasz dane wyświetlasz i modyfikujesz. Na tego typu aplikację spokojnie wystarczy.

Żeby ekrany się same aktualizowały, proponuję zrobić coś takiego:

  1. Utworzenie interfejsu ISender - będzie zawierał metodę do dodawania listenerów i do wysyłania informacji o aktualizacji
  2. Utworzenie interfejsu IListener - będzie zawierał metodę do aktualizacji statusu obiektu
  3. Każdy ekran, który ma się sam aktualizować niech implementuje IListener
  4. Zrób klasę modelu (opisaną wyżej, tą z danymi) implementującą interfejs ISender, a w kolekcji obiektów typu IListener (nasłuchujących) dodaj każdy ekran, który ma się aktualizować
  5. W setterach w modelu ustaw wywołanie metody aktualizacyjnej na każdym listenerze.

Teraz weźmy np. punkty.
W klasie modelu trzymasz wynik gracza 1 i gracza 2. Ja tutaj zrobię najprościej jak się da, a jak będziesz potrzebował to przerób.

public class ApplicationModel implements  ISender {
	private ArrayList<IListener> listenery;
	private int wynikGracz1, wynikGracz2;

	public ApplicationModel() {
		listenery = new ArrayList<IListener>();
	}
	
	public void setWynikGracz1(int wartosc) {
		if(wynikGracz1 != wartosc) {
			wynikGracz1 = wartosc;
			wyslijPowiadomienia();
		}
	}
	
	public int getWynikGracz1() {
		return wynikGracz1;
	}

	// metoda z interfejsu
	private void wyslijPowiadomienia() {
		for(IListener listener : listenery) {
			//wywolanie metody aktualizuj() z interfejsu IListener dla każdego listenera w kolekcji
			listener.aktualizuj();
		}
	}
}

Zauważ ten IF w setterze. Bez tego mogłaby powstać niekończąca się pętla. Teraz masz ekran, który implementuje interfejs IListener, a w nim metodę aktualizuj(). Zostanie wywołana, za każdym razem, jak zmieni się wynik, więc, mając obiekt modelu, możesz w niej możesz aktualizować labelkę - czy cokolwiek tam będzie - wyświetlające wynik.

// metoda z interfejsu
public void aktualizuj() {
	this.wynikGracza1.setText(this.model.getWynikGracz1());
}

Pisane tutaj bez testowania, więc pewnie są literówki.
Jak będziesz miał pytania to pisz.

0

ok, dzięki, tylko to trochę zawiłe dla mnie wszystko jeszcze. A da się jakoś zrobić tak, żeby po prostu obiekt był widoczny na każdym z ekranów? Utworzyłem już klasę Zawodnik, która przechowuje informacje o jego nazwie, punktach itp. Stworzyłem obiekt tej klasy w pierwszym ekranie, gdzie podaję tylko imiona graczy. Potem przechodzę do ekranu 'mainActivity' i chciałbym, żeby ten ekran wiedział o tym obiekcie z pierwszego ekranu i potrafił modyfikować jego zmienne. Da się tak zrobić?

0

Zrób na drugim ekranie pole tej klasy i ustaw go konstruktorem albo setterem.
Albo zrób klasę trzymającą wszystkie dane programu i przekazuj tylko obiekt tej klasy, wtedy będziesz miał zawodników, sety itd. nie przekazując wszystkiego osobno.

0

no właśnie o to mi chodzi, ale jak przekazać obiekt tej klasy? ;) Wyczytałem o metodzie Serializable, tylko kiedy Intentem przekazujemy obiekt, nie jest on przekazany do całej klasy, tylko do metody, która go odbiera. Jak zrobić, żeby przekazać obiekt do innej klasy tak, aby był on widoczny w całej drugiej klasie?

0

Jak chcesz iść na łatwiznę to:

  1. Zrób singleton i korzystaj z niego
    lub
  2. Skorzystaj z wbudowanego w androidzie singletona: Application

Jeżeli chodzi o pkt 2. to tworzysz klasę np

package com.test.app;

public class MyApplication extends 	android.app.Application {
       public MyApplication() {
             super();
       }


}

Teraz w pliku AndroidManifest w tagu <application> ustawiasz atrybut android:name="com.test.app.MyApplication";

i w dowolnym activity mozesz go pobrać w ten sposób:

MyApplication app = (MyApplication)getApplication();
0

Ok, odświeżam temacik, przepraszam, że tyle przerwy i znowu zaczynam z tym samym, ale teraz zabieram się za to już na poważnie. Nie chcę iść na łatwiznę, wyszedł z tego fajny projekcik, który się przyda w przyszłości, a nie jest tylko ćwiczeniem.
Od początku. Projekt będzie miał za zadanie prowadzenia statystyk z meczu tenisowego (wynik meczu, ilość punktów, gemów, setów, asów, błędów itp.). Za przechowywanie danych będzie odpowiadała baza danych SQLite dołączona do projektu(jak bóg przykazał). Planuję utworzyć klasę Zawodnik, która będzie przechowywała metody do dodawania punktów, gemów itp. oraz jedną tabelę w bazie, gdzie w 2 rekordach(2 graczy) beda podane całe statystyki. Czy takie rozwiązanie jest dobre, czy powinienem podzielić projekt na więcej klas i tabel? Jak wy byście to zaprojektowali? (można jeszcze dodać tabelę meczy i przechowywać dane z poprzednich spotkań..)

0

Czy ta aplikacja powstała?

1 użytkowników online, w tym zalogowanych: 0, gości: 1