Category Archives: Programming - Page 2

AndroidManifest.xml-fel

Androidmanifestet är en nyckelspelare i det här med Androidutveckling eftersom den definierar upp vilka aktiviteter som ska finnas tillgängliga, vilka rättigheter till enheten applikationen ska ha och massvis med annat.
Får man fel här kan det hända att man kör applikationen och till synes inte får ut något användbart i loggen.
I det här fallet kan det dock dyka upp ett loggat fel likt

W/ResourceType(53): Resources don't contain package for resource number 0x7f0700e5

i en eller flera rader.
Det underliga och lite snikna här är att applikationen kompilerar, installeras och körs. Men det kan te sig lite olika resultat

  • Det loggade felet ovan
  • Det finns ingen launcher-ikon
  • Det loggas inget (som ser ut att vara sammankopplat med applikationen man kör)
  • Min aktivitet visas/körs aldrig

Svaren till alla dessa händelser är (tills någon säger annorlunda): Ditt Androidmanifest är fel! Så se nu till att kolla lite närmre på det och försäkra dig om att det som står där i faktiskt är något som Android förstår och kan köra.

Logga (System.out.print) allt!

Satt och försökte hjälpa en snubbe med ett problem rörande Spinners i Android. Tydligen kraschade appen han byggde varje gång man tryckte på Spinnern och valen skulle visas. Enligt stacktracen var det ett NullPointerException, men det som gjorde det hela svårare var att Spinnern faktiskt innehöll minst ett val.

Efter ungefär en trkvarts, timmes felsökande visar det sig att det körs två loopar, baserat på databasresultat. Varje iteration i första loopen lägger in ett val i listan, varje iteration i andra loopen drar ifrån ett antal val i listan. I detta fallet visade det sig att första loopen gjordes med en check

