Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator05 [2015/03/23 16:55]
Andrei Roșu-Cojocaru
laboratoare:laborator05 [2015/04/22 17:40] (current)
Andrei Roșu-Cojocaru [Spinner]
Line 279: Line 279:
   android:​dropDownVerticalOffset="​10dp"​   android:​dropDownVerticalOffset="​10dp"​
   android:​popupBackground="​@drawable/​mobiledevice"​   android:​popupBackground="​@drawable/​mobiledevice"​
-    ​android:​dropDownSelector="​@color/​lightblue"​ />+  ​android:​dropDownSelector="​@color/​lightblue"​ />
 </​code>​ </​code>​
 </​columns>​ </​columns>​
Line 598: Line 598:
 </​code>​ </​code>​
  
-{{ :​laboratoare:​sample_base_adapter.png?​nolink&​400 }}+{{ :​laboratoare:​laborator05:​sample_base_addapter.png?​nolink&​400 }}
  
 === SimpleCursorAdapter === === SimpleCursorAdapter ===
Line 1015: Line 1015:
 @Override @Override
 public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
-    ​// populate menu, via XML resource file or programatically +  ​// populate menu, via XML resource file or programatically 
-    return true;+  return true;
 } }
 </​code>​ </​code>​
Line 1022: Line 1022:
 Pentru sistemele Android anterioare versiunii 2.3.x, aceasta este apelată în mod automat atunci când utilizatorul accesează meniul, iar pentru sistemele Android anterioare versiunii 3.0 în momentul instanțierii activității,​ de vreme ce opțiunile meniului trebuie să fie accesibile și prin intermediul barei de acțiuni. Pentru sistemele Android anterioare versiunii 2.3.x, aceasta este apelată în mod automat atunci când utilizatorul accesează meniul, iar pentru sistemele Android anterioare versiunii 3.0 în momentul instanțierii activității,​ de vreme ce opțiunile meniului trebuie să fie accesibile și prin intermediul barei de acțiuni.
  
