JavascriptProva

domenica 13 novembre 2016

Conflitti nell'attivazione del timer.

Vado cercando il modo di schematizzare quando sia necessario avere il timer in funzione e quando no.
Cerchiamo di iniziare dalle cose più semplici.

Innanzitutto, quando si avvia il programma il timer è già in funzione.
Questo innesca, dopo una quantità di minuti prestabilita, la comparsa della Activity B.
L'Activity B, una volta chiusa, innnesca di nuovo il timer per la ricomparsa di se stessa, e così via, fin quando non si interrompa il timer mediante un pulsante presente sull'Activity A.
Il primo timer è innescato da A, il secondo sempre da B che si richiama da solo alla scadenza del tempo prestabilito.

E' possibile che, se si schiaccia due volte il pulsante su A che innesca il timer, si abbiano due timer, in modo che B appaia due volte, ossia che ne vengano aperte più istanze?
Questo sarebbe problematico, e devo verificarlo.
Nel mio caso, il timer si avvia all'accensione dello switch.
Questo timer dovrebbe essere l'unico avviato dall'activity A.
Quindi dovrebbe proseguire l'innesco automatico del timer da parte dell'activity B che richiama se stessa.
Ci sono però altre tre occasioni in cui viene innescato il timer esternamente al normale ciclo dell'activity B che richiama se stessa:
  1. alla conferma di una nuova voce;
  2. alla pressione del tasto VISUALIZZA (indirettamente mediante apertura di activity B con successivo innesco del timer);
  3. dall'activity SETTINGS nell'evento onPause (se questo prelude al ritorno all'Activity A).
Me li rinfresco da codice:
        bttConferma=(Button)findViewById(R.id.bttConferma);
        bttConferma.setEnabled(false);
        bttConferma.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                helper.save(lista.get(0));
                bttConferma.setEnabled(false);
                bottone.setEnabled(true);
                avviaTimer();
                mOnAlarmChangeListener.OnAlarmChange();
            }
        });
        bttVisualizza=(Button)findViewById(R.id.bttVisualizza);
        bttVisualizza.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                cancellaTimer();
                Intent intent=new Intent(getApplicationContext(),Lista.class);
                startActivity(intent);
            }
        });


Activity SETTINGS:
    @Override
    protected void onPause(){
        super.onPause();

        if(permessoAvvioTimer)avviaTimer();
    }
Se il timer viene innescato da una di queste e successivamente dall'altra, si hanno due cicli di Timer sovrapposti.
Provo a causarlo coscientemente togliendo cancellaTimer() quando viene visualizzata l'altra activity dal pulsante su A.
        bttVisualizza=(Button)findViewById(R.id.bttVisualizza);
        bttVisualizza.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                //cancellaTimer();
                Intent intent=new Intent(getApplicationContext(),Lista.class);
                startActivity(intent);
            }
        });
E proviamo ad accendere l'interruttore e prima che si apra B a visualizzarla col pulsante.

Sì, ottengo un conflitto e vengono aperte due istanze di B!
Forse l'unica è inserire un cancellaTimer() ogni volta prima che il timer venga innescato esternamente.
Lo faccio nei punti prima considerati:
1) Interruttore:
        switch1.setOnCheckedChangeListener(new Switch.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    cancellaTimer();
                    avviaTimer();
                    mOnAlarmChangeListener.OnAlarmChange();
                }else{
                    cancellaTimer();
                    mOnAlarmChangeListener.OnAlarmChange();
                }
            }
        });


2) Conferma di una nuova voce:
        bttConferma.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                helper.save(lista.get(0));
                bttConferma.setEnabled(false);
                bottone.setEnabled(true);
                txtVocale.setText(null);
                cancellaTimer();
                avviaTimer();
                mOnAlarmChangeListener.OnAlarmChange();
            }
        });


3) Pressione del tasto Visualizza:
        bttVisualizza.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                cancellaTimer();
                Intent intent=new Intent(getApplicationContext(),Lista.class);
                startActivity(intent);
            }
        });