for(int i = 1; i <= list.getsize(); i++) { //Lägg till val }

Den andra loopen använde sig av

for(int i = 0; i < list2.getsize(); i++) { //Dra ifrån val }

Det intressanta i de här looparna är att den första lägger till hela listans resultat + 1. Detta innebar att det hamnat ett null-objekt i listan, som loop två inte kunde ta bort.
Det enda som skvallrade om något kring detta var att skriva ut loggar över vad som inträffade. Det hade tagit ungefär 15 minuter att lösa detta, om man hade börjat direkt med att logga vad som skedde. Så, till alla er som sitter där ute och tror/litar på att ni vet vad er kod gör, _utan_ att se loggarna: Tänk om. Ni har ingen aning.

EditText med allt annat än strängar

Det här förbryllade mig ett tag. Jag försökte sätta ett värde i en EditText och fick glada skutt från logcat:en

E/AndroidRuntime( 3712): java.lang.RuntimeException: Unable to start activity ComponentInfo{se.sigtuna.android.uvbaisk/se.sigtuna.android.uvbaisk.UvbaiskQuestions1Activity}: android.content.res.Resources$NotFoundException: String resource ID #0x0
E/AndroidRuntime( 3712): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0

Det tog mig ca tjugo minuter att till slut prova

editText.setText(String.valueOf(myObject.intId))

istället för

editText.setText(myObject.intId)

Så, kids. Se till att bara, bara, BARA skicka in strängar till en EditText, oavsett om logcat vill säga att den saknar en resurs, likt det som kan hänta om man anger tex en widget som tillhör en annan aktivitet än den som syns just nu……

Positioneringsbedrövelse med ZoomButtonsController

Jag har suttit och försökt få ordning på det här till och från i flera dagar, men det tycks inte finnas någon annan lösning än:

Om du vill placera knapparna till en ZoomButtonsController någon annanstans än centrerad i botten på skärmen: Glöm det!

Jag använder mig av ZoomButtonsControllern i en klass som extendar en ImageView och med Internets hjälp har jag konstaterat att det till dags dator inte är möjligt att placera om knapparna.

Det tråkiga i den här kråksången är att ZoomButtonsControllern är en i övrigt bra klass som bland annat implementerar godbitar som fade in/ut när de visas. Det alternativ man har att använda sig av istället är klassen ZoomControls, som är en enklare form av ZoomButtonsController, men i en layout-mässigt bättre widget.

Men för all del, ni får gärna öppna mina ögon för att komma åt möjligheten att påverka placeringen. Det hade jag högljutt tackat för!

Androidemulatorn startar inte på grund av sökvägsproblem

Androids AVD-hanterare kan ibland ställa till lite trubbel, beroende på om man valt att installera saker och ting på nytt, om man använder Windows XP/7/Linux/[Något annat]. Min miljö är Windows 7 x64 och jag får ibland upp detta fel

PANIC: Could not open: C:\Users\drlaban\.android/avd/Android2.1.ini

Den som är lite uppmärksam ser att det kan vara lite härligt blandat mellan Windows/Linux-slasharna, men en sak som inte är alltför tydlig är det faktum att jag i min Windows-miljö flyttat alla “Mina *”-mappar till en annan disk. Detta hanteras inte så himla bra av AVD och ställer alltså till det när man skapar emulator-avbildningar.

Så, vad göra? Det hela är mycket enkelt:

  • Skapa en miljövariabel som heter ANDROID_SDK_HOME som pekar ut sökvägen till den disk/mapp som innehåller mappen “.android”
  • Starta om AVD-managern, skapa om avbildningarna och kör på som det var tänkt från början.

Android-handgrepp

När man jobbar med ADB och håller på att utveckla appar är paketnamnen för installerade appar lämpliga att känna till. Det finns ett ADB-kommando som är rätt vettigt till detta:

pm list packages -f

Anpassad .vimrc (tex per projekt)

Hittade en trevlig plugin till VIM där man med hjälp av denna kan läsa in en anpassad .vimrc-fil, som tillägg till den globala .vimrc-filen som sourcas av VIM varje gång man öppnar det.

Detta plugin letar efter en fil vid namn _vimrc_local.vim från den mapp man står i och sen borrar den sig rekursivt nedåt.

Detta innebär alltså att man tex skulle kunna anpassa sina indrag på ett projekt-baserat sätt, utan att behöva tänka efter och aktivera funktioner på egen hand. Om ett projekt kräver 2 teckens mellanslag som indrag, anpassar man _vimrc_local.vim efter det. Om ett annat projekt kräver 4 teckens tab som indentering, då anpassar man _vimrc_local.vim efter det. Den mapp-lokala filen bestämmer alltså hur VIM ska bete sig beroende på dess innehåll.

Pluggen kan ni skaffa här

http://code.google.com/p/lh-vim/source/browse/misc/trunk/plugin/local_vimrc.vim

och en tillhörande VIM-boll (och källa) kan ni skaffa här:

http://lh-vim.googlecode.com/files/lh-vim-lib-2.2.5.vba
http://code.google.com/p/lh-vim/wiki/lhVimLib

local_vimrc.vim placerar man i ~/.vim/plugin och VIM-bollen laddar man hem, öppnar med VIM och skriver

:so %

CakePHP checklista

Don’t lämna hemmet utan den!

http://cake-php-tutorial.blogspot.com/2009/06/cakephp-install-checklist-apache.html

RewriteBase räddar (CakePHP)-dagen

Har du någonsin kört CakePHP? Har du velat lägga din CakePHP-mapp i en underkatalog till din www-root? Eller kanske rentav någon annanstans? Då är RewriteBase i .htaccess något du vill lägga på minnet.

Jag gick från 404-fel till fullt fungerande CakePHP installationer genom att i .htaccess lägga till

<code>RewriteBase /[sökväg till din CakePHP-root]</code>

Om du råkar ut för 404 i dina installationer, kolla upp så att du har RewriteBase inlagt först, gå sen på att försöka mecka runt med annat. (Såklart måste ju din Apache-installation överhuvudtaget fungera. Och mod_rewrite.. Samt PHP… MySQL är vettigt…. Glöm inte…..)

Holy rewrite, Buttman!

“Va? Ska det inte vara Batman?”, kanske ni tycker. Nä, inte i det här fallet, för det ställde till en massa skit i en dryg halvtimme för att komma undefund med varför min rewrite fungerade konstigt.

Jag aktiverade mod_rewrite i WAMP och gjorde lite tester utifrån ett par tutorials och allt verkade fungera kanonfint. Fram tills jag själv ville experimentera och stötte på ett problem med filnamn och hur rewrite-stödet fungerar per default.

Ett enkelt exempel på hur en rewrite kan se ut i en .htaccess-fil

RewriteEngine on
RewriteRule ^product/([0-9][0-9])/$ /productinfo.php?id=$1 [R]

Rad ett talar om att vi vill använda rewritemotorn. Rad två innehåller en beskrivning för hur en specifik typ av URL ska hanteras. I detta fall kommer en URL som ser ut tex “http://www.host.com/product/22/” att redirectas till “http://www.host.com/productinfo.php?id=22”.
Detta fungerade kanonfint, utan problem. Men så tänkte jag att man skulle vilja göra filnamnet lite mer konsekvent med URL:en. Så jag döper med andra ord om “productinfo.php” till “product.php”. Då tycker Rewritemotorn att den ska öppna filen “product.php” oavsett hur många efterföljande paramterar(/slashar) jag än lägger på. För så fungerar minsann Rewrite; om det finns en fil med samma namn som det du försöker matcha (“product”(.php) i det här fallet), så kommer Apache att leverera dig filen med det namnet och göra det förbryllande. Kort sagt, se till att inte ha samma filnamn på det som ska matchas och det som ska rewritas, så slipper man huvudvärk ett tag.