-<note important>​Este foarte important ca rezultatul metodei ''​onCreateOptionsMenu''​ să fie ''​true'',​ pentru a face meniul vizibil. În situația în care metoda întoarce ''​false'',​ meniul va fi invizibil. </​note>​+<note important>​Este foarte important ca rezultatul metodei ''​onCreateOptionsMenu()''​ să fie ''​true'',​ pentru a face meniul vizibil. În situația în care metoda întoarce ''​false'',​ meniul va fi invizibil. </​note>​
  
 Mai multe informații cu privire la meniuri pot fi consultate [[http://​developer.android.com/​guide/​topics/​ui/​menus.html|aici]]. Mai multe informații cu privire la meniuri pot fi consultate [[http://​developer.android.com/​guide/​topics/​ui/​menus.html|aici]].
Line 1031: Line 1031:
  
 **1.** **prin intermediul unui fișier de resurse XML** plasat în ''​res/​menu''​ - variantă preferată datorită faptului că: **1.** **prin intermediul unui fișier de resurse XML** plasat în ''​res/​menu''​ - variantă preferată datorită faptului că:
-  * meniul poate fi identificat prin intermediul unei denumiri (generată în mod automat în clasa ''​R.menu''​) +  * meniul poate fi identificat prin intermediul unei denumiri (generată în mod automat în clasa ''​R.menu''​); 
-  * intrările propriu-zise din cadrul meniului vor fi ordonate în mod automat, generarea identificatorilor corespunzătoare acestora realizându-se de asemenea automat +  * intrările propriu-zise din cadrul meniului vor fi ordonate în mod automat, generarea identificatorilor corespunzători acestora realizându-se de asemenea automat; 
-  * textele conținute vor fi localizate automat (prin referințele la fișierele ce conțin șiruri de caractere) +  * textele conținute vor fi localizate automat (prin referințele la fișierele ce conțin șiruri de caractere); 
-  * structura poate fi vizualizată mai clar, separându-se partea de prezentare (conținutului meniului) de logica aplicației (mecanismul de răspuns la acțiunile utilizatorului vis-a-vis de intrările ale meniului) +  * structura poate fi vizualizată mai clar, separându-se partea de prezentare (conținutului meniului) de logica aplicației (mecanismul de răspuns la acțiunile utilizatorului vis-a-vis de intrările ale meniului); 
-  * permite definirea de configurații diferite pentru diverse platforme (dimensiuni ale suprafeței de afișare)+  * permite definirea de configurații diferite pentru diverse platforme (dimensiuni ale suprafeței de afișare).
  
 <file xml /​res/​menu/​main.xml>​ <file xml /​res/​menu/​main.xml>​
 <menu xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​ > <menu xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​ >
-    ​<item +  ​<item 
-        android:​id="​@+id/​operations"​ +    android:​id="​@+id/​operations"​ 
- android:​title="​@string/​operations"​ > +    android:​title="​@string/​operations"​ > 
- <​menu>​ +    <​menu>​ 
-     ​<item +      <item 
-                android:​id="​@+id/​create"​ +        android:​id="​@+id/​create"​ 
- android:​icon="​@drawable/​create" + android:​icon="​@drawable/​create"​
- android:​orderInCategory="​100"​ +
- android:​showAsAction="​ifRoom"​ +
- android:​title="​@string/​create"​ /> +
-            <!-- add other submenu entries -->​  ​    +
-        </​menu>​ +
-    </​item>​ +
-    <group +
-        android:​id="​@+id/​generic_actions"​ +
-        android:​visible="​true"​ +
-        android:​enabled="​true"​ +
-        android:​checkableBehavior="​none"​ > +
-        <item +
-            android:​id="​@+id/​settings"​ +
-            android:​icon="​@drawable/​settings"​ +
-            android:​orderInCategory="​100"​ +
-            android:​showAsAction="​ifRoom"​ +
-     android:​title="​@string/​settings"​ /> +
-        <!-- add other menu entries --> +
-    </​group>​ +
-    <item +
-        android:​id="​@+id/​help"​ +
-        android:​icon="​@drawable/​help"+
         android:​orderInCategory="​100"​         android:​orderInCategory="​100"​
-        ​android:​showAsAction="​ifRoom"​ + android:​showAsAction="​ifRoom"​ 
-        android:​title="​@string/​help" /> + android:​title="​@string/​create" /> 
-    <!-- add other menu entries --> +      <!-- add other submenu entries -->​  ​   ​ 
 +    ​</​menu>​ 
 +  </​item>​ 
 +  <group 
 +    android:​id="​@+id/​generic_actions"​ 
 +    android:​visible="​true"​ 
 +    android:​enabled="​true"​ 
 +    android:​checkableBehavior="​none"​ > 
 +    <item 
 +      android:​id="​@+id/​settings"​ 
 +      android:​icon="​@drawable/​settings"​ 
 +      android:​orderInCategory="​100"​ 
 +      android:​showAsAction="​ifRoom"​ 
 +      android:​title="​@string/​settings"​ /> 
 +    <!-- add other menu entries --> 
 +  </​group>​ 
 +  <item 
 +    android:​id="​@+id/​help"​ 
 +    android:​icon="​@drawable/​help"​ 
 +    android:​orderInCategory="​100"​ 
 +    android:​showAsAction="​ifRoom"​ 
 +    android:​title="​@string/​help"​ /> 
 +  ​<!-- add other menu entries -->
 </​menu>​ </​menu>​
 </​file>​ </​file>​
Line 1077: Line 1077:
  
 **a.** ''<​item>''​ care creează **a.** ''<​item>''​ care creează
-  * un submeniu (de tip ''​android.view.Submenu''​) în cazul în care are imbricat un alt element de tip ''<​menu>''​ +  * un submeniu (de tip ''​android.view.Submenu''​) în cazul în care are imbricat un alt element de tip ''<​menu>''​; 
-  * o intrare propriu-zisă a meniului (de tip ''​android.view.MenuItem''​),​ dacă nu conține alte elemente+  * o intrare propriu-zisă a meniului (de tip ''​android.view.MenuItem''​),​ dacă nu conține alte elemente;
 Atributele elementului ''<​item>''​ sunt: Atributele elementului ''<​item>''​ sunt:
   * ''​android:​id''​ - un identificator unic pentru resursă care va fi utilizat ca referință pentru elementul respectiv   * ''​android:​id''​ - un identificator unic pentru resursă care va fi utilizat ca referință pentru elementul respectiv
Line 1105: Line 1105:
 @Override @Override
 public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
-    ​getMenuInflater().inflate(R.menu.main,​ menu); +  ​getMenuInflater().inflate(R.menu.main,​ menu); 
-    return true;+  return true;
 } }
 </​code>​ </​code>​
  
-**2.** **programatic**,​ în codul sursă, de regulă în cadrul metodei ''​onCreateOptionsMenu''​+**2.** **programatic**,​ în codul sursă, de regulă în cadrul metodei ''​onCreateOptionsMenu()''​
 Metodele prin intermediul cărora sunt adăugate intrări în cadrul meniului sunt: Metodele prin intermediul cărora sunt adăugate intrări în cadrul meniului sunt:
 <code java> <code java>
