Facebook UID

Se l’ utente non ha scelto uno username personalizzato, la URL del profilo contiene lo UID:
http://www.facebook.com/profile.php?id=xxxxxxxxxxxxxxx dove le x sono dei numeri.
Se invece l’ utente ha uno username personalizzato del tipo
http://www.facebook.com/nome.scelto
è possibile reperire lo UID dai dati JSON presenti nella risorsa
https://graph.facebook.com/nome.scelto
Infatti, aprendo la precedente URL si trova qualcosa come:

{
   "id": "xxxxxxxxxxxxxxx",
   "name": "Nome Cognome",
   "first_name": "Nome",
   "last_name": "Cognome",
   "link": "https://www.facebook.com/nome.scelto",
   "username": "nome.scelto",
   "gender": "male",
   "locale": "us_US"
}

in cui la prima riga è l’ UID.
In alternativa, l’ UID si trova anche nelle URL delle foto degli album personali:
http://www.facebook.com/photo.php?fbid=938400182301834&set=pu.xxxxxxxxxxxxxxx&type=1
ed è quella al posto delle x.

Interfaccia utente, Activity, ed Intent

Interfaccia utente

L’ interfaccia grafica si basa su una gerarchia di oggetti di tipo View e ViewGroup.
Un LinearLayout è una sottoclasse di ViewGroup: al suo interno si può inserire un oggetto View, come un EditText o un Button.

Un importante attributo delle View è layout_weight: esso permette di specificare una quota dello spazio a disposizione delle View contigue.
Ad esempio: se impostassimo a 2 il peso di una View e ad 1 il peso di un’ altra, avremmo che la prima occuperà 2/3 dello spazio (infatti la somma dei pesi è 3); se ad una terza View si desse il peso 1, la prima avrebbe 2/4=1/2 dello spazio, e le altre ne avrebbero 1/4 ciascuna.
Il valore di default per ogni View è zero: quindi se si desse un peso maggiore di 0 ad una sola vista, questa occuperebbe tutto lo spazio lasciato libero dalle rimanenti View impostate a wrap_content.
Un esempio di ciò è un LinearLayout orizzontale in cui c’è una riga con EditText e un Button impostati entrambi a wrap_content per larghezza e altezza. Dando peso pari a 1 alla EditText per allargarla al massimo dello spazio disponibile, il bottone occuperebbe il minore spazio possibile per avvolgere la stringa che contiene.
In questo caso è importante anche modificare layout_width di EditText impostandolo a 0dp: infatti wrap_content richiede un calcolo della larghezza, e il layout_weight ne richiede un altro; usando 0dp si evita il doppio calcolo.

Lanciare una seconda Activity

Supponiamo di utilizzare il bottone “Send” della figura qui sopra per aprire una nuova Activity in cui mostrare la stringa inserita in EditText.

Nel main.xml aggiungere android:onClick=”sendMessage” per indicare una funzione da chiamare quando il bottone viene cliccato; nella classe della prima Activity definire la funzione

/** Called when the user selects the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

Notare che il nome della funzione deve essere uguale al nome assegnato all’ attributo XML, la funzione deve essere public, deve ritornare void, e avere un solo parametro View.
Per passare alla seconda Activity i dati si usano gli Intent.

Per esempio:

Intent intent = new Intent(this, DisplayMessageActivity.class);

il costruttore prende 2 parametri:

  • un Context: si usa this perchè Activity è una sottoclasse di Context
  • la classe del componente a cui il sistema deve consegnare l’ intent: in questo caso sarà l’ Activity che dovrà essere aperta

poi nell’ intent istanziato si possono inserire i dati da passare:

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

la funzione putExtra() prende una “chiave” (un nome di variabile) e il suo valore come parametri: bisogna creare la chiave nella Activity (siamo ancora nella prima !)

public class MyFirstActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myapp.MESSAGE";
    ...
}

è sempre bene definire la chiave usando il package name dell’ applicazione come prefisso per essere sicuri che sia univoca, nel caso di interazione con altre applicazioni.

Avviare la seconda Activity

Per avviare la nuova Activity basta completare la precedente funzione con il comando startActivity(intent):

/** Called when the user selects the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

Ora bisogna creare la classe DisplayMessageActivity della nuova Activity; è necessario implementare il metodo onCreate() (ogni sottoclasse di Activity deve farlo) ed è in esso che si inizializzano i componenti essenziali dell’ Activity.

E’ anche necessario dichiarare l’ Activity nel AndroidManifest.xml (con Eclipse è facile aggiungere la nuova activity).

Ora si può “ricevere” l’ intent:

Intent intent = getIntent();
String message = intent.getStringExtra(MyFirstActivity.EXTRA_MESSAGE);

notare la “chiave” definita precedentemente: ora serve a recuperare la stringa.

A questo punto abbiamo tutti i dati: rimane solo da visualizzarli e per semplicità adesso lo farò in maniera programmatica (senza usare i layout XML)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyFirstActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    setContentView(textView);
}