4) Da SETTINGS in onPause:
    @Override
    protected void onPause(){
        super.onPause();

        if(permessoAvvioTimer){
            cancellaTimer();
            avviaTimer();
        }
    }


Dovrei essere piuttosto sicuro, adesso...

Semplifico il codice dell'interruttore:
        switch1.setOnCheckedChangeListener(new Switch.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                cancellaTimer();
                if(isChecked) avviaTimer();
                
                mOnAlarmChangeListener.OnAlarmChange();
                
                
            }
        });
E ora sperimentiamo nel tempo...

venerdì 11 novembre 2016

Come terminare una Activity e rimuoverla dai Recent Tasks.

A questo punto, le cose da fare sono diverse.
Per prima cosa, terminare la schermata iniziale.
Ho aggiunto un'altra voce nel menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/stopTimer"
        android:title="Stop Timer">

    </item>
    <item
        android:id="@+id/showSettings"
        android:title="Impostazioni" >
    </item>
    <item
        android:id="@+id/terminaSchermata"
        android:title="Nascondi" >
    </item>
</menu> 
E la gestisco con questo codice:
    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem){
        switch(menuItem.getItemId()){
            case R.id.stopTimer:
                cancellaTimer();
                break;
            case R.id.showSettings:
                cancellaTimer();;
                Intent i=new Intent(MainActivity.this,Settings.class);
                startActivity(i);
                break;
            case R.id.terminaSchermata:
                    finish();
            }
                
        }
        return true;
    }
Però mi rimane nei recent tasks.
E' già impostato nel manifest autoRemoveFromRecents:
        <activity
            android:name=".Lista"
            android:autoRemoveFromRecents="true"
            android:screenOrientation="portrait" /> 
Ma, come ho imparato, nelle versioni superiori a 21 è necessario usare, per terminare e rimuovere dai recenti, finishAndRemoveTasks.
Lo uso e ottengo errore perché l'applicazione è indirizzata anche a versioni più antiche della 21.
Per far ciò, trovo il codice che adatta l'istruzione alla versione:
            case R.id.terminaSchermata:
                if(Build.VERSION.SDK_INT>=21){
                    finishAndRemoveTask();
                }else{
                    finish();
                }
E così funziona, rimuovendo completamente l'activity dai recenti una volta terminata.

Ripasso BroadcastReceiver nel tentativo di intercettare il tasto Home.

Provo a creare un broadcastReceiver.
Lo creo nello stesso modulo.

L'ho nidificato nella classe dell'Activity:
    public class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            
        }
    }
Il metodo onReceive viene dato di default.

Per la registrazione, bisogna prima istanziare la classe creata.
Ci provo...

Scrivo intanto un'azione per l'evento onReceive:
    public class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("ricevuto");
        }
    }


Ecco:
public class MainActivity extends AppCompatActivity {

    MyReceiver myReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myReceiver=new MyReceiver();

    }
Ora devo definire un IntentFilter e registrare il Receiver insieme a questo IntentFilter in onResume, deregistrandolo in onPause
Provo a usare l'intentFilter che ho trovato nella costruzione dell'HomeWatcher:
        myReceiver=new MyReceiver();
        intentFilter=new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
Quindi registro in onResume e deregistro in onPause:
    @Override
    protected void onResume(){
        super.onResume();
        registerReceiver(myReceiver,intentFilter);
    }

    @Override
    protected void onPause(){
        super.onPause();
        unregisterReceiver(myReceiver);
    }
Funziona. Intercetta la pressione del tasto Home.
Ma non mi previene la chiusura dell'activity.

martedì 8 novembre 2016

Sequenza dei pulsanti nell'applicazione J-Ag.

Ottimizziamo il ciclo...

Quando appare la schermata principale, i tasti Conferma e Annulla sono disattivati.
Sistemo il pulsante Annulla.

Ecco: a inizio di schermata, NUOVO è attivo, mentre CONFERMA e ANNULLA sono inattivi.

