Usare command-line-upload-script TestFairy Android

Problema: Dopo la creazione dell’apk con Android Studio e l’upload su TestFairy per testare l’app su altri dispositivi accadeva che non visualizzavo la mappa di google (schermata completamente grigia).

Soluzione: Effettuare l’upload dell’apk tramite lo script: testfairy-upload-android.sh

Spiegazione:

TestFairy è una applicazione per il beta testing delle applicazioni e piattaforme di distribuzione. Leggi le caratteristiche della piattaforma TestFairy e una descrizione dettagliata cliccando qui ().

Quando si carica una qualsiasi “build” su TestFairy accade che TF elabora la “build” e inserisce un pò di codice dinamico. Durante il processo, non si tiene conto che la costruzione è “stato firmata”. Prima che la build è resa disponibile per i beta tester, la piattaforma TestFairy firma la build con una chiave keystore PERSONALE. Questo è il motivo per il quale la nostra applicazione non funzionerà correttamente per tutti quei servizi di terzi come: Facebook, Google Map, Google Cloud Messaging (GCM) etc.

Ecco la soluzione !! Invece di caricare l’apk tramite interfaccia web dal sito di TestFairy, è possibile utilizzare lo script da riga di comando.

In questo post vedremo le configurazioni e come eseguire lo script testfairy uploader.

1. Scaricare TestFairy Command Line Upload Script

Lo script da riga di comando lo troverete qui.

Una volta che avete scaricato tutto il file zip aprite il file  testfairy-upload-android.sh dove andremo a cambiare le varie configurazioni.

Questo è il file:

#!/bin/sh

UPLOADER_VERSION=1.09

# Inserite il vostro TestFairy API_KEY qui. Potrete trovarlo nel vostro account in impostazioni
TESTFAIRY_API_KEY=

# Inserire Keystore, Storepass and Alias, per trovare questi dati dovete aprire il prompt e inserire keytool -v -list -alias ALIASCHEAVETESCELTO -keystore PERCORSOVOSTROJKS

KEYSTORE=/Users/Desktop/CartellaLavoro/cartellaapplicazione/nomescelto.jks
STOREPASS=passwordscelta
ALIAS=aliasscelto

# Tester Groups that will be notified when the app is ready. Setup groups in your TestFairy account testers page.
# This parameter is optional, leave empty if not required
TESTER_GROUPS=

# Should email testers about new version. Set to "off" to disable email notifications.
NOTIFY="on"

# If AUTO_UPDATE is "on" all users will be prompt to update to this build next time they run the app
AUTO_UPDATE="off"

# The maximum recording duration for every test.
MAX_DURATION="10m"

# Is video recording enabled for this build
VIDEO="on"

# Add a TestFairy watermark to the application icon?
ICON_WATERMARK="on"

# Comment text will be included in the email sent to testers
COMMENT="This is upload test to verify the map"

# locations of various tools
CURL=/usr/bin/curl
ZIP=/usr/bin/zip
KEYTOOL=/usr/bin/keytool
ZIPALIGN=/Applications/eclipse/adt-bundle-mac-x86_64-20130522/sdk/build-tools/23.0.2/zipalign
JARSIGNER=/usr/bin/jarsigner

SERVER_ENDPOINT=http://app.testfairy.com

2. Come eseguire il Command Line Upload Script

Aprite il terminale, andate nella cartella dove si trova il file testfairy-upload-android.sh e digitate

$ chmod a+x testfairy-upload-android.sh

$ ~/tutto_il_percorso_per_arrivare_alla_cartella_command-line-uploader-master/testfairy-upload-android.sh ~/tutto_il_percorso_per_arrivare_alla_cartella_del_nostro_apk/MyApp.apk

Se tutto procede bene dovreste avere questo:

Uploading ~/tutto_il_percorso_per_arrivare_alla_cartella_del_nostro_apk/MyApp.apk to TestFairy.. OK!
Downloading instrumented APK.. OK!
Re-signing APK file.. jar signed.

