måndagen den 9:e augusti 2010

Android ListPreference stuff.

Okej, så efter att ha fått nullpointer en hel kväll och tillslut googlat lite så visar det sig att Androids ListPreference inte kan kombinera string-array med integer-array. Inte så smidigt när man vill spara en int med ett namn typ.


Dvs:



<resources>

<string-array name="entries">

<item>En minut</item>

<item>Två minuter</item>

<item>Tre minuter</item>

<item>Tio minuter</item>

</string-array>

<integer-array name="entry_values">

<item>1</item>

<item>2</item>

<item>3</item>

<item>10</item>

</integer-array>

</resources>


fungerar inte, så istället får man göra en



<resources>

<string-array name="entries">

<item>En minut</item>

<item>Två minuter</item>

<item>Tre minuter</item>

<item>Tio minuter</item>

</string-array>

<string-array name="entry_values">

<item>1</item>

<item>2</item>

<item>3</item>

<item>10</item>

</string-array>

</resources>



Kanske kan detta inlägg få mig att slippa jäklas lika länge nästa gång. :P

torsdagen den 24:e juni 2010

Sensors i android.

Android är ett hejjigt operativ och nu när jag behöver komma ihåg hur man kommer åt sensorerna postar vi lite sånt.

Först behöver man registrera sin listner hos sensormanagern (förslagsvis i onCreate):
SensorManager sm;
sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register your SensorListener
sm.registerListener(sl, SensorManager.SENSOR_ORIENTATION SensorManager.SENSOR_DELAY_NORMAL);

sen så kan det vara händigt att i din sensorlistner ha:

private final SensorListener sl = new SensorListener() {
public void onSensorChanged(int sensor, float[] values) {
}

public void onAccuracyChanged(int sensor, int accuracy) {
}
};

fredagen den 19:e mars 2010

Inline XSLT/XML

Jag ogillar att komma ihåg saker som inte längre är aktuella så jag sparar ned informationen här i hopp om att jag nån gång slipper använda den. Eftersom det kan vara bra att kunna xsltransformera lite xml nån gång så poppar jag in den här


<!-- inline xsl -->
<c:set var="xsl">
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:text>Antal XMLposter:</xsl:text><b><xsl:value-of select="count(*[local-name()='Test'])"/></b>
<a href="#" onClick="showhide('xmlData'); return false;">Visa/dölj detaljer</a><br/>
<div id="xmlData" style="display: none">
<xsl:apply-templates select="*[local-name()='TestPost']" />
</div>
</xsl:template>

<!-- Parsa ut ingående info -->
<xsl:template match="ns:Test">
<xsl:text>Test:</xsl:text><b><xsl:value-of select="ns:Value"/></b>
</xsl:template>

<!-- Gör nada för text -->
<xsl:template match="text()">
</xsl:template>
</xsl:stylesheet>
</c:set>

<!-- Transformera xml -->
<c:set var="xml" scope="page" value="${test.xml}" />
<x:transform doc="<?xml version='1.0'?>${xml}" xslt="${xsl}" />
</c:set>

Ett händigt verktyg för att testa sin XSL finns passande nog att hitta här om man känner dragning åt det hållet.

söndagen den 11:e oktober 2009

WS & Android


Har grejjat lite med Androidappar efter att jag styrde upp mina fina bönor som webbservicear på Glassfish. Det finns en skön patchad KSOAP2 implementation för Android så man enkelt kan snacka med sina servicar. Funkar ju onekligen, men jag vet  väl inte om jag tycker det är direkt smidigt. Bara för att man kan göra soapanrop betyder ju inte att det är smidigt att använda. Kanske enklare att bara köra RESTful prylar och skippa hela soap-biten. Men så jag kommer ihåg hur det var jag grejjade så bloggar jag koden iaf.

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

...    
    private static final String SOAP_ACTION = "getTest";
    private static final String METHOD_NAME = "getTest";
    private static final String NAMESPACE
"http://test.danielsundberg.nu/";
    private static final String URL 
"http://services.danielsundberg.nu/TestService/TestBean?wsdl"; 
    private Object resultRequestSOAP = null;
   
...

      private void search() {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

       //SoapObject
       request.addProperty("arg0", imeibox.getText().toString());
       SoapSerializationEnvelope envelope = 
         new SoapSerializationEnvelope(SoapEnvelope.VER11);
       envelope.setOutputSoapObject(request);

       AndroidHttpTransport androidHttpTransport = 
         new AndroidHttpTransport(URL);
       try {
           androidHttpTransport.call(SOAP_ACTION, envelope);
           resultRequestSOAP = envelope.getResponse();
           SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
           SoapObject result = 
(SoapObject) resultsRequestSOAP.getProperty("return");
           text.setText("Result: "+result.getProperty("firstResult");
           }         
       }
       catch (Exception e) {
           text.setText("An error occured while searching '" +
             e.getClass() + "'");
       } 
    }
Funkar men är ju inte direkt smidigt, har inte lyckats casta till några typer andra än bastyperna, men jag har väl inte undersökt jättenoga heller. Hur som så är det ju ballt att kunna snacka soap från en androidapp bara sådär. Kanske inte direkt skivat bröd, men väl som en kasse bärs.

torsdagen den 8:e oktober 2009

EJB3 & WLS10

Efter att ha testat runt lite känns det som om jag missat nått. Jag verkar inte vara ensam om att inte lyckas accessa mina remotebönor på en klient heller. Först var det lite forskning att hitta åt mappingName (som förstås var specifikt för weblogic) men nu hittar jag iaf bönorna i JNDI. Dock när jag försöker instansiera dem i klienten så får jag ett spännande ClassCastException. Var ju också ruskigt smidigt att få till en webbservice av bönorna.


Bönan
@Local({TestLocal.class})
@Remote({TestRemote.class})
@Stateless(name="TestBean", mappedName="ejb/Test", 
description="Test implementation.")
@WebService(endpointInterface = 
"nu.danielsundberg.service.TestRemote",
serviceName="TestRemote")
public class TestBean implements TestLocal, TestRemote {
    @javax.jws.WebMethod()
    public int test(int tal1, int tal2) {
        return tal1+tal2;
    }
} 

Localinterface
@Local 
public interface Test{
    int test(int tal1, int tal2);
}

Remoteinterface
@Remote
@WebService
@SOAPBinding(style = 
javax.jws.soap.SOAPBinding.Style.DOCUMENT)
public interface TestRemote extends Test{
}


Bönorna dyker upp i domänens JNDI-träd okej, frågan är om jag har packat ihop mitt projekt på nått fel sätt så att klassladdarstrul uppstår. Webbservicen blir iaf klockren. Ska replikera mitt projekt och testa i Glassfish istället och kolla om den klarar sig lite bättre.

Dock verkar EJB3-standarden vara lite som skivat bröd, jäkligt smidigt dvs.