Menu
Kontynuujemy rozwijanie projektu Menedżera Zadań
1. W katalogu res tworzymy podkatalog menu.
Z jego menu kontekstowego wybieramy New, Menu resource file i tworzymy plik activity_menedzer.xml zawierający:
2. Brakujące łańcuchy umieszczamy w pliku res/values/strings.xml.
Przy okazji usuwamy niepotrzebne.
Działające procesy:
Odśwież
Menedżer Zadań
Informacje
Zamknij wszystkie
Zadania
Procesy
Usługi
Wyjdź
Menedżer Zadań\n© Jacek Matulewski 2012\nWWW: http://www.jacekmatulewski.com
3. W klasie ZadaniaActivity dodajemy metody rozwijające menu i usuwające jeden element:
//menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.activity_menedzer, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.getItem(2).setVisible(false);
return true;
}
4. Obsługa menu - zmiana aktywnosci:
a. Metoda statyczna, ktora bedzie wywolywana ze wszystkich aktywnosci:
static void przelaczAktywnosc(Activity biezacaAktywnosc,Class> klasaNowejAktynosci)
{
biezacaAktywnosc.finish();
Intent intencja = new Intent(biezacaAktywnosc.getApplicationContext(), klasaNowejAktynosci);
biezacaAktywnosc.startActivity(intencja);
}
static void akcjaPoWyborzeElementuMenu(Activity activity, int itemId)
{
switch(itemId)
{
case R.id.menu_odswiez:
//
break;
case R.id.menu_zadania:
przelaczAktywnosc(activity, ZadaniaActivity.class);
break;
case R.id.menu_procesy:
przelaczAktywnosc(activity, ProcesyActivity.class);
break;
case R.id.menu_uslugi:
przelaczAktywnosc(activity, UslugiActivity.class);
break;
case R.id.menu_info:
Toast.makeText(activity.getApplicationContext(), R.string.info, Toast.LENGTH_LONG).show();
break;
case R.id.menu_koniec:
activity.finish();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
akcjaPoWyborzeElementuMenu(this,item.getItemId());
return true;
}
5. W klasach ProcesyActivity i UslugiActivity:
//menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.activity_menedzer, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.getItem(3).setVisible(false); //w uslugi: 4
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
ZadaniaActivity.akcjaPoWyborzeElementuMenu(this, item.getItemId());
return true;
}
--------------------
6. Odświeżanie list - idea: wszystkie aktywności dzielą ten sam kod
a. Potrzeba wspolnego mianownika dla wszystkich aktywnosci - wszystkie maja posiadac metode odswiezListe
Do app/java/pl.umk.fizyka.menedzerzadan dodajemy plik z abstrakcyjna klasą (nie interfejs, bo chcemy przekazywac
do metody statycznej jeden obiekt zawierajacy także własności typowe dla Activity):
Z menu kontekstowego app/java/pl.umk.fizyka.menedzerzadan wybieramy New, Java Class
Name: ActivityWithRefreshableList
Superclass: android.support.v7.app.AppCompatActivity (zastąpiło android.app.Activity, z której zresztą dziedziczy)
Visibility: Public
Modifiers: Abstract
Kliknij OK
Dodaj do klasy metodę odswiezListe
package pl.umk.fizyka.menedzerzadan;
import android.support.v7.app.AppCompatActivity;
public abstract class ActivityWithRefreshableList extends AppCompatActivity
{
public void odswiezListe() {};
}
b. Zmieniamy klasę bazową wszystkich trzech aktywności w projekcie na ActivityWithRefreshableList
np. public class ZadaniaActivity extends ActivityWithRefreshableList {
od razu musimy oznaczyć metody odswiezListe w tych klasach jako nadpisane i zmienić ich zakres na publiczne
@Override
public void odswiezListe()
{
...
c. Zmieniamy typ pierwszego argumentu w statycznej metodzie akcjaPoWyborzeElementuMenu z Activity na ActivityWithRefreshableList.
Dzieki temu mozemy wywolac metode odswiezListe:
static void akcjaPoWyborzeElementuMenu(ActivityWithRefreshableList activity, int itemId)
{
switch(itemId)
{
case R.id.menu_odswiez:
activity.odswiezListe();
break;
case R.id.menu_zadania:
...
}
7. Zabijanie wszystkich zadań, procesów lub usług.
Do metod onOptionsItemSelected w poszczególnych aktywnościach dodajemy instrukcje if
* Uwaga! W nowszych wersjach Androida zabijanie zadan nie jest czymś łatwym - nie należy tego robić
ZadaniaActivity.java:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
if(item.getItemId() == R.id.menu_zamknij_wszystkie)
{
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for(int i=0;i