Warning: 
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2040-12-23) or after any future revocation date.
OK!
Uploading signed APK to TestFairy.. OK!

Build was successfully uploaded to TestFairy and is available at:
https://app.testfairy.com/projects....


Ora potrete aprire il link sopra e inviare il file.apk ai vostri tester
 con la mappa di google funzionante.

P.S. Tutto questo perchè se fate l’upload dal sito web TF firmerà il vostro apk con le loro chiavi che il vostro “console.developers.google.com/apis/credentials?project=progetto” non avrà e quindi conseguentemente le APIKEY saranno differenti.

Per far riconoscere le API di google map inserite nel vostro Manifest:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="ApiGenerataDa:console.developers.google.com/apis/credentials" />

Questo sito mi è stato utile per capire:
http://javatechig.com/android/testfairy-command-line-upload-script

P:S: Ricordatevi che una volta effettuato l’upload della apk tramite terminale dovete inviare l’apk solo attraverso “invito tester” in quanto se provate a scaricare l’apk dalla pagina creata dinamicamente dopo l’upload attraverso il qrcode riavrete lo stesso errore

Come settarare il Source Code level in Eclipse

Può capitare di aver settato un Source Code level che non è aggiornato con ciò che state attualmente creando, quindi può accadere che nel momento in cui scrivete del codice con stringhe e simboli nuovi, il compilatore  vi dà errore.

Come è capitato a me nel momento in cui sono andato ad inserire come codice un

ArrayList<>();

e mi visualizzava come errore un codice al di sotto di 1.7

Soluzione:

Andate in Impostazioni/Proprietà del Progetto (tasto destro sul progetto) -> Java Compiler-> Enable project specific settings-> modificate il livello e cliccate Ok quando vi verrà richiesto di effettuare il Rebuilt.

Spero abbiate trovato utile questo articolo

A presto

Alessio

Come aggiungere Google Play Services al tuo progetto con Eclipse

Qui di seguito vi spiego passo passo come integrare i servizi di Google Play per il vostro progetto.

Il primo passo è quello di installare il Services SDK di Eclipse;

il secondo sarà quello di integrare questo alla nostra applicazione.

Passo 1

Installare Google Play Services Per Eclipse

1. Avviare l’SDK Manager da SDKManagerIcon (l’icona per intenderci Screen Shot 2015-08-09 at 19.14.38)

2. Scorrere fino in fondo alla lista e assicurarsi che Google Play Services è installato. In caso contrario, selezionare il pacchetto e installarlo.

Passo 2

Integrare Google Play Services nella nostra applicazione

1. Questa parte và un pò spiegata, praticamente noi visto che abbiamo (nel “passo 1”) già installato GPS (GooglePlayServices), ora possiamo inserire questa libreria che abbiamo scaricato all’interno del nostro progetto, l’unica cosa importante è che ci serve capire e sapere dove la libreria è posizionata tra le milioni di cartelle del nostro computer, quindi per fare ciò dovete:

Andare su Eclipse – Preferenze Finestra> Selezionare la scheda “Android” nell’angolo alto a sinistra. In alto, possiamo vedere la SDK Location.

Andate in quella cartella specifica!

Una volta aperta quella cartella andare al seguente percorso / extras / google / google_play_services / libproject /. Quindi copiare la cartella google-play-services_lib. (Questa è la cartella che deve essere importata nel nostro progetto)

2.Incollare la cartella Dove e Come. Due opzioni

Incollare la cartella google-play-services_lib qualsiasi posto all’interno della vostra cartella workspace di eclipse, ovviamente dove avete il progetto che ha bisogno di questa libreria.

3. Importiamo la cartella dalla Fase 2

Eclipse>File> Importa, selezionare Android>  codice Android esistente all’interno del vostro workspace
Nota: il metodo seguito NON E’ ASSOLUTISSIMAMENTE giusto File> Importa, selezionare Generali> progetti esistenti in area di lavoro

4. Consultare il Google Play servizi progetto libreria per la nostra applicazione.