Poi, una volta recepito il comando verbale, si attivano CONFERMA e ANNULLA per le due scelte.


E' necessario che non vi sia l'esibizione dell'agendina al termine di questa schermata, ma semplicemente un avvio e uno stop del timer.
Correggo.

r Fatto.
E ho trovato una successione per i tre pulsanti, NUOVO, CONFERMA e ANNULLA.
Quando appare la schermata, NUOVO è abilitato, mentre CONFERMA e ANNULLA sono disabilitati, in modo che si possa premere solo NUOVO.
        bttAnnulla=(Button) findViewById(R.id.bttAnnulla);
        bttAnnulla.setEnabled(false);
.....

        bttConferma=(Button)findViewById(R.id.bttConferma);
        bttConferma.setEnabled(false);
Quando schiaccio NUOVO, dopo la ricezione della voce, si va a onActivityResult e, SE IL RISULTATO E' RESULT_OK, ossia -1, si abilitano CONFERMA e ANNULLA, mentre si disabilita NUOVO:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK){
            lista=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            tts.speak(lista.get(0),TextToSpeech.QUEUE_FLUSH,null);

            
            bottone.setEnabled(false);
            bttConferma.setEnabled(true);
            bttAnnulla.setEnabled(true);

        }else{r
            
            avviaTimer();
        }



    }
Se si sceglie di schiacciare CONFERMA, viene salvato il dato, quindi si disabilitano CONFERMA e ANNULLA mentre si riabilita NUOVO, e riparte il TIMER
        bttConferma.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                helper.save(lista.get(0));
                bttConferma.setEnabled(false);
                bttAnnulla.setEnabled(false);
                bottone.setEnabled(true);
                avviaTimer();
            }
        });
Se invece si sceglie di schiacciare ANNULLA, non viene salvato nessun dato, e ugualmente si disabilitano CONFERMA e ANNULLA, mentre si riabilita NUOVO, e riparte il TIMER.
        bttAnnulla.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                bttConferma.setEnabled(false);
                bttAnnulla.setEnabled(false);
                bottone.setEnabled(true);
                avviaTimer();
            }
        });


Se invece si evita di dare un input vocale e si schiaccia INDIETRO o si schiaccia al di fuori del prompt vocale, si agisce più a monte, e si dà un risultato sbagliato ad onActivityResult, per cui RESULT_OK è pari a zero invece che a -1: di conseguenza entra in gioco questo codice, che semplicemente riavvia il TIMER: dal momento che RESULT_OK è pari a zero, non si attivano CONFERMA e ANNULLA.
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK){
            lista=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            tts.speak(lista.get(0),TextToSpeech.QUEUE_FLUSH,null);


            bottone.setEnabled(false);
            bttConferma.setEnabled(true);
            bttAnnulla.setEnabled(true);

        }else{

            avviaTimer();
        }

    }

domenica 6 novembre 2016

Aggiunta di una suoneria e codice per l'impostazione di una suoneria personalizzata.

Riscriviamo un codice che suoni la suoneria di default.
        Uri ringtoneUri= RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(),RingtoneManager.TYPE_NOTIFICATION);
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),ringtoneUri);
        ringtone.play();
Questo suona la suoneria di tipo NOTIFICATION.

Esistono anche altri tipi:
        Uri ringtoneUri= RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(),RingtoneManager.TYPE_ALARM);
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),ringtoneUri);
        ringtone.play();
Questo invee suona la suoneria di tipo ALARM (che non la smette più!)

Andiamo a vedere l'altro tipo:

       Uri ringtoneUri= RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(),RingtoneManager.TYPE_RINGTONE);
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),ringtoneUri);
        ringtone.play();
Questo suona la suoneria telefonica.


C'è poi il capitolo della scelta della suoneria personalizzata per l'applicazione, che non ricordo.
Rinfreschiamo la memoria...

Ci si avvale di SharedPreferences.
Se non è stato salvato niente, ossia se la stringa ripescata da SharedPreferences è vuota, si usa la suoneria di default, altrimenti si Uri.parsa la stringa reperita in SharedPreferences.
Devo definire, però SharedPreferences.
    SharedPreferences SP;

