Autore Topic: Help cambio sfondo LinearLayout at RunTime  (Letto 1923 volte)

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Help cambio sfondo LinearLayout at RunTime
« il: 18 Dicembre 2010, 18:22:25 CET »
0
Ciao a tutti, mi servirebbe una mano con la mia app...
Quello che voglio fare è dare la possibilità agli utenti di poter impostare un'immagine che vogliono dalla galleria come sfondo per l'app. Ciò che ho fatto fino ad ora è stato leggere decine di discussioni a riguardo, senza però trovare la soluzione al mio problema!

Da questo forum ho appreso che con
Codice (Java): [Seleziona]
                Intent i = new Intent( Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI );
                startActivityForResult( i, IMAGE_FROM_GALLEY );
Codice (Java): [Seleziona]
@Override
protected void onActivityResult ( int requestCode, int resultCode, Intent data ) {

if ( requestCode == IMAGE_FROM_GALLEY ) {

                if ( resultCode == RESULT_OK ) {
                        Uri selectedImage = data.getData();

                        //assegni alla tua ImageView l'immagine selezionata
                }
        }
        super.onActivityResult( requestCode, resultCode, data );
}

Ottengo l'Uri di un'immagine che l'utente sceglie dalla galleria. Il mio problema è che nei vari topic che ho letto, si parla sempre di ImageView, mentre nel mio caso ho un LinearLayout!

I metodi forniti dalle API android sono un SetDrawableBackground che prende un oggetto drawable, oppure un metodo simile che prende un intero corrispondente all'ID della risorsa..

Potreste aiutarmi ?? Grazie mille in anticipo :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Help cambio sfondo LinearLayout at RunTime
« Risposta #1 il: 18 Dicembre 2010, 18:43:31 CET »
0
Crei un oggetto drawable partendo dall'uri e sei apposto :)

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re: Help cambio sfondo LinearLayout at RunTime
« Risposta #2 il: 18 Dicembre 2010, 18:55:06 CET »
0
Crei un oggetto drawable partendo dall'uri e sei apposto :)

potresti gentilmente indicarmi come? grazie mille

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #3 il: 18 Dicembre 2010, 19:19:29 CET »
0
Non l'ho provato ma immagino che questo possa andar bene: Drawable | Android Developers
« Ultima modifica: 18 Dicembre 2010, 19:27:45 CET da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #4 il: 18 Dicembre 2010, 19:49:42 CET »
0
Mi dispiace ma non funziona! Mi da un  java.lang.NullPointerException

ecco il codice
Codice (Java): [Seleziona]
          Uri imageUri = data.getData();
          Drawable img = Drawable.createFromPath(imageUri.toString());

e poi dopo

Codice (Java): [Seleziona]
                findViewById(R.layout.main).setBackgroundDrawable(img);
come mai ??
« Ultima modifica: 19 Dicembre 2010, 12:41:09 CET da DarKprince »

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #5 il: 19 Dicembre 2010, 13:37:31 CET »
0
ho appena provato anche con

Codice (Java): [Seleziona]
Drawable img = Drawable.createFromPath(imgUri.getEncodedPath());              
   
findViewById(R.layout.main).setBackgroundDrawable(img);

ma ho sempre un nullPoint Exception  >:(


ecco l'errore completo da LogCat
Codice: [Seleziona]
12-19 13:43:10.088: WARN/System.err(6245): java.io.FileNotFoundException: /external/images/media/15 (No such file or directory)
12-19 13:43:10.092: WARN/System.err(6245):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
12-19 13:43:10.092: WARN/System.err(6245):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
12-19 13:43:10.092: WARN/System.err(6245):     at java.io.FileInputStream.<init>(FileInputStream.java:82)
12-19 13:43:10.096: WARN/System.err(6245):     at java.io.FileInputStream.<init>(FileInputStream.java:134)
12-19 13:43:10.096: WARN/System.err(6245):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:349)
12-19 13:43:10.100: WARN/System.err(6245):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:399)
12-19 13:43:10.104: WARN/System.err(6245):     at android.graphics.drawable.Drawable.createFromPath(Drawable.java:800)
12-19 13:43:10.104: WARN/System.err(6245):     at com.darkprince.napoliapp.Main.onActivityResult(Main.java:145)
12-19 13:43:10.104: WARN/System.err(6245):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
12-19 13:43:10.108: WARN/System.err(6245):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
12-19 13:43:10.108: WARN/System.err(6245):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
12-19 13:43:10.108: WARN/System.err(6245):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
12-19 13:43:10.112: WARN/System.err(6245):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
12-19 13:43:10.112: WARN/System.err(6245):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 13:43:10.116: WARN/System.err(6245):     at android.os.Looper.loop(Looper.java:123)
12-19 13:43:10.116: WARN/System.err(6245):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-19 13:43:10.120: WARN/System.err(6245):     at java.lang.reflect.Method.invokeNative(Native Method)
12-19 13:43:10.120: WARN/System.err(6245):     at java.lang.reflect.Method.invoke(Method.java:521)
12-19 13:43:10.120: WARN/System.err(6245):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
12-19 13:43:10.120: WARN/System.err(6245):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
12-19 13:43:10.124: WARN/System.err(6245):     at dalvik.system.NativeStart.main(Native Method)


« Ultima modifica: 19 Dicembre 2010, 13:43:43 CET da DarKprince »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #6 il: 19 Dicembre 2010, 14:57:37 CET »
0
Scusa, ma il path corretto (e completo) di questa immagine qual è?

Io ti so dire quale non è: /external/images/media/15