Selezionate il vostro progetto (mi riferisco alla finestra di sinistra dove trovate tutti i vostri progetti) quindi fare clic destro su di esso. Selezionare Proprietà> Selezionare la scheda Android da alto a sinistra> Nella Biblioteca sezione Premete Aggiungi Select progetto google-play-services_lib e premere OK. Potrete vedere un segno di spunta verde nella Sezione di sinistra per Google Play Services.

Fine

Grazie per aver letto e spero di aver aggiunto un tassello al vostro sapere.

Alessio

Android Studio Error finished with non-zero exit value 2

Ero nel bel mezzo della mia programmazione Android con il Cloud quando aggiungendo il modulo per il caricamento dei file nel cloud mi sono imbattuto nell’errore dove ho trovato grande sofferenza nel ricercare la soluzione, in quanto in molti anzi moltissimi hanno avuto questo problema e tutti l’hanno risolto in maniera differente dalla mia alcuni anche stravolgendo tutta la programmazione. Per come sono fatto io cerco sempre di trovare molto più di una semplice soluzione bensì cerco sempre la soluzione più semplice (alcune volte non accade così opto per le soluzioni difficili)

Bene tornando a noi, la soluzione….

Quando creiamo un progetto usiamo tante “dependencies” e alcune volte queste entrano in conflitto tra di loro.

La mia dependencie che entrava in conflitto era:

 

compile(group: ‘com.google.api-client’, name: ‘google-api-client’, version:’1.19.0′){

exclude(group: ‘com.google.guava’, module: ‘guava-jdk5’)

}

Quindi ho semplicemente commentato questo pezzo e mandato in run…Ovviamente dovete testare che tutto funzioni correttamente, io ho inserito altre dependencies per sostituire quella che mi entrava in conflitto.

Ragazzi grazie per aver letto il mio post e spero che il mio consiglio vi sia d’aiuto.

A presto

Alessio

GCM Google Cloud Messaging con Android Server/Client side CCS (XMPP)

Ciao a tutti ragazzi, anche se sono impegnato in nuovi progetti cerco sempre di essere presente. Attualmente ringrazio tutti quelli che provano i codici sorgenti che inserisco e che mi chiedono informazioni per eventuali bug.

Il progetto su cui sto lavorando riguarda il Google Cloud Messaging, non con il normale protocollo HTTP bensì con il protocollo XMPP (eXtensible Message and Presence Protocol) usando CCS( Cloud Connection Server).  Questo stesso acronimo identifica il motivo per il quale userò questo protocollo, perché mette a disposizione la possibilità da parte del Client di inviare file al Server.

Questo sarà un blog lungo perchè accompagnerà man mano il mio progetto, quindi errori, soluzioni, strategie saranno all’ordine del giorno…

Inizio col dirvi che importantissimo per creare la vostra applicazione che usi GCM dovete prima di tutto comunicare al Signor Google la vostra intenzione di usare il Suo cloud, a meno che non avete un vostro cloud personale (cosa figa da gestire).

Quindi iniziamo:

Google Cloud Messaging (GCM) consente di comunicare rapidamente con i dispositivi mobili Android. GCM consente di inserire i comandi direttamente per i dispositivi Android.

Quindi impostare GCM :

Bisogna creare un nuovo progetto sul sito di Google API, ottenere il numero di progetto ID, e generare una chiave del server API di Google.

Per creare un nuovo progetto e di ottenere il numero di server e API chiave del progetto ID

Vai a https://code.google.com/apis/console, accedi al tuo account Google e fare clic su Crea progetto.

Sul lato sinistro della pagina Dashboard API, fare clic sul menu a discesa e selezionare Crea.

Digitare un nome per il progetto, e fare clic su Crea progetto.

Il browser si aggiorna e visualizza un nuovo URL.

Nel URL, individuare l’elemento #project.

Registrare il numero che segue #project.

Per esempio:

https://console.google.com/apis/console/#project:1066916068160

Questo numero è chiamato il “Google Project ID”, ed è necessario per utilizzare GCM.

Selezionare il progetto dall’elenco a discesa API progetto, e nel riquadro a sinistra selezionare Servizi.