Line 1139: Line 1139:
 @Override @Override
 public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
-    ​MenuItem menuItem;+  ​MenuItem menuItem;
     ​     ​
-    ​SubMenu subMenu = menu.addSubMenu(GROUP_ID_NONE,​ SUBMENU_ID_OPERATIONS,​ MENU_ORDER, R.string.operations);​ +  ​SubMenu subMenu = menu.addSubMenu(GROUP_ID_NONE,​ SUBMENU_ID_OPERATIONS,​ MENU_ORDER, R.string.operations);​ 
-    menuItem = subMenu.add(GROUP_ID_NONE,​ MENU_ID_CREATE,​ MENU_ORDER, R.string.create);​ +  menuItem = subMenu.add(GROUP_ID_NONE,​ MENU_ID_CREATE,​ MENU_ORDER, R.string.create);​ 
-    menuItem.setIcon(R.drawable.create);​ +  menuItem.setIcon(R.drawable.create);​ 
-    menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);​ +  menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);​ 
-    // add other submenu entries+  // add other submenu entries
     ​     ​
-    ​menuItem = menu.add(GROUP_ID_GENERIC_ACTIONS,​ MENU_ID_SETTINGS,​ MENU_ORDER, R.string.settings);​ +  ​menuItem = menu.add(GROUP_ID_GENERIC_ACTIONS,​ MENU_ID_SETTINGS,​ MENU_ORDER, R.string.settings);​ 
-    menuItem.setIcon(R.drawable.settings);​ +  menuItem.setIcon(R.drawable.settings);​ 
-    menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);​ +  menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);​ 
-    // add other menu entries+  // add other menu entries
     ​     ​
-    ​menu.setGroupVisible(GROUP_ID_GENERIC_ACTIONS,​ true); +  ​menu.setGroupVisible(GROUP_ID_GENERIC_ACTIONS,​ true); 
-    menu.setGroupEnabled(GROUP_ID_GENERIC_ACTIONS,​ true); +  menu.setGroupEnabled(GROUP_ID_GENERIC_ACTIONS,​ true); 
-    menu.setGroupCheckable(GROUP_ID_GENERIC_ACTIONS,​ false, false);+  menu.setGroupCheckable(GROUP_ID_GENERIC_ACTIONS,​ false, false);
     ​     ​
-    ​menuItem = menu.add(GROUP_ID_NONE,​ MENU_ID_SETTINGS,​ MENU_ORDER, R.string.about);​ +  ​menuItem = menu.add(GROUP_ID_NONE,​ MENU_ID_SETTINGS,​ MENU_ORDER, R.string.about);​ 
-    menuItem.setIcon(R.drawable.about);​ +  menuItem.setIcon(R.drawable.about);​ 
-    menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);​ +  menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);​ 
-    // add other menu entries+  // add other menu entries
     ​     ​
-    ​return true;+  ​return true;
 } }
 </​code>​ </​code>​
Line 1168: Line 1168:
  
 Alte metode utile puse la dispoziție de clasa ''​Menu''​ sunt: Alte metode utile puse la dispoziție de clasa ''​Menu''​ sunt:
-  * ''​findItem(int)''​ - întoarce un obiect de tip ''​MenuItem'',​ dându-se identificatorul acestuia +  * ''​findItem(int)''​ - întoarce un obiect de tip ''​MenuItem'',​ dându-se identificatorul acestuia; 
-  * ''​getItem(int)''​ - întoarce un obiect de tip ''​MenuITem'',​ dându-se poziția acestuia +  * ''​getItem(int)''​ - întoarce un obiect de tip ''​MenuITem'',​ dându-se poziția acestuia; 
-  * ''​removeGroup(int)''​ - șterge toate elementele din cadrul unui grup, furnizându-se identificatorul acestuia +  * ''​removeGroup(int)''​ - șterge toate elementele din cadrul unui grup, furnizându-se identificatorul acestuia; 
-  * ''​clear()''​ - șterge toate intrările intrărilor din cadrul meniului, acesta rămânând vid +  * ''​clear()''​ - șterge toate intrările intrărilor din cadrul meniului, acesta rămânând vid; 
-  * ''​removeItem(int)''​ - șterge o intrare din cadrul meniului, dându-se identificatorul acestuia +  * ''​removeItem(int)''​ - șterge o intrare din cadrul meniului, dându-se identificatorul acestuia; 
-  * ''​size()''​ - furnizează numărul de intrări din cadrul meniului +  * ''​size()''​ - furnizează numărul de intrări din cadrul meniului; 
-  * ''​hasVisibleItems()''​ - precizează dacă există intrări din cadrul meniului care sunt vizible sau nu +  * ''​hasVisibleItems()''​ - precizează dacă există intrări din cadrul meniului care sunt vizible sau nu; 
-  * ''​close()''​ - determină închiderea meniului, în cazul în care acesta este deschis+  * ''​close()''​ - determină închiderea meniului, în cazul în care acesta este deschis.
  
 <note tip>În situația în care sunt definite meniuri atât pentru activitate cât și pentru fragmentele pe care le conține, acestea sunt combinate, fiind incluse inițial opțiunile din activitate și ulterior acțiunile din fragmente, în ordinea în care acestea sunt declarate. De asemenea, se poate realiza și sortarea prin intermediul numărului de ordine definit de fiecare intrare propriu-zisă a meniului în parte.</​note>​ <note tip>În situația în care sunt definite meniuri atât pentru activitate cât și pentru fragmentele pe care le conține, acestea sunt combinate, fiind incluse inițial opțiunile din activitate și ulterior acțiunile din fragmente, în ordinea în care acestea sunt declarate. De asemenea, se poate realiza și sortarea prin intermediul numărului de ordine definit de fiecare intrare propriu-zisă a meniului în parte.</​note>​
Line 1182: Line 1182:
  
 ==== Tratarea evenimentelor asociate meniurilor ==== ==== Tratarea evenimentelor asociate meniurilor ====
 +
 Tratarea evenimentelor de accesare a unei intrări a meniului se face în cadrul metodei ''​onOptionsItemSelected(MenuItem)'',​ apelată în mod automat în momentul producerii unui astfel de eveniment. Aceasta primește ca parametru opțiunea din cadrul meniului care a fost aleasă de utilizator, recunoașterea sa realizându-se prin intermediul identificatorului unic asociat fiecărei intrări: Tratarea evenimentelor de accesare a unei intrări a meniului se face în cadrul metodei ''​onOptionsItemSelected(MenuItem)'',​ apelată în mod automat în momentul producerii unui astfel de eveniment. Aceasta primește ca parametru opțiunea din cadrul meniului care a fost aleasă de utilizator, recunoașterea sa realizându-se prin intermediul identificatorului unic asociat fiecărei intrări:
  
Line 1187: Line 1188:
 @Override @Override
 public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
-    ​switch(item.getItemId()) { +  ​switch(item.getItemId()) { 
-        case R.id.create:​ +    case R.id.create:​ 
-        case MENU_ID_CREATE:​ +    case MENU_ID_CREATE:​ 
-            // ... +      // ... 
-            return true; +      return true; 
-        // ...            +    // ...            
-    } +  } 
-    return super.onOptionsItemSelected(item);​+  return super.onOptionsItemSelected(item);​
 } }
 </​code>​ </​code>​
Line 1206: Line 1207:
 <code java> <code java>
 public class CustomMenuItemClickListener implements MenuItem.OnMenuItemClickListener { public class CustomMenuItemClickListener implements MenuItem.OnMenuItemClickListener {
-    ​@Override +  ​@Override 
-    public boolean onMenuItemClick(MenuItem item) { +  public boolean onMenuItemClick(MenuItem item) { 
-        switch(item.getItemId()) { +    switch(item.getItemId()) { 
-            case R.id.create:​ +      case R.id.create:​ 
-            case MENU_ID_CREATE:​ +      case MENU_ID_CREATE:​ 
-                // ... +        // ...
-                return true; +
-            // ...            +
-        }+
         return true;         return true;
 +      // ...           
     }     }
 +    return true;
 +  }
 } }
  
Line 1228: Line 1229:
  
 **2.** **utilizarea unei intenții asociate la o intrare din cadrul meniului** prin intermediul metodei ''​setIntent(Intent)'',​ lansându-se în execuție activitatea corespunzătoare în condițiile în care: **2.** **utilizarea unei intenții asociate la o intrare din cadrul meniului** prin intermediul metodei ''​setIntent(Intent)'',​ lansându-se în execuție activitatea corespunzătoare în condițiile în care:
