Autore Topic: layout conversazioni SMS  (Letto 1900 volte)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
layout conversazioni SMS
« il: 08 Settembre 2011, 14:24:39 CEST »
0
salve ragazzi, sto sviluppando un'app di messaggistica, sono arrivato a impostare il layout dei messaggi stile "chat", solo che non riesco in alcun modo a far venire fuori come sfondo di ogni messaggio o come immagini composte correttamente il "fumetto"(che fa capire se il messaggio è stato inviato dal proprio terminale o ricevuto) sto impazzendo.. avete consigli??? ho cercato in giro ma non riesco a fare in modo di impostare correttamente quel cavolo di fumetto!!!

grazie mille in anticipo

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:layout conversazioni SMS
« Risposta #1 il: 08 Settembre 2011, 20:17:02 CEST »
+1
Cosa hai fatto fino ad ora? :)
Comunque a me la prima cosa che mi viene in mente è creare un immagine che rappresenta il fumetto e applicargli la ninepatch in modo che si adatti alla dimensione del testo:

2D Graphics | Android Developers

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:layout conversazioni SMS
« Risposta #2 il: 08 Settembre 2011, 21:29:53 CEST »
0
Cosa hai fatto fino ad ora? :)
Comunque a me la prima cosa che mi viene in mente è creare un immagine che rappresenta il fumetto e applicargli la ninepatch in modo che si adatti alla dimensione del testo:

2D Graphics | Android Developers

veramente grazie mille era proprio quello che stavo cercando.. solo che essendo abbastanza nuovo alla programmazione android non ne sapevo dell'esistenza di quel tool :)

posso approfittare per chiederti una cosa sempre riguardo questo?
nella mia app vorrei che appunto i fumetti dei messaggi ricevuti stessero allineati a sinistra, mentre quelli inviati allineati a destra, ho provato a settare l'attributo con left e right ma non funziona, hai qualche consiglio?

questo è il mio codice xml delle view dei messaggi:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">
   
    <RelativeLayout
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:id="@+id/layoutTop"  >
        <TextView
                android:text="testoMessaggio"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/testoMessaggio"
                android:gravity="left"
                android:minWidth="100dip">
        </TextView>
        <TextView
                android:text="dataMessaggio"
                android:layout_below="@+id/testoMessaggio"
                android:layout_alignRight="@+id/testoMessaggio"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="right"
                android:id="@+id/dataMessaggio">
        </TextView>
       
    </RelativeLayout>
   
</RelativeLayout>

mentre questa è la porzione di codice nel quale cerco di allinearli a destra e sinistra:
Codice (Java): [Seleziona]
            RelativeLayout layoutTop= (RelativeLayout)v.findViewById(R.id.layoutTop);
           
            String testo=items.get(position);
            String address="";
           
            if(testo.substring(0, 4).compareTo("Me: ")==0) { //se il messaggio è classificato come inviato
                ...
                layoutTop.setGravity(Gravity.RIGHT);
                layoutTop.setBackgroundResource(R.drawable.mexme);
               
            }
            else {
                ...
                layoutTop.setGravity(Gravity.LEFT);
                layoutTop.setBackgroundResource(R.drawable.mexfriend);
               
            }

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:layout conversazioni SMS
« Risposta #3 il: 08 Settembre 2011, 22:41:20 CEST »
0
Dovresti dare a layoutTop l'attributo alignparentLeft o right :)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:layout conversazioni SMS
« Risposta #4 il: 08 Settembre 2011, 22:43:06 CEST »
0
Dovresti dare a layoutTop l'attributo alignparentLeft o right :)
ma dopo avergli dato questo attributo come lo cambio da codice?


Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:layout conversazioni SMS
« Risposta #7 il: 09 Settembre 2011, 16:17:35 CEST »
0
scusa se torno a fare domande, il problema è che io ora vorrei aggiornare la mia listView di messaggi ogni volta che ricevo/invio messaggi..
per la parte in cui invio messaggi sono riuscito ad aggiornare la listview senza problemi con questa semplice funzione:

Codice (Java): [Seleziona]
public void updateSMS(String message) {
                adapter.add(message);
            messaggi.setAdapter(adapter);
        }

però dato che devo anche aggiornarla da una classe diversa che non estende activity, cioe SMSReceiver.java è un problema!! non so come fare.. questo è il codice di SMSReceiver:

Codice (Java): [Seleziona]
public class SMSReceiver extends BroadcastReceiver
{
        Context con;
       
