Autore Topic: Context Menu  (Letto 1149 volte)

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Context Menu
« il: 10 Agosto 2011, 16:48:54 CEST »
0
Buongiorno a tutti, premetto che sono un utente alle primissime armi con lo sviuppo per android...

Oggi stavo guardando come programmare i context menù ma ho riscontrato dei problemi, ossia prendendo un esempio fatto e finito ho provato a farlo girare, l'installazione sull'emulatore avviene correttamente ma l'applicazione non fa nulla, ossia, non visualizza il context menù associato ai pulsati che compaiono sullo schermo.

Di seguito allego il codice dell'applicazione:

Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

//import android.widget.Button;    
     
    public class MenuContextActivity extends Activity {  
        /** Called when the activity is first created. */  
       
        private static final int MENUITEM_COMANDO_1 = 1;
        private static final int MENUITEM_COMANDO_2 = 2;
        private static final int MENUITEM_COMANDO_3 = 3;
        private static final int MENUITEM_COMANDO_4 = 4;

       
        @Override  
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                Button button1 = new Button(this);
                button1.setId(1);
                button1.setText("Bottone 1");
                Button button2 = new Button(this);
                button2.setId(2);
                button2.setText("Bottone 2");
                LinearLayout layout = new LinearLayout(this);
                layout.addView(button1);
                layout.addView(button2);
                setContentView(layout);
                registerForContextMenu(button1);
                registerForContextMenu(button2);

        }
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
        {
                System.out.println("Create context Menu");
                if (v.getId() == 1)
                {
                        menu.setHeaderTitle("Menù bottone 1");
                        menu.add(Menu.NONE, MENUITEM_COMANDO_1,1, "Comando 1");
                        menu.add(Menu.NONE, MENUITEM_COMANDO_2,2, "Comando 2");
                        }
                else if (v.getId() == 2)
                {
                        menu.setHeaderTitle("Menù bottone 2");
                        menu.add(Menu.NONE, MENUITEM_COMANDO_3,1, "Comando 3");
                        menu.add(Menu.NONE, MENUITEM_COMANDO_4,2, "Comando 4");
                }
        }
        @Override
        public boolean onContextItemSelected(MenuItem item)
        {
                System.out.println("Context Item Selected");
                int id = item.getItemId();
                switch (id)
                {
                        case MENUITEM_COMANDO_1:
                                Toast.makeText(this, "Comando 1", Toast.LENGTH_SHORT).show();
                                return true;
                        case MENUITEM_COMANDO_2:
                                Toast.makeText(this, "Comando 2", Toast.LENGTH_SHORT).show();
                                return true;
                        case MENUITEM_COMANDO_3:
                                Toast.makeText(this, "Comando 3", Toast.LENGTH_SHORT).show();
                                return true;
                        case MENUITEM_COMANDO_4:
                                Toast.makeText(this, "Comando 4", Toast.LENGTH_SHORT).show();
                                return true;
                }
                return false;
        }@Override
        public void onContextMenuClosed(Menu menu)
        {
                System.out.println("Context Menu Closed");
                Toast.makeText(this, "Menù chiuso!", Toast.LENGTH_SHORT).show();
        }
 }

Quest'applicazione dovrebbe visualizzare due pulsanti e premendo su di essi dovrebbe comparire un menù contestuale.

Grazie in anticipo a tutti
« Ultima modifica: 11 Agosto 2011, 09:44:13 CEST da teskio »
Non esistono problemi, ma solo soluzioni...

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Context Menu
« Risposta #1 il: 11 Agosto 2011, 09:13:20 CEST »
0
Il codice va messo nei tag JAVA!
altrimenti non si capisce niente!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Context Menu
« Risposta #2 il: 11 Agosto 2011, 09:45:59 CEST »
0
Come diceva Nicola, per cortesia quando includi codice Java, mettilo tra gli appositi marcatori (tasto per renderlo leggibile.

Non sono andato a fondo nella lettura del codice, perchè ho visto che utilizzi l'insolito modo programmatico per creare gli oggetti del layout. Dovresti utilizzare il modo dichiarativo (con XML) essenzialmente perchè è molto più usato (tuti gli esempi e tutorial che vedrai usano quel metodo). Creando i due pulsanti con l'XML dei layout, definisci un ID che è poi quello che andrai a richiamare con il nome associato.

Comunque, per darti uno spunto direttamente sul codice che hai scritto in onCreateContextMenu, come regola generale evita sempre costrutti IF che non gestiscono tutti i casi possibili, cioè IF (...) ELSE IF (..) lascia non gestito il caso in cui nessuna delle due condizioni sia valida. Se invece usi IF (..) ELSE (..) in condizioni normali ottieni lo stesso comportamento, mentre se c'è qualcosa di inatteso almeno fa qualcosa. Potresti a limite usare IF (...) ELSE IF (...) ELSE (...) .

Se cambi il codice in questo modo, almeno vedi se è un problema di ID.

Codice (Java): [Seleziona]
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
        {
           System.out.println("Create context Menu");
           if (v.getId() == 1)
           {
              menu.setHeaderTitle("Menù bottone 1");
              menu.add(Menu.NONE, MENUITEM_COMANDO_1,1, "Comando 1");
              menu.add(Menu.NONE, MENUITEM_COMANDO_2,2, "Comando 2");
              }
           else
           {
              menu.setHeaderTitle("Menù bottone 2");
              menu.add(Menu.NONE, MENUITEM_COMANDO_3,1, "Comando 3");
              menu.add(Menu.NONE, MENUITEM_COMANDO_4,2, "Comando 4");
           }
        }
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Context Menu
« Risposta #3 il: 11 Agosto 2011, 20:47:45 CEST »
0
Vi ringrazio per le risposte e vi chiedo scusa per i tag java omessi...

Ho provato a sostituire il codice che mi era stato suggerito, ma devo dire che non cambia di una virgola...

Ho provato anche a far passare quello che accade nei log...sembra quasi che non legga nemmeno la pressione dei bottoni quando ci clicco sopra...

Chiedo a voi consiglio  :'(
Non esistono problemi, ma solo soluzioni...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Context Menu
« Risposta #4 il: 11 Agosto 2011, 21:58:33 CEST »
0
A me non convince il setId, ti consiglio di creare i Button in main.xml con relativo ID (elimina cioè i new Button e il setId).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Context Menu
« Risposta #5 il: 12 Agosto 2011, 09:04:49 CEST »
0
Mi spiace essere ancora qui a tormentarvi...

Ho provato a fare quello che mi era stato suggerito da Bradipao, ossia di inserire la dichiarazione dei pulsanti all'interno del main.xml

Tuttavia ora mi crasha il programmino senza nemmeno avviarsi...

Nel senso: non dà errori di nessun genere di tipo sintattico, ma appena provo a farla runnare questa crolla e mi viene dato sullo schermo di android l'allert con il seguente messaggio:
"The application menuContext (process it.MenuContext) has stopped unexpectedly. Please try again"

Ho provato a confrontare il mio programma con quelli fatti in precedenza ma non trovo differenze significative e quelli funzionavano...

Allego il codice che ho modificato:

Codice (Java): [Seleziona]
 
      @Override  
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                Button button1 = (Button) findViewById(R.string.b1);
                Button button2 = (Button) findViewById(R.string.b2);
                registerForContextMenu(button1);
                registerForContextMenu(button2);

        }
 