-  * nu este suprascrisă metoda de tratare a evenimentului de selectare a unei intrări din cadrul meniului ''​onOptionsItemSelected()''​ +  * nu este suprascrisă metoda de tratare a evenimentului de selectare a unei intrări din cadrul meniului ''​onOptionsItemSelected()''​; 
-  * în situația în care metoda de tratare a evenimentului de selectare a unei intrări din cadrul meniului ''​onOptionsItemSelected()''​ este suprascrisă,​ trebuie să se apeleze metoda părinte (''​super.onOptionsItemSelected(menu)''​) pentru acele intrări ale meniului ce nu sunt procesate+  * în situația în care metoda de tratare a evenimentului de selectare a unei intrări din cadrul meniului ''​onOptionsItemSelected()''​ este suprascrisă,​ trebuie să se apeleze metoda părinte (''​super.onOptionsItemSelected(menu)''​) pentru acele intrări ale meniului ce nu sunt procesate.
  
 În mod implicit, nici o intrare din cadrul unui meniu nu are asociată o intenție. În mod implicit, nici o intrare din cadrul unui meniu nu are asociată o intenție.
Line 1236: Line 1237:
  
 === Meniuri contextuale === === Meniuri contextuale ===
 +
 Un //meniu contextual//​ (clasa [[http://​developer.android.com/​reference/​android/​view/​ContextMenu.html|ContextMenu]]) este asociat de regulă unui control din cadrul interfeței grafice (spre diferență de meniurile de opțiuni care sunt asociate activităților). De regulă, acesta este accesat la operația de apăsare prelungită pe obiectul respectiv (de tip ''​View''​),​ având aceeași structură ca orice meniu, metodele utilizate pentru construirea sa fiind aceleași. Un //meniu contextual//​ (clasa [[http://​developer.android.com/​reference/​android/​view/​ContextMenu.html|ContextMenu]]) este asociat de regulă unui control din cadrul interfeței grafice (spre diferență de meniurile de opțiuni care sunt asociate activităților). De regulă, acesta este accesat la operația de apăsare prelungită pe obiectul respectiv (de tip ''​View''​),​ având aceeași structură ca orice meniu, metodele utilizate pentru construirea sa fiind aceleași.
  
Line 1249: Line 1251:
 @Override @Override
 public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
-    ​super.onCreateContextMenu(menu,​ v, menuInfo);​ +  ​super.onCreateContextMenu(menu,​ v, menuInfo);​ 
-    // option 1 +  // option 1 
-    MenuInflater inflater = getMenuInflater();​ +  MenuInflater inflater = getMenuInflater();​ 
-    inflater.inflate(R.menu.context_menu,​ menu); +  inflater.inflate(R.menu.context_menu,​ menu); 
-    // option 2 +  // option 2 
-    menu.setHeaderTitle(R.string.operations);​ +  menu.setHeaderTitle(R.string.operations);​ 
-    menu.add(GROUP_ID_NONE,​ MENU_ID_CREATE,​ MENU_ORDER, R.string.create);​+  menu.add(GROUP_ID_NONE,​ MENU_ID_CREATE,​ MENU_ORDER, R.string.create);​
 } }
 </​code>​ Metoda primește următorii parametri (ce pot fi utilizați pentru a se determina ce obiect din cadrul interfeței grafice a fost accesat, pentru a se instanția meniul contextual corespunzător):​ </​code>​ Metoda primește următorii parametri (ce pot fi utilizați pentru a se determina ce obiect din cadrul interfeței grafice a fost accesat, pentru a se instanția meniul contextual corespunzător):​