Scorrere la pagina di Google Cloud Messaging per Android, e impostare l’ON / OFF widget per ON.

Su Google API Condizioni di pagina servizio, accettare e accettare i termini del contratto.

Nel riquadro a sinistra, selezionare API Access e quindi fare clic su Crea nuova chiave Server.

Per impostare in modo esplicito i server che possono utilizzare GCM, digitare l’indirizzo IP di ogni server.

Digitare un solo indirizzo IP per riga. Se non si aggiunge un indirizzo IP, viene utilizzato l’indirizzo del computer che si utilizza per accedere al sito web di Google API. Controllare la documentazione di Google per ulteriori informazioni.

Fare clic su Crea.

La chiave del server viene visualizzato nella pagina di accesso API sotto chiave per le applicazioni server (con bloccaggio IP) come API Key. Registrare la stringa chiave del server da utilizzare nella procedura successiva. Questa API Key è necessario quando si configura il proprio progetto per utilizzare GCM e quindi effettuare il collegamento al cloud.

Quanto prima proseguirò

Android: Connessione a MySQL usando PHP

Il motivo principale per l’adozione di un linguaggio di scripting come PHP è dovuto all’interazione con i database.

In questo tutorial vi mostrerò come utilizzare PHP e database MySQL per recuperare informazioni dal server. Per effettuare il collegamento a script PHP, utilizzeremo il protocollo HTTP dal sistema android. Inutile dirvi che comunque per implementare questo tutorial si dovrebbe avere una conoscenza di base di come eseguire script PHP e avviare il server. Se parliamo di architettura client-server, il dispositivo client è l’Android e lato server vi è una combinazione di script PHP e MySQL.

Durante il tutorial useremo un formato importantissimo per lo scambio leggero dei dati, ossia il formato JSON (JavaScript Object Notation).

Piccola premessa sul JSON:

Si basa su un sottoinsieme del Linguaggio di Programmazione JavaScriptStandard ECMA-262 Terza Edizione – Dicembre 1999 (testo sito json). JSON è un formato di testo completamente indipendente dal linguaggio di programmazione, ma utilizza convenzioni conosciute dai programmatori di linguaggi della famiglia del C, come C, C++, C#, Java, JavaScript, Perl, Python, e molti altri. Questa caratteristica fa di JSON un linguaggio ideale per lo scambio di dati.

JSON è basato su due strutture:

  • Un insieme di coppie nome/valore. In diversi linguaggi, questo è realizzato come un oggetto, un record, uno struct, un dizionario, una tabella hash, un elenco di chiavi o un array associativo.
  • Un elenco ordinato di valori. Nella maggior parte dei linguaggi questo si realizza con un array, un vettore, un elenco o una sequenza.

Come farà la nostra applicazione ad usare json?

Quando l’applicazione Android effettuerà la richiesta alla pagina PHP e rimarrà in attesa. Lo script PHP, si connetterà al DB, invierà la query, recupererà la risposta, inserirà la risposta in un oggetto json e lo darà come output. Questo output sarà codificato in formato JSON e inviato al dispositivo. L’applicazione Android otterrà questi dati codificati, li analizzerà e li visualizzerà sul dispositivo Android.

Implementiamo il tutto:

In MySQL creare il database TSA_Evolution, creare tabella Stock. Questa tabella consiste di due colonne. In primo luogo è Stock_id, che è auto_increment e primary_key e avere tipo di dati INT. Seconda colonna è Stock_name, che ha tipo di dati VARCHAR (20).

La query sarà: Vogliamo SELEZIONARE il tutti gli IDENTIFICATIVI delle azioni DALLA nostra TABELLA Stock CHE INIZINO con la lettera A (in maiuscolo ho praticamente evidenziato la query che andremo ad effettuare, ossia:

SELECT Stock_id

FROM Stock

WHERE Stock_name= A

)

Il codice PHP sarà molto semplice:

  • connessione al database
  • esecuzione della query SQL, con il WHERE  a seconda dei dati da POST / GET
  • output in formato JSON