Codice: [Seleziona]
12-19 13:43:10.088: WARN/System.err(6245): java.io.FileNotFoundException: /external/images/media/15 (No such file or directory)
EDIT
Forse ho capito, 1 min e posto la soluzione :P
« Ultima modifica: 19 Dicembre 2010, 15:11:36 CET da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #7 il: 19 Dicembre 2010, 15:17:41 CET »
+1
OK, ecco come ottenere il path al file reale (e non alla risorsa del Content Provider):
Codice (Java): [Seleziona]
    @Override
    protected void onActivityResult ( int requestCode, int resultCode, Intent data ) {
        if ( requestCode == IMAGE_FROM_GALLEY ) {
            if ( resultCode == RESULT_OK ) {
                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex); // Il path al file è in questa stringa
                cursor.close();

                //assegni alla tua ImageView l'immagine selezionata
            }
        }
        super.onActivityResult( requestCode, resultCode, data );
    }

Fonte: how to pick a image from gallery (SD Card) for my app in android? - Stack Overflow

Testato sia su API Level 4 che 9.
« Ultima modifica: 19 Dicembre 2010, 15:20:39 CET da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #8 il: 19 Dicembre 2010, 15:54:15 CET »
0
grazie  :-) provo questa soluzione immediatamente e ti faccio sapere

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #9 il: 19 Dicembre 2010, 16:41:35 CET »
+2
Ho trovato un modo più elegante per farlo:

Codice (Java): [Seleziona]
    @Override
    protected void onActivityResult ( int requestCode, int resultCode, Intent data ) {
        if ( requestCode == IMAGE_FROM_GALLEY ) {
            if ( resultCode == RESULT_OK ) {
                try {
                    Bitmap b = Media.getBitmap(getContentResolver(), data.getData());
                    ll.setBackgroundDrawable(new BitmapDrawable(getResources(), b));
                }
                catch (Throwable t) {
                    Log.e("HW", "Exception " + t.getMessage() );
                }
            }
        }
        super.onActivityResult( requestCode, resultCode, data );
    }
« Ultima modifica: 19 Dicembre 2010, 16:47:42 CET da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #10 il: 19 Dicembre 2010, 17:13:51 CET »
0
 o_O

continuo ad avere un

12-19 17:13:46.315: ERROR/NapoliApp(24262): ERRORE:java.lang.NullPointerException
   :-\

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #11 il: 19 Dicembre 2010, 17:33:21 CET »
0
Sicuramente quel NullPointerException non è generato dal codice che ho postato, dato che l'ho provato personalmente su più versioni di Android.

Comunque serve a poco scrivere che hai un errore di NullPointerException, controlla piuttosto quale riga lo ha generato (c'è scritto nel logcat) e verifica cosa fai in quella riga.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #12 il: 19 Dicembre 2010, 17:42:35 CET »
0
ora ricontrollo meglio, ma mi sembra assurdo! Perchè con un ImageView funziona bene, mentre con il linearLayout mi fa i picci  >:(
Codice: [Seleziona]
12-19 17:45:49.823: WARN/System.err(25592): java.lang.NullPointerException
12-19 17:45:49.827: WARN/System.err(25592):     at com.darkprince.napoliapp.Main.onActivityResult(Main.java:144)
12-19 17:45:49.827: WARN/System.err(25592):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
12-19 17:45:49.827: WARN/System.err(25592):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
12-19 17:45:49.827: WARN/System.err(25592):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
12-19 17:45:49.827: WARN/System.err(25592):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
12-19 17:45:49.827: WARN/System.err(25592):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
12-19 17:45:49.831: WARN/System.err(25592):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 17:45:49.831: WARN/System.err(25592):     at android.os.Looper.loop(Looper.java:123)
12-19 17:45:49.831: WARN/System.err(25592):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-19 17:45:49.831: WARN/System.err(25592):     at java.lang.reflect.Method.invokeNative(Native Method)
12-19 17:45:49.831: WARN/System.err(25592):     at java.lang.reflect.Method.invoke(Method.java:521)
12-19 17:45:49.831: WARN/System.err(25592):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
12-19 17:45:49.834: WARN/System.err(25592):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
12-19 17:45:49.834: WARN/System.err(25592):     at dalvik.system.NativeStart.main(Native Method)


la riga dovrebbe essere la 144, ovvero:

Codice (Java): [Seleziona]
        findViewById(R.layout.main).setBackgroundDrawable(new BitmapDrawable(getResources(), b));
« Ultima modifica: 19 Dicembre 2010, 17:48:25 CET da DarKprince »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #13 il: 19 Dicembre 2010, 18:12:50 CET »
+2
Codice (Java): [Seleziona]
        findViewById(R.layout.main).setBackgroundDrawable(new BitmapDrawable(getResources(), b));

Ma che è quella roba? :D

Dai un ID al Layout nel main.xml (es. "layout1") e poi assegnagli uno sfondo così:
Codice (Java): [Seleziona]
((LinearLayout) findViewById(R.id.layout1)).setBackgroundDrawable(new BitmapDrawable(getResources(), b));
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Help cambio sfondo LinearLayout at RunTime
« Risposta #14 il: 19 Dicembre 2010, 18:22:43 CET »
0
 :D imbarazzo più totale! 

Perdona la mia ignoranza LOL

Grazie, ora funziona (ovviamente non c'erano dubbi!) molto bene!
Giusto per chiudere, per far si che poi lo sfondo che l'utente sceglie resti definitivo mi basta salvare il path dell'immagine che l'utente sceglie e ricreare il bitmap ad ogni lancio o esiste un modo più semplice?