.....

        SP=getApplicationContext().getSharedPreferences("suoneria",Context.MODE_PRIVATE);
Fatto questo, torno a modificare il codice che stabilisce la suoneria:
        SP=getApplicationContext().getSharedPreferences("suoneria",Context.MODE_PRIVATE);

        Uri ringtoneUri;
        Ringtone ringtone=null;
        String strSuoneria=SP.getString("suoneria","");
        if(TextUtils.isEmpty(strSuoneria)){
            ringtoneUri= RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(),RingtoneManager.TYPE_NOTIFICATION);
            
            
        }else{
            ringtoneUri=Uri.parse(strSuoneria);
        }
        ringtone=RingtoneManager.getRingtone(getApplicationContext(),ringtoneUri);
        ringtone.play();
Il discorso è semplice.

E funziona.
Ora devo provvedere una sezione per la scelta della suoneria.
Creo un'activity Settings per la regolazione di questa e altre funzioni, raggiungibile tramite menu.

Ecco l'XML del menu di MainActivity modificato:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/stopTimer"
        android:title="Stop Timer">

    </item>
    <item
        android:id="@+id/showSettings"
        android:title="Impostazioni" >
    </item>
</menu> 
Ed ecco il menu in MainActivity modificato:
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater=this.getMenuInflater();
        inflater.inflate(R.menu.miomenu,menu);
        return true;
    }



    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem){
        switch(menuItem.getItemId()){
            case R.id.stopTimer:
                cancellaTimer();
                break;
            case R.id.showSettings:
                Intent i=new Intent(MainActivity.this,Settings.class);
                startActivity(i);
        }
        return true;
    }
E in Settings possiamo scrivere il codice per la scelta delle suonerie.
Prima l'intent:
        bttSceltaSuoneria.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
                startActivityForResult(intent,0);

            }
        });
(subordinato a un Button)

Quindi onActivityResult:
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        Uri uri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        SharedPreferences.Editor editor=SP.edit();
        editor.putString("suoneria",uri.toString());
        editor.commit();
    }
E vediamo se combina... Comunque ho fatto una faticaccia a scrivere questo codice, completamente dimenticato.

Feedback vocale e conferma

Adesso inserisco un feedback.
Quando parlo, potrei non essere stato capito bene. E' bene che ci sia una risposta che mi permetta di verificare se il mio comando è stato ben capito.
Organizzo una risposta vocale...

Inizializzo il tts:
    TextToSpeech tts;

.....

        tts=new TextToSpeech(getApplicationContext(),new TextToSpeech.OnInitListener(){

            @Override
            public void onInit(int status) {
                if(status==TextToSpeech.SUCCESS){
                    tts.setLanguage(Locale.ITALIAN);
                }
            }
        });
Ora, quando ho parlato, arrivo a OnActivityResult.
E' qui che devo inserire il feedback.
Devo inserire un button "Annulla", però...

O meglio un button "Conferma".
Ecco tutto ciò che ho realizzato:


MainActivity:
public class MainActivity extends AppCompatActivity {

    Button bttConferma;
    TextToSpeech tts;
    Helper helper;
    Button bottone;
    ArrayList lista;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bttConferma=(Button)findViewById(R.id.bttConferma);
        bttConferma.setEnabled(false);
        bttConferma.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                helper.save(lista.get(0));
                bttConferma.setEnabled(false);
                Intent i=new Intent(getApplicationContext(),Lista.class);
                startActivity(i);
            }
        });

        tts=new TextToSpeech(getApplicationContext(),new TextToSpeech.OnInitListener(){

            @Override
            public void onInit(int status) {
                if(status==TextToSpeech.SUCCESS){
                    tts.setLanguage(Locale.ITALIAN);
                }
            }
        });

        helper=new Helper(this);

        bottone=(Button)findViewById(R.id.button);
        bottone.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                bttConferma.setEnabled(false);
                cancellaTimer();
                Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ITALIAN);
                intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Parla ora");
                startActivityForResult(intent,0);

            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK){
            lista=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            tts.speak(lista.get(0),TextToSpeech.QUEUE_FLUSH,null);
            bttConferma.setEnabled(true);

        }else{
            Intent i=new Intent(getApplicationContext(),Lista.class);
            startActivity(i);
        }



    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater=this.getMenuInflater();
        inflater.inflate(R.menu.miomenu,menu);
        return true;
    }



    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem){
        switch(menuItem.getItemId()){
            case R.id.stopTimer:
                cancellaTimer();
                break;
        }
        return true;
    }

    private void cancellaTimer(){
        Intent intent=new Intent(getApplicationContext(),
                Lista.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),
                0,
                intent,
                0);
        AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        if(pendingIntent!=null)pendingIntent.cancel();
    }

    private void avviaTimer(int secondi){
        //stabilisce il ciclo
        Intent intent=new Intent(getApplicationContext(),Lista.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
        AlarmManager alarmManager=(AlarmManager) getApplicationContext().getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+Const.secondi*1000,pendingIntent);

    }

}


Lista:
public class Lista extends AppCompatActivity {

    Button bttChiudi;
    Helper helper;
    MyCursorAdapter myCursorAdapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista);

        bttChiudi=(Button)findViewById(R.id.bttChiudi);
        bttChiudi.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                finish();
            }
        });
        helper=new Helper(this);
        Cursor crs=helper.query();
        myCursorAdapter=new MyCursorAdapter(this,crs);
        listView=(ListView)findViewById(R.id.listView);
        listView.setAdapter(myCursorAdapter);





    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        Cursor crs=helper.query();
        if(crs.getCount()!=0) {

            Intent intent = new Intent(Lista.this, Lista.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(ALARM_SERVICE);
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + Const.secondi * 1000, pendingIntent);
        }

    }

    class MyCursorAdapter extends CursorAdapter {

        Context context;
        public MyCursorAdapter(Context context, Cursor c) {
            super(context, c);
            this.context=context;
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
            return layoutInflater.inflate(R.layout.row,null);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            TextView textView=(TextView)view.findViewById(R.id.textView);
            final TextView textView2=(TextView)view.findViewById(R.id.textView2);
            Button button=(Button)view.findViewById(R.id.button2);
            textView.setText(cursor.getString(cursor.getColumnIndexOrThrow("voce")));
            textView2.setText(""+cursor.getInt(cursor.getColumnIndexOrThrow("_id")));
            button.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View v) {
                    helper.cancella(Integer.parseInt(textView2.getText().toString()));
                    myCursorAdapter.getCursor().requery();
                }
            });
        }
    }



}

HTML: Ripasso del layout a due colonne.

Partiamo subito sul sodo: mi serve un layout a due colonne.

Assodato che stabilire la larghezza della colonna laterale in termini percentuali sia sconveniente per la possibile comparsa di scrollbars orizzontali, questa va impostata in termini fissi.
Tutorial che sto seguendo

Ecco, sono riuscito a ottenere qualche risultatino decente, ossia una colonna di navigazione a sinistra: la regola fondamentale è usare il float per la barra navigation, e impostarne la larghezza (fissa), per poi impostare la proprietà margin-left del DIV "contenuto" allo stesso valore della larghezza della navigation.
<html>
<head>
<style>
#container:{
 width:300px;
 
}

#content{
 margin-left:200px;
 background-color:#AAFFAA; 
}

#navigation{
 float:left;
 width:200px;
 background-color:#FFCCAA;
}
 
</style>
</head>
<body>
<body>
    <div id="container">
        <div id="header"></div>
        <div id="navigation">
         Lunedi<br>
         Martedi<br>
         Mercoledi<br>
         Giovedi<br>
         Venerdi<br>
         Sabato<br>
        </div>
        <div id="content">
         Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
        </div>
        <div id="footer"></div>
    </div>
</body>
</body>
</html>