-    * ''​menu''​ - meniul contextual care se dorește a fi afișat +    * ''​menu''​ - meniul contextual care se dorește a fi afișat; 
-    * ''​view''​ - elementul din cadrul interfeței grafice căruia îi este asociat meniul contextual +    * ''​view''​ - elementul din cadrul interfeței grafice căruia îi este asociat meniul contextual; 
-    * ''​menuInfo''​ - un obiect care oferă informații suplimentare cu privire la elementul selectat+    * ''​menuInfo''​ - un obiect care oferă informații suplimentare cu privire la elementul selectat.
   - implementarea metodei ''​onContextItemSelected(MenuItem)''​ care gestionează acțiunea de selectare a unei intrări din cadrul meniului contextual <code java>   - implementarea metodei ''​onContextItemSelected(MenuItem)''​ care gestionează acțiunea de selectare a unei intrări din cadrul meniului contextual <code java>
 @Override @Override
 public boolean onContextItemSelected(MenuItem item) { public boolean onContextItemSelected(MenuItem item) {
-    ​AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo)item.getMenuInfo();​ +  ​AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo)item.getMenuInfo();​ 
-    // or +  // or 
-    ExpandableContextMenuInfo expandableContextMenuInfo = (ExpandableContextMenuInfo)item.getMenuInfo();​ +  ExpandableContextMenuInfo expandableContextMenuInfo = (ExpandableContextMenuInfo)item.getMenuInfo();​ 
-    switch(item.getItemId()) { +  switch(item.getItemId()) { 
-        case R.id.create:​ +    case R.id.create:​ 
-        case MENU_ID_CREATE:​ +    case MENU_ID_CREATE:​ 
-            // ... +      // ... 
-            return true; +      return true; 
-        // ...            +    // ...            
-    } +  } 
-    return super.onContextItemSelected(item);​+  return super.onContextItemSelected(item);​
 } }
 </​code>​ Tratarea acțiunii de selectare a unei intrări din cadrul meniului contextual trebuie semnalată prin întoarcerea unui rezultat al metodei de tip ''​true'',​ în caz contrar trebuind apelată metoda părinte ''​super.onContextItemSelected(item)''​ care va determina apelarea metodelor corespunzătoare eventualelor fragmente pe care le poate conține activitatea (în ordinea în care acestea au fost declarate) până în momentul în care una dintre acestea va întoarce un rezultat (implementarea implicită a metodei întoarce ''​false''​ atât pentru clasa ''​Activity''​ cât și pentru clasa ''​Fragment''​). </​code>​ Tratarea acțiunii de selectare a unei intrări din cadrul meniului contextual trebuie semnalată prin întoarcerea unui rezultat al metodei de tip ''​true'',​ în caz contrar trebuind apelată metoda părinte ''​super.onContextItemSelected(item)''​ care va determina apelarea metodelor corespunzătoare eventualelor fragmente pe care le poate conține activitatea (în ordinea în care acestea au fost declarate) până în momentul în care una dintre acestea va întoarce un rezultat (implementarea implicită a metodei întoarce ''​false''​ atât pentru clasa ''​Activity''​ cât și pentru clasa ''​Fragment''​).
Line 1288: Line 1290:
 </​code>​ O activitate poate fi invocată prin intermediul unui meniu contextual, dacă specifică valorile respective în câmpul ce indică filtrul pentru intenții în fișierul ''​AndroidManifest.xml'':​ <code xml> </​code>​ O activitate poate fi invocată prin intermediul unui meniu contextual, dacă specifică valorile respective în câmpul ce indică filtrul pentru intenții în fișierul ''​AndroidManifest.xml'':​ <code xml>
 <​intent-filter>​ <​intent-filter>​