quello del main:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent" android:orientation="vertical">
<TextView  
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="@string/hello"
   />
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:text="@string/b1"></Button>
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/button2" android:text="@string/b2"></Button>
</LinearLayout>

e ovviamente quello dello string.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, MenuContextActivity!</string>
    <string name="app_name">menuContext</string>
    <string name="b1">pulsante1</string>
    <string name="b2">pulsante2</string>
</resources>

Aspettando nuove delucidazioni...nuovi suggerimenti vi ringrazio per la disponibilità
Non esistono problemi, ma solo soluzioni...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Context Menu
« Risposta #6 il: 12 Agosto 2011, 09:36:27 CEST »
0
Ok, se crasha lascia qualcosa nel LogCat (per delucidazione, link in firma di tutti i moderatori).

In Eclipse metti visibile il pannello del LogCat, con l'apposito tastino cancellane il contenuto, quindi riproduci il crash e posta le righe che riportano error.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Context Menu
« Risposta #7 il: 12 Agosto 2011, 09:45:50 CEST »
0
Citazione
sembra quasi che non legga nemmeno la pressione dei bottoni quando ci clicco sopra...

Forse dico cosa scontata e che sai già...ma il context menu si attiva sul long-press non sul on-click

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Context Menu
« Risposta #8 il: 12 Agosto 2011, 09:56:15 CEST »
0
Sei molto gentile...

Ho provato a fare come mi hai detto e linko quanto vedo nei log:
  • Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=it.menuContext/.MenuContextActivity }
  • Start proc it.menuContext for activity it.menuContext/.MenuContextActivity: pid=289 uid=10038 gids={}
  • generated scanline__00000077:03545404_00000004_00000000 [ 47 ipp] (67 ins) at [0x371e58:0x371f64] in 573955 ns
  • Shutting down VM
  • threadid=1: thread exiting with uncaught exception (group=0x4001d800)
  • ERROR/AndroidRuntime(289): FATAL EXCEPTION: main
  • java.lang.RuntimeException: Unable to start activity ComponentInfo{it.menuContext/it.menuContext.MenuContextActivity}: java.lang.NullPointerException
Dopodichè è una sequenza di risalita all'interno dei vari adroid.app che non sanno come gestire l'eccezione...

Provando a leggerle quanto vi ho scritto mi viene da chiedermi come mai vi è un NullPoiterException....



Non esistono problemi, ma solo soluzioni...

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Context Menu
« Risposta #9 il: 12 Agosto 2011, 10:00:26 CEST »
0
Ok, se crasha lascia qualcosa nel LogCat (per delucidazione, link in firma di tutti i moderatori).

In Eclipse metti visibile il pannello del LogCat, con l'apposito tastino cancellane il contenuto, quindi riproduci il crash e posta le righe che riportano error.

Ok, ma allora perchè ora crasha? Rimane il fatto che l'applicazione non faccesse nulla, in nessun modo...  :'(
Non esistono problemi, ma solo soluzioni...

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Context Menu
« Risposta #10 il: 12 Agosto 2011, 10:18:21 CEST »
0
L'errore è qui :
Codice (Java): [Seleziona]
Button button1 = (Button) findViewById(R.string.b1);
Button button2 = (Button) findViewById(R.string.b2);

devi mettere l'id dei button secondo il codice che hai riportato, cioè :
Codice (Java): [Seleziona]
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Context Menu
« Risposta #11 il: 12 Agosto 2011, 10:30:04 CEST »
0
Grazieeeeee

Scusatemi un mondo per la mia stoltaggine..

Grazie ancora dell'aiuto a tutti quanti  :-)
Non esistono problemi, ma solo soluzioni...