lunedì 28 gennaio 2013

Installazione di una app su telefono o sd-card

E' possibile far scegliere all'utente dove poter installare un app android scaricata dal market.
Requisiti minimi dell'app sono API Level 8 e Platform 2.2
Successivamente modificare il file AndroidManifest.xml
Di seguito un esempio, e il parametro installLocation può essere modificato.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="it.mg.android.quiz"
      android:installLocation="auto"
      android:versionCode="x.x"
      android:versionName="x">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 </application>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11"/>
</manifest> 

domenica 20 gennaio 2013

Hyperlink in un campo testo di una dialog con Android

In un campo testo è possibile inserire un hyperlink in diversi modi. Nell'esempio seguente vengono create due TextView in una Dialog box: nella prima il link è nella classe (volendo si può inserire nel file strings.xml e poi importarlo), nella seconda TextView il parametro 'autoLink' permette di riconoscere automaticamente un link per poi essere cliccato.

Codice java per il dialog:
final Dialog dialog = new Dialog(this);                                   
dialog.setContentView(R.layout.dialog);

String link1 = "<A HREF='http://www.example.com'>example</A>";
TextView txtLink1 = (TextView) dialog.findViewById(R.id.txt_dialog_link1);
txtLink1.setText(Html.fromHtml(link1));
txtLink1.setMovementMethod(LinkMovementMethod.getInstance());

dialog.show();
dialog.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
 android:id="@+id/layout_root"          
 android:orientation="horizontal"  
 android:layout_width="fill_parent"  
 android:layout_height="fill_parent" >  
 <TableLayout android:layout_width="fill_parent"
  android:id="@+id/row_container1"
  android:background="@android:color/black"
  android:layout_height="fill_parent">
  <TableRow android:id="@+id/widget586"
      android:paddingBottom="8dp"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">
   <TextView android:id="@+id/txt_dialog_link1"  
          android:layout_width="wrap_content" 
          android:textColor="@android:color/white"          
    android:layout_height="fill_parent"  />
  </TableRow>
  <TableRow android:id="@+id/widget587"
   android:layout_width="wrap_content"
   android:paddingBottom="8dp"
   android:layout_height="wrap_content">
   <TextView android:id="@+id/txt_dialog_link2"  
       android:textColor="@android:color/white"
       android:autoLink="web"
       android:text="http://www.example.com"
     android:layout_width="wrap_content"     
   android:layout_height="wrap_content"/>
  </TableRow>
  <TableRow android:id="@+id/widget587"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">
   <Button 
    android:id="@+id/btn_dialog" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
   android:layout_centerHorizontal="true" 
    android:text="OK"/>
  </TableRow>
 </TableLayout>
</LinearLayout>

sabato 12 gennaio 2013

Android e il Flip tra Activity come su Iphone

Come "flippare" tra due activity con android: semplice, di seguito lascio un esempio di alcune righe da implementare in un app e organizzare il layout. Si è chiaro che su internet ce ne sono di esempi ma questo a me ha funzionato perfettamente con un sdk 4.1.1 (ossia android 2.2).
I due layout sono raccolti nell'oggetto ViewFlipper, nel onCreate aggiungere il setOnTouchListener e utilizzare il dispatchTouchEvent.
Ho utilizzato il RelativeLayout per inserire in basso i banner, ma è opzionale si può utilizzare benissimo un LinearLayout.
Aggiungere la directory "anim" sotto "res" e creare i 4 layout left_in.xml left_out.xml right_in.xml right_out.xml

Sorgente:

public class Example extends Activity{
 private ViewFlipper vf;
 private static final int SWIPE_MIN_DISTANCE = 150;
 private static final int SWIPE_THRESHOLD_VELOCITY = 200;
 
 private final GestureDetector detector = new GestureDetector(
   new MyGestureDetector());
   
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.example);
  mContext = this;
  
  vf = (ViewFlipper)findViewById(R.id.viewflipper_example);
  
  vf.setOnTouchListener(new OnTouchListener() {
         @Override
         public boolean onTouch(final View view, final MotionEvent event) {
          detector.onTouchEvent(event);
             return true;
         }
     });
  
 }

 class MyGestureDetector extends SimpleOnGestureListener {
  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   try {
    if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
      && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
     vf.setInAnimation(AnimationUtils.loadAnimation(mContext,
       R.anim.left_in));
     vf.setOutAnimation(AnimationUtils.loadAnimation(mContext,
       R.anim.left_out));
     vf.showNext();
     return true;
    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
      && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
     vf.setInAnimation(AnimationUtils.loadAnimation(mContext,
       R.anim.right_in));
     vf.setOutAnimation(AnimationUtils.loadAnimation(mContext,
       R.anim.right_out));
     vf.showPrevious();
     return true;
    }

   } catch (Exception e) {
    e.printStackTrace();
   }

   return false;
  }
 }
 
 @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        super.dispatchTouchEvent(event);
        return detector.onTouchEvent(event);
    }
}
Layout xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
 android:layout_width="fill_parent"
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_height="wrap_content"
 android:orientation="vertical">
    <RelativeLayout
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent"      
  android:orientation="vertical">
     <ViewFlipper android:id="@+id/viewflipper_example"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent">  
  <LinearLayout 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical">
   
   
  </LinearLayout>
  <LinearLayout 
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical" >
  </LinearLayout>
  </ViewFlipper>
 </RelativeLayout>
</LinearLayout>

venerdì 4 gennaio 2013

Utilizzo personalizzato di jQuery UI DatePicker in ambiente .Net

Utilizzo personalizzato di jQuery UI DatePicker in ambiente .Net

Se in una form sono presenti più oggetti DatePicker è possibile associare a ciascuno diverse proprietà attribuendo diverse funzioni.
Con questo esempio rendo selezionabili nel secondo DatePicker solamente: tutti i martedì del mese (corrisponde il numero 2), dal 25 di ogni mese fino a fine mese, i primi 5 giorni del mese successivo.
Di seguito i due oggetti TextBox/datePicker e il codice javascript:
<asp:TextBox ID="txt1" runat="server" CssClass="datePicker"> </asp:TextBox>
<asp:TextBox ID="txt2" runat="server" CssClass="datePicker_custom"> </asp:TextBox>

<script type="text/javascript">

function initDatepicker() {
    var myPath = getBaseURL() + "img/icon-calendar.gif";
    var myParam = 'both';
    var date = new Date();
    var dayMonth = 25;

    $(function() {
        $(".datepicker").datepicker({
            showButtonPanel: true,
            buttonImage: myPath,
            buttonImageOnly: true,
            showOn: myParam
        });
    });

    $(function() {
        $(".datePicker_custom").datepicker({
            showButtonPanel: true,
            buttonImage: myPath,
            buttonImageOnly: true,
            showOn: myParam,

            beforeShowDay: function(date) {
                var dayEnabled = date.getDay();
                var dayRangeEnabled = date.getDate();

                if (dayEnabled == 2 || dayRangeEnabled > dayMonth || dayRangeEnabled < 6) {
                    return { 0: true }
                } else {
                    return { 0: false }
                }
            }
        });
    });
}

</script>