-   ... + ... 
-   ​<​category android:​name="​android.intent.category.ALTERNATIVE"​ /> + <​category android:​name="​android.intent.category.ALTERNATIVE"​ /> 
-   ​<​category android:​name="​android.intent.category.SELECTED_ALTERNATIVE"​ /> + <​category android:​name="​android.intent.category.SELECTED_ALTERNATIVE"​ /> 
-   ​...+ ...
 </​intent-filter>​ </​intent-filter>​
 </​code>​ </​code>​
   - căutarea unor activități care pot fi invocate folosind intenția respectivă prin intermediul metodei ''​Menu.addIntentOptions''​ (apelată pe obiectul transmis ca parametru metodei ''​onCreateOptionsMenu()''​) <code java>   - căutarea unor activități care pot fi invocate folosind intenția respectivă prin intermediul metodei ''​Menu.addIntentOptions''​ (apelată pe obiectul transmis ca parametru metodei ''​onCreateOptionsMenu()''​) <code java>
 menu.addIntentOptions( menu.addIntentOptions(
-    ​Menu.CATEGORY_ALTERNATIVE,​ // the group the contextual menu will be attached to +  ​Menu.CATEGORY_ALTERNATIVE,​ // the group the contextual menu will be attached to 
-    Menu.CATEGORY_ALTERNATIVE,​ // menu item ID for all of the menu items +  Menu.CATEGORY_ALTERNATIVE,​ // menu item ID for all of the menu items 
-    Menu.CATEGORY_ALTERNATIVE,​ // order number for each of the menu items +  Menu.CATEGORY_ALTERNATIVE,​ // order number for each of the menu items 
-    this.getComponentName(), ​  // the name of the current activity +  this.getComponentName(), ​  // the name of the current activity 
-    null,                      // no specific items to place with priority +  null,                      // no specific items to place with priority 
-    intent, ​                   // intent that can invoke the corresponding activities (previously defined) +  intent, ​                   // intent that can invoke the corresponding activities (previously defined) 
-    0,                         // no additional flags to manage the menu items +  0,                         // no additional flags to manage the menu items 
-    null); ​                    // no array of menu items to correlate with specific items+  null); ​                    // no array of menu items to correlate with specific items
 </​code>​ Metoda furnizează o listă de activități care corespund criteriilor precizate de intenție populând cu acestea intrările din cadrul meniului, în cadrul unui anumit grup, alocându-le identificatori și numere de ordine începând cu o anumită valoare.\\ Semnătura metodei este: <code java> </​code>​ Metoda furnizează o listă de activități care corespund criteriilor precizate de intenție populând cu acestea intrările din cadrul meniului, în cadrul unui anumit grup, alocându-le identificatori și numere de ordine începând cu o anumită valoare.\\ Semnătura metodei este: <code java>
 public abstract int addIntentOptions (int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) public abstract int addIntentOptions (int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems)
Line 1323: Line 1325:
  
 El se distinge însă față de celelalte tipuri de meniuri, față de care ar părea să implementeze o funcționalitate comună: El se distinge însă față de celelalte tipuri de meniuri, față de care ar părea să implementeze o funcționalitate comună:
-  * spre diferență de meniurile de opțiuni, acesta este creat în mod manual și doar atunci când este accesat elementul căruia îi este atașat +  * spre diferență de meniurile de opțiuni, acesta este creat în mod manual și doar atunci când este accesat elementul căruia îi este atașat; 
-  * spre diferență de meniurile contextuale,​ acesta nu are nici un impact asupra controlului grafic căruia îi este atașat+  * spre diferență de meniurile contextuale,​ acesta nu are nici un impact asupra controlului grafic căruia îi este atașat;
  
 Un meniu de tip pop-up poate fi creat - ca orice meniu - atât prin intermediul unui fișier XML de resurse cât și programatic. Un meniu de tip pop-up poate fi creat - ca orice meniu - atât prin intermediul unui fișier XML de resurse cât și programatic.
Line 1332: Line 1334:
 public void showPopupMenu(View view) { public void showPopupMenu(View view) {
  
-    ​PopupMenu popupMenu = new PopupMenu(this,​ menu);+  ​PopupMenu popupMenu = new PopupMenu(this,​ menu);
     ​     ​
-    ​// option 1: defining a popup menu via a XML resource file+  ​// option 1: defining a popup menu via a XML resource file
     ​     ​
-        ​// android 3.0 +  ​// android 3.0 
-        MenuInflater menuInflater = popupMenu.getMenuInflater();​ +  MenuInflater menuInflater = popupMenu.getMenuInflater();​ 
-        menuInflater.inflate(R.menu.popup_menu,​ popupMenu.getMenu());​+  menuInflater.inflate(R.menu.popup_menu,​ popupMenu.getMenu());​
         ​         ​
-        ​// android 4.0 +  ​// android 4.0 
-        popupMenu.inflate(R.menu.popup_menu);​+  popupMenu.inflate(R.menu.popup_menu);​
         ​         ​
-    ​// option 2: defining a popup menu programatically +  ​// option 2: defining a popup menu programatically 
-    Menu menu = popupMenu.getMenu();​ +  Menu menu = popupMenu.getMenu();​ 
-    menu.add(GROUP_ID_NONE,​ MENU_ID_CREATE,​ MENU_ORDER, R.string.create);​ +  menu.add(GROUP_ID_NONE,​ MENU_ID_CREATE,​ MENU_ORDER, R.string.create);​ 
-    // ...+  // ...
     ​     ​
-    ​popup.show();​+  ​popup.show();​
 } }
 </​code>​ </​code>​
Line 1362: Line 1364:
 <code java> <code java>
 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
-                                         @Override +    ​@Override 
-                                         ​public boolean onMenuItemClick(MenuItem item) { +    public boolean onMenuItemClick(MenuItem item) { 
-                                             ​switch(item.getItemId()) { +      switch(item.getItemId()) { 
-                                                 ​case R.id.create:​ +        case R.id.create:​ 
-                                                 ​case MENU_ID_CREATE:​ +        case MENU_ID_CREATE:​ 
-                                                     ​// ... +          // ... 
-                                                     ​return true; +          return true; 
-                                                 ​// ...            +        // ...            
-                                             ​} +      } 
-                                             ​return true; +      return true; 
-                                         ​} +    } 
-                                     ​});+});
 </​code>​ </​code>​
  
Line 1704: Line 1706:
 </​code>​ </​code>​
  