        //TextView txt;
        @Override
        public void onReceive(Context context, Intent intent)
        {
                //---get the SMS message passed in---
                Bundle bundle=intent.getExtras();
                SmsMessage[] msgs=null;
                String str="";
                if(bundle!= null)
                {
                        //richiama l'sms ricevuto
                        Object[] pdus=(Object[])bundle.get("pdus");
                        msgs=new SmsMessage[pdus.length];
                       
                        String address="";
                        String message="";
                       
                        for(int i=0;i<msgs.length;i++)
                        {
                                msgs[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
                                address = msgs[i].getOriginatingAddress();
                                str += "SMS From " + address;
                                str += " :";
                                message = msgs[i].getMessageBody().toString();
                                str += message;
                                str += "\n";
                        }
                        //mostra il messaggio
                        Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
                       
                        ContentValues values = new ContentValues();
                        values.put("address", address);
                        values.put("body",message);
                        values.put("type", 1);
                        context.getContentResolver().insert(Uri.parse("content://sms/inbox"), values);
                       
                       
                }
        }
}

hai consigli su come fare??

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:layout conversazioni SMS
« Risposta #8 il: 09 Settembre 2011, 16:41:49 CEST »
+1
per quale motivo inserisci tu il messaggio? lo fa già il sistema!
Comunque basta che registri un broadcast receiver nell'activity oppure reigistri un ContentObserver sul content provider dei messaggi.

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:layout conversazioni SMS
« Risposta #9 il: 09 Settembre 2011, 16:45:00 CEST »
0
per quale motivo inserisci tu il messaggio? lo fa già il sistema!
Comunque basta che registri un broadcast receiver nell'activity oppure reigistri un ContentObserver sul content provider dei messaggi.
ahh!!! pensavo fosse l'app principale degli sms che lo inseriva, per quello volevo inserirlo io come faccio con i messaggi inviati.. ma allora se non serve inserirlo come faccio ad aggiornare la listview dei messaggi appena ne ricevo uno??

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:layout conversazioni SMS
« Risposta #10 il: 09 Settembre 2011, 16:45:52 CEST »
0
Comunque basta che registri un broadcast receiver nell'activity oppure reigistri un ContentObserver sul content provider dei messaggi.

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:layout conversazioni SMS
« Risposta #11 il: 09 Settembre 2011, 16:54:49 CEST »
0

scusa non avevo capito fosse la risposta, avevo omesso di leggerla sbadatamente..
ma come faccio a registrare un broadcast receiver nell'activity?
l'unica cosa che mi viene in mente è creare una variabile BroadCastReceiver, ma poi devo fare l'override di onReceive? e cosa gli passo?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:layout conversazioni SMS
« Risposta #12 il: 09 Settembre 2011, 16:58:18 CEST »
+1
Una cosa del genere (dentro la tua activity ovviamente)?

Codice (Java): [Seleziona]
private BroadcastReceiver receiver;

@Overrride
public void onCreate(Bundle savedInstanceState){

  IntentFilter filter = new IntentFilter();
  filter.addAction("android.provider.Telephony.SMS_RECEIVED");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //Aggiorni la tua ListView
    }
  }

registerReceiver(receiver, filter);

}

@Override
protected void onDestroy() {
  unregisterReceiver(receiver);
}

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:layout conversazioni SMS
« Risposta #13 il: 09 Settembre 2011, 17:20:19 CEST »
0
Una cosa del genere (dentro la tua activity ovviamente)?

Codice (Java): [Seleziona]
private BroadcastReceiver receiver;

@Overrride
public void onCreate(Bundle savedInstanceState){

  IntentFilter filter = new IntentFilter();
  filter.addAction("android.provider.Telephony.SMS_RECEIVED");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //Aggiorni la tua ListView
    }
  }

registerReceiver(receiver, filter);

}

@Override
protected void onDestroy() {
  unregisterReceiver(receiver);
}

ottimo!!! funziona tutto però quando esco  dall'activity e torno a quella precedente mi fa un forceclose e dal logcat sembra quasi io non abbia fatto la unregisterReceiver() che invece è presente in ondestroy()

