2011-06-22 8 views
9

Ok Projektuję aplikację, która ma bardzo prosty układ 62 ekranów zawartości, do których dostęp ma 27 ekranów menu. W sumie jest to 89 działań.W Androidzie każdy ekran powinien być jego własną aktywnością lub układem?

W tej chwili każdy ekran zawartości jest działaniem, które po prostu wywołuje układ XML (tekst, przyciski i obraz) i dodaje trochę funkcjonalności onClick.

Każdy ekran menu jest ListActivity i naciśnięcie każdego elementu na liście otwiera działanie tego elementu (czy to inny ekran menu lub ekran zawartości).

W tej chwili testuję go za pomocą 3 ekranów menu i ekranu zawartości. Dobrze jest przewijać je wszystkie, ale obawiam się, że kiedy skończę aplikację, będzie ona miała zbyt wiele aktywności i spowolni i spowolni działanie aplikacji. Przy średnim użytkowaniu aplikacji wyobrażam sobie, że użytkownik użyłby nie więcej niż 10 działań, ale nie jestem pewien, czy Android przewidywałby tworzenie innych nieużywanych Działań lub co.

Innym sposobem na wdrożenie tego byłoby posiadanie tylko kilku działań (może być 1 dla Menu głównego, 1 dla podmenu i 1 dla ContentScreen), które po prostu sprawdzają, który układ wyświetlić. Jednak uważam, że oznaczałoby to, że każde działanie ma dużo więcej pracy do wykonania, a także tracę funkcjonalność naciśnięcia przycisku Wstecz, zabierając użytkownika z powrotem przez hierarchię menu (i kodowanie zastępczego przycisku Wstecz na każdym ekranie obejmują ogromny przypadek dla onClick obejmujący każdy możliwy układ, wszystkie 89 z nich!).

Jaki byłby najlepszy sposób korzystania z tej aplikacji?

Każda pomoc jest bardzo cenione

+1

Co twoja aplikacja zrobić? To dużo ekranów zawartości. – Matt

+0

To aplikacja przewodnika, więc każda strona z treściami zawiera hotele, restauracje, atrakcje itp. – Stu

Odpowiedz

2

Jeśli układy i zachowania nie odbiegają znacząco między działaniami menu a działaniami związanymi z treścią, skorzystam z "tylko kilku działań".

Przycisk Wstecz nie zostanie przerwany, Android śledzi Twoje zaległości.

Czy naprawdę potrzebujesz 89 różnych układów? Jeśli w większości zależy od tego, co się między nimi różni, przechowuj zawartość w bazie danych lub pliku lub w aplikacji /res/, używaj ponownie układów i wypełniaj obszary zawartości w czasie wykonywania.


Aktualizacje:

nie byłoby najłatwiej mieć 1 aktywność na stronach, które są w onCreate() wypełnia w układzie z odpowiednią zawartością?

Zależy od tego, jak będzie się różnić Twój kod onCreate(). Jeśli Twój onCreate() ma być gigantycznym switch z 62 różnymi klauzulami case, to prawdopodobnie lepiej jest iść z oddzielnymi, małymi czynnościami, a nie dużymi. Jeśli możesz uogólnić kod onCreate() i zachować go poniżej, powiedzmy, 100 linii i 10 instrukcji oddziału, to byłaby droga.

Dając przykład, jakiś czas temu budowałem prostą aplikację, która zawiera zbiór pytań egzaminacyjnych i przedstawia je losowo użytkownikowi. Każde pytanie zawiera tekst pytania, ilustracje i 2-4 odpowiedzi. Było około 500 różnych pytań. Oto kod ładujący pytanie z bazy danych i aktualizujący układ. Zauważ, że obsługuje zmienną liczbę odpowiedzi i możliwość niektórych pytań nie posiadających ilustracji.

public void loadQuestion(int id) { 
    // Columns in questions table: 
    // CREATE TABLE questions (
    //   id integer, 
    //   q text, 
    //   a1 text, 
    //   a2 text, 
    //   a3 text, 
    //   a4 text, 
    //   a5 text, 
    //   correct integer, 
    //   img blob 
    // ); 

    Cursor c = mDatabase.rawQuery("SELECT * FROM questions where id=" + id, null); 
    c.moveToFirst(); 

    TextView text = (TextView) findViewById(R.id.text); 
    text.setText(c.getString(1)); 

    RadioGroup g = (RadioGroup) findViewById(R.id.answers); 
    g.clearCheck(); 

    // Load answers! 
    int correct = c.getInt(7); 
    int[] buttons = new int[] {R.id.a1, R.id.a2, R.id.a3, R.id.a4, R.id.a5}; 
    for (int i=0; i < 5; i++) { 
     String answerText = c.getString(i + 2); 
     RadioButton rb = (RadioButton) findViewById(buttons[i]); 
     if (answerText != null && answerText.length() > 0) { 
      rb.setText(answerText); 
      rb.setTag(i + 1 == correct ? "correct" : null); 
      rb.setVisibility(RadioButton.VISIBLE); 
     } else { 
      rb.setVisibility(RadioButton.GONE); 
     } 
    } 

    byte[] encoded = c.getBlob(8); 
    ImageView iv = (ImageView) findViewById(R.id.image); 
    if (encoded != null && encoded.length > 0) { 
     iv.setVisibility(ImageView.VISIBLE); 
     iv.setImageBitmap(bytesToBitmap(encoded)); 
    } else { 
     iv.setVisibility(ImageView.GONE); 
    } 
} 

Co masz na myśli mówiąc: przycisk Wstecz nie złamie, Android śledzi zaległości?

miarę przesuwania użytkowników z działalności do działalności, w całej aplikacji, system Android zachowuje liniową historię nawigację działań użytkownik odwiedzonych. Jest to stos działań, znany również jako back-stack. Ogólnie, gdy użytkownik rozpoczyna nową aktywność , jest on dodawany do stosu aktywności , tak że naciśnięcie BACK wyświetla poprzednią aktywność na stosie.

(od Activity and Task Design Guidelines)

+0

W tej chwili mam 1 układ XML i 2 układy wierszy dla 27 menu, które są wypełniane w czasie wykonywania. Mógłbym zrobić to samo, żeby treść była szczera, po prostu o tym nie pomyślałem! Jeśli jednak zrobiłem to w ten sposób, czy nie byłoby najłatwiej mieć 1 aktywność na stronę treści, która w onCreate() wypełnia układ odpowiednią treścią? Wreszcie, co masz na myśli: przycisk Wstecz nie zostanie przerwany, Android śledzi Twoje zaległości? – Stu

+0

@Stu: Zaktualizowałem moją odpowiedź –

+0

Dzięki Peteris. Poszedłem z "kilkoma działaniami" w końcu. Mam 1 aktywność na typ menu (jeśli ma ikonę lub nie) i 1 aktywność na stronę treści. Przekazuję zamiary, w których ustawiam odpowiednią treść dla układu. W ten sposób wydaje się znacznie łatwiej! – Stu

0

możesz ponownie wykorzystać swój układ i użyć metod startAcitity i startActivityForResult do zarządzania efektywnością działań.

Powiązane problemy