-**7.** Să se realizeze o dispunere alternativă a listei de contacte din agenda telefonică,​ astfel încât pe rândurile pare respectiv pe rândurile impare, imaginea asociată unei persoane și pictograma indicând dacă aceasta a fost inclusă în lista de favoriți să apară dispuse în oglindă.+**7.** Să se realizeze o dispunere alternativă a listei de contacte din agenda telefonică,​ astfel încât pe rândurile pare respectiv pe rândurile impare, imaginea asociată unei persoane și pictograma indicând dacă aceasta a fost inclusă în lista de favoriți să fie aranjate invers. 
 + 
 +{{ :​laboratoare:​laborator05:​address_book_dispunere_alternativa.png?​nolink&​400 }}
  
   * în directorul ''​res/​layout''​ se vor defini două fișiere, ''​contact_view_odd.xml''​ și ''​contact_view_even.xml'',​ conținând cele două moduri de dispunere diferită;   * în directorul ''​res/​layout''​ se vor defini două fișiere, ''​contact_view_odd.xml''​ și ''​contact_view_even.xml'',​ conținând cele două moduri de dispunere diferită;
Line 1808: Line 1812:
 ===== Resurse Utile ===== ===== Resurse Utile =====
  
-[[http://​ptgmedia.pearsoncmg.com/​images/​9780321940261/​samplepages/​0321940261.pdf|Joseph ANNUZZI, Jr, Lauren DARCEY, Shane CONDER, Introduction to Android Application Development - Developer'​s Library, 4th Edition, Addison-Wesley,​ 2013]] - capitolul 8, subcapitolele ​//Using Container Control Classes//, capitolul 17, subcapitolul //​Menus//​\\ ​+[[http://​ptgmedia.pearsoncmg.com/​images/​9780321940261/​samplepages/​0321940261.pdf|Joseph ANNUZZI, Jr, Lauren DARCEY, Shane CONDER, Introduction to Android Application Development - Developer'​s Library, 4th Edition, Addison-Wesley,​ 2013]] - capitolul 8, subcapitolul ​//Using Container Control Classes//, capitolul 17, subcapitolul //​Menus//​\\ ​
 [[http://​www.bignerdranch.com/​we-write/​android-programming/​|Bill PHILLIPS, Brian HARDY, Android Programming. The Big Nerd Ranch Guide, Pearson Technology Group, 2013]] - capitolele 9, 16\\  [[http://​www.bignerdranch.com/​we-write/​android-programming/​|Bill PHILLIPS, Brian HARDY, Android Programming. The Big Nerd Ranch Guide, Pearson Technology Group, 2013]] - capitolele 9, 16\\ 
-[[http://​www.amazon.com/​Professional-Android-4-Application-Development/​dp/​1118102274|Reto MEIER, Professional Android for Application Development,​ John Wiley & Sons, 2012]] - capitolul ​4 (//The Android Widget Toolbok//, //​Introducing Adapters//​),​ 10 (//​Configuring Action Bar Icon Navigation Behavior//​)\\ ​+[[http://​www.amazon.com/​Professional-Android-4-Application-Development/​dp/​1118102274|Reto MEIER, Professional Android for Application Development,​ John Wiley & Sons, 2012]] - capitolele ​4 (//The Android Widget Toolbok//, //​Introducing Adapters//​),​ 10 (//​Configuring Action Bar Icon Navigation Behavior//​)\\ ​
 [[http://​books.google.ro/​books/​about/​The_Android_Developer_s_Cookbook.html?​id=Y4JR2yI2Fo0C&​redir_esc=y|Ronan SCHWARZ, Phil DUTSON, James STEELE, Nelson TO, Android Developer'​s Cookbook, Building Applications with the Android SDK, 2nd Edition, Addison Wesley, 2013]] - capitolele 6, 7\\  [[http://​books.google.ro/​books/​about/​The_Android_Developer_s_Cookbook.html?​id=Y4JR2yI2Fo0C&​redir_esc=y|Ronan SCHWARZ, Phil DUTSON, James STEELE, Nelson TO, Android Developer'​s Cookbook, Building Applications with the Android SDK, 2nd Edition, Addison Wesley, 2013]] - capitolele 6, 7\\ 
 [[http://​eu.wiley.com/​WileyCDA/​WileyTitle/​productCd-1118199545.html|Wei Meng LEE, Beginning Android 4 Application Development,​ Wiley, 2012]]\\ ​ [[http://​eu.wiley.com/​WileyCDA/​WileyTitle/​productCd-1118199545.html|Wei Meng LEE, Beginning Android 4 Application Development,​ Wiley, 2012]]\\ ​
laboratoare/laborator05.1427122510.txt.gz · Last modified: 2015/03/23 16:55 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0