logcat:
Codice: [Seleziona]
09-09 13:49:52.109: ERROR/ActivityThread(382): Activity com.dev.SMSMessaging.SMSConversation has leaked IntentReceiver com.dev.SMSMessaging.SMSConversation$3@44ed7668 that was originally registered here. Are you missing a call to unregisterReceiver()?
09-09 13:49:52.109: ERROR/ActivityThread(382): android.app.IntentReceiverLeaked: Activity com.dev.SMSMessaging.SMSConversation has leaked IntentReceiver com.dev.SMSMessaging.SMSConversation$3@44ed7668 that was originally registered here. Are you missing a call to unregisterReceiver()?
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:939)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:734)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:791)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:778)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:772)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at com.dev.SMSMessaging.SMSConversation.sendSMS(SMSConversation.java:111)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at com.dev.SMSMessaging.SMSConversation.access$0(SMSConversation.java:102)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at com.dev.SMSMessaging.SMSConversation$1.onClick(SMSConversation.java:76)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.view.View.performClick(View.java:2408)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.view.View$PerformClick.run(View.java:8816)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.os.Handler.handleCallback(Handler.java:587)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.os.Looper.loop(Looper.java:123)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at java.lang.reflect.Method.invokeNative(Native Method)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at java.lang.reflect.Method.invoke(Method.java:521)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-09 13:49:52.109: ERROR/ActivityThread(382):     at dalvik.system.NativeStart.main(Native Method)
09-09 13:49:53.189: INFO/ActivityManager(70): Starting activity: Intent { cmp=com.dev.SMSMessaging/.SMSConversation (has extras) }
09-09 13:49:53.859: INFO/ActivityManager(70): Displayed activity com.dev.SMSMessaging/.SMSConversation: 582 ms (total 582 ms)

questo invece è il codice dell'activity:
Codice (Java): [Seleziona]
public class SMSConversation extends Activity{
       
        TextView barraNotifiche;
        String contatto;
        String nomeContatto;
        ArrayList <String> messages;
        ListView messaggi;
        Button btnSendSMS;
    EditText txtMessage;
    ConversationLayout adapter;
    private BroadcastReceiver smsReceived;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.conversazione);
               
                barraNotifiche=(TextView) findViewById(R.id.textView2);
                messages=new ArrayList<String>();
                messaggi=(ListView)findViewById(R.id.messaggi);
                btnSendSMS=(Button) findViewById(R.id.btnSendSMS);
                txtMessage=(EditText) findViewById(R.id.txtMessage);
               
               
                messaggi.setDivider(null);
               
                Intent i=getIntent();
                String pkg=getPackageName();
               
                IntentFilter filter = new IntentFilter();
                filter.addAction("android.provider.Telephony.SMS_RECEIVED");
               
                smsReceived= new BroadcastReceiver() {
                       
                        @Override
                        public void onReceive(Context context, Intent intent) {
                                // TODO Auto-generated method stub
                                //---get the SMS message passed in---
                                Bundle bundle=intent.getExtras();
                                SmsMessage[] msgs=null;
                                if(bundle!= null)
                                {
                                        //richiama l'sms ricevuto
                                        Object[] pdus=(Object[])bundle.get("pdus");
                                        msgs=new SmsMessage[pdus.length];
                                       
                                        String address="";
                                        String message="";
                                       
                                        for(int h=0;h<msgs.length;h++)
                                        {
                                                msgs[h]=SmsMessage.createFromPdu((byte[])pdus[h]);
                                                address = msgs[h].getOriginatingAddress();
                                                message = msgs[h].getMessageBody().toString();
                                        }
                                        updateSMS(address+": "+message);
                                        messaggi.setSelection(messages.size());
                                }
                        }
                };
               
                registerReceiver(smsReceived, filter);
                       
               
               
               
                contatto=i.getStringExtra(pkg+".myContact");
                nomeContatto=i.getStringExtra(pkg+".myContactName");
               
                readSMS();
               
                btnSendSMS.setOnClickListener(new View.OnClickListener() {
                       
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                String phoneNo=contatto;
                                String message=txtMessage.getText().toString();
                                if(phoneNo.length()>0 && message.length()>0)
                                {
                                        /*
                                        sleep task=new sleep(getApplicationContext(),confermaRicezione,barraNotifiche);
                                        task.execute(phoneNo, message);
                                        */

                                        sendSMS(phoneNo, message);
                                       
                                        txtMessage.setText("");
                                }
                                else
                                        Toast.makeText(getBaseContext(), "Inserisci un testo per il messaggio.", Toast.LENGTH_SHORT).show();
                                        readSMS();
                        }//onClick invioSMS
                });
               
        }
       
        @Override
        protected void onDestroy() {
          unregisterReceiver(smsReceived);
        }

come mai non lo vede?? o.O

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:layout conversazioni SMS
« Risposta #14 il: 09 Settembre 2011, 17:24:28 CEST »
0
prova a mettere la registrazione nell'onStart e la de-registrazione dell'onStop