Per esempio avremo questa funzionalità in city.php:

<?

/*ci colleghiamo al database(attenti perchè se lavorate in locale 
l'host è 10.0.2.2 e non 127.0.0.1)*/
php mysql_connect("host","username","password"); 
//selezioniamo il db a cui ci vogliamo connettere
mysql_select_db("TSA_Evolution");
//creamo al query
$sql=mysql_query("select Stock_id from Stock where STOCK_name like 'A%'"); 
/*Il metodo "mysql_fetch_assoc" restituisce un array in base alla query 
fatta e incrementa il dato*/
while($row=mysql_fetch_assoc($sql)) 
//inseriamo tutto nella variabile output
$output[]=$row;
/*stampiamo l'oggetto json, miraccomando a non stampare a video altri commenti, 
altrimenti quando andremo ad eseguire l'app android si bloccherà in quanto non 
riconoscerà i commenti come caratteri json*/
 print(json_encode($output)); 
//chiudiamo la connessione
mysql_close();

?>

Nella nostra applicazione Android dobbiamo:

  • usare un HttpPost per ottenere i dati,
  • convertire la risposta alla stringa JSON
  • analizzare i dati e usarli

Il codice per recuperare dati dal server per la nostra applicazione Android sarà:

package com.list; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList;

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import android.app.ListActivity; 
import android.net.ParseException;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast; 
public class AndroidPhp extends Activity { /*qualcuno qui ha esteso ad una 
ListActivity ma io preferisco gestirmi da me la risposta*/
JSONArray jArray;
String result = null; 
InputStream is = null; 
StringBuilder sb=null; 

@Override
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.android_php);
final TextView textviewDariRicevuti = (TextView) findViewById(R.id.datiRicevuti);
Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
buttonInviaDati.setOnClickListener(new View.OnClickListener() { 
@Override
public void onClick(View v) {
//invio richiesta
textviewDariRicevuti.setText(inviaDati());
}
});
}
public String inviaDati(){
String result="";
String stringaFinale="";
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
//Sotto scrivo come si chiama il campo che invio(azione1) e il suo valore (1)
nameValuePairs.add(new BasicNameValuePair("Stock_name","azione1"));
/*queste due righe di codice che vedete qui sotto sono un piccolo trucchetto per ovviare
 (solo per il momento
 all'eccezione “NetworkOnMainThreadException", questa eccezione è importantissima in quanto
 ci dice che siccome stiamo effettuando una connessione nel thread principale avremo dei 
problemi in quanto tutto ciò che riguarda le connessioni o tutto ciò che comporta il 
superamento del limite di tempo massimo tra richiesta/risposta superiore a 5secondi la nostra 
applicazione Android la metterà in pausa appunto perchè stiamo programmando per uno smartphone
 e non possiamo attendere processi che impegnino per troppo tempo la nostra app. Ricordatevi
 una volta testato tutto, create nella classe i thread e gestite tutto dal thread.*/
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//http post 
try { 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://10.0.2.2/interroga.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
result = EntityUtils.toString(entity, HTTP.UTF_8);
}
catch(Exception e){ 
Log.e("log_tag", "Error in http connection"+e.toString());
} 
//convert response to string 
try{ 
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
sb = new StringBuilder();
sb.append(reader.readLine() + "\n"); 
String line=null; 
while ((line = reader.readLine()) != null) 
{ sb.append(line + "\n");
} 
is.close();
result=sb.toString(); 
}
catch(Exception e){ 
Log.e("log_tag", "Error converting result "+e.toString());
}
//paring data 

try{ 
jArray = new JSONArray(result); 
/*Quando vi dicevo di non inserire commenti nella pagina php era perchè l'app si
 bloccava proprio su questa
riga, in quanto "result" NON comprendeva caratteri json e il parsing non poteva 
essere effettuato */
JSONObject json_data=null;
for(int i=0;i<jArray.length();i++){
Log.i("TEST","id: "+json_data.getInt("Stock_id")+
", name: "+json_data.getString("Stock_name")+
", cliente: "+json_data.getString("Stock_Client_id")+
", industria: "+json_data.getString("Stock_Industry_id")
);
stringaFinale = json_data.getInt("Stock_id")+ ""+ json_data.getString("Stock_name")+
""+ json_data.getString("Stock_Client_id")+
""+ json_data.getString("Stock_Industry_id")+"\n\n";
}
} catch(JSONException e1){ 
Toast.makeText(getBaseContext(), "Titolo Azionario non trovato" ,Toast.LENGTH_LONG).show();
} catch (ParseException e1) { e1.printStackTrace();
}
}
else { //is è null e non ho avuto risposta
}
return stringaFinale;
}
}

Non me ne vogliano i più esperti ma preferisco fornire una guida completa inserendo anche il Layout:

<?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" >

    <Button
        android:id="@+id/buttonInviaDati"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Invia dati" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dati ricevuti:"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/datiRicevuti"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Per ora nessun dato ricevuto" />

</LinearLayout>

Non dimenticatevi di inserire il permesso alla connessione internet in AndroidManifest.xml:

<uses-permission android:name=”android.permission.INTERNET”></uses-permission>

Provateci e fatemi sapere come è andata, aspetto i vostri commenti..

😉 Good Luck

Alessio Scannicchio

 

 

Rigenerare classe R progetto Android

Mi è stata posta questa domanda:

Sul mio progetto, dopo aver eseguito un “clean” (uso eclipse), la classe R è stata cancellata.
Come faccio a rigenerarla?

Bene..vi comunico che non c’è nulla di cui preoccuparvi anche se vedete punti esclamativi rossi sul progetto oppure icone rosse con la “X” su ogni attività creata..
Giustamente questi errori vengono generati perché manca la classe R.
Vediamo prima di tutto cosa è la classe R in modo da capire il motivo per il quale eclipse (o il nostro ambiente di sviluppo) riconosce questi errori.

Un applicazione Android è costituita da diversi tipi di componenti che comprendono : codice sorgente Java, documenti XML, icone ed immagini, basi di dati e file binari di altro tipo. Tutti questi componenti vanno in un qualche modo assemblati fra di loro ed in base alla tipologia va inserito in un particolare punto del progetto.

Abbiamo delle risorse XML che definiscono alcune parti dell’applicazione come la GUI oppure dei parametri e valori, ma allo stesso tempo abbiamo il codice java all’interno di un Activity che deve utilizzare queste risorse per l’applicazione.
Come avviene tutto questo?
Il ponte fra questi due tipi i componenti viene gestito dalla “classe R” (da Resurces (All resource IDs are defined in your project’s R class, which the aapt tool automatically generates)) contenuta nella cartella gen/ e che viene generata dal plugin ADT in maniera automatica ogni qualvolta aggiungiamo un elemento alla struttura di un documento XML già esistente oppure ne creiamo uno nuovo.

Per utilizzare le risorse ‘mappate’ in questa classe si utilizzano alcuni metodi implementati nella classe Activity,come per esempio “setContentView(R.layout.main) attraverso cui implementare il layout grafico del main semplicemente richiamandolo attraverso la classe R
Il metodo riceve un intero che deve identificare la risorsa XML dove è definito il layout grafico. Quindi la costante R.layout.main identifica questa risorsa.
Un’altro metodo molto importante è findViewById(R.id.codicerisorsa) che in questo caso ricerca l’elemento in base all’ ID definito nella risorsa XML.

Detto ciò passiamo a come risolvere il problema della scomparsa di tale classe molto importante e senza la quale non sarebbe possibile identificare tutte le risorse della nostra applicazione

Il modo più veloce e immediato per rigenerare la classe R è quella di togliere la spunta da: Menù Project->Build Automatically e successivamente cercare di salvare, oppure andare su tasto dx Progetto(in Project Explorer)->Restore from Local Hystory e dopo tornare a Menù Project->Build Automatically e rimettere il check.
(subito dopo verrà rigenerata la classe automaticamente)

Spero d’esser stato d’aiuto 😉
Grazie
Alessio