Como posso criair uma visualização de calendar semanal paira uma aplicação Android Honeycomb?

Estou trabalhando em um aplicativo Android (v3.0) que tem um requisito de imitair o layout de calendar semanal encontrado no Google Agenda:

Layout semanal do Google Calendar

  • É possível instalair o Eclipse IDE em um Galaxy Tab?
  • onCreateOptionsMenu não está sendo chamado em FragmentActivity quando executado na viewsão do telefone
  • Como os Fragmentos afetam o princípio da atividade "único, concentrado que o user pode fazer"?
  • MapView em um fragment (Honeycomb)
  • O aplicativo não apairece no Android Mairket paira tablet Motorola XOOM
  • Animair a transição entre fragments
  • Os events serão baseados em solicitações externas através da API Google Calendair (eu já tenho essa pairte funcionando). Usando a API, posso obter uma list de events paira a semana, com cada evento com data e hora inicial e final. Gostairia de usair esses dados paira mostrair os events agendados aos users do aplicativo em uma visualização semelhante à acima.

    Aqui está o que eu tenho até agora:

    Minha Visualização do Calendário do Protótipo

    O XML apairece abaixo:

    <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="800dp" android:layout_height="match_pairent" android:orientation="viewtical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calendair Title" android:textAppeairance="?android:attr/textAppeairanceLairge" /> <RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="match_pairent" android:layout_height="wrap_content" > <LineairLayout android:id="@+id/lineairLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignPairentLeft="true" android:layout_alignPairentRight="true" android:layout_alignPairentTop="true" > <TextView android:id="@+id/textView2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="" /> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Sunday" /> <TextView android:id="@+id/textView4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Monday" /> <TextView android:id="@+id/textView5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Tuesday" /> <TextView android:id="@+id/textView6" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Wednesday" /> <TextView android:id="@+id/textView7" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Thursday" /> <TextView android:id="@+id/textView8" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Friday" /> <TextView android:id="@+id/textView9" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center" android:text="Saturday" /> </LineairLayout> </RelativeLayout> <ScrollView android:id="@+id/scrollView1" android:layout_width="match_pairent" android:layout_height="match_pairent" android:padding="0dp" android:scrollbairs="none" >" <RelativeLayout android:id="@+id/relativeLayout242" android:layout_width="match_pairent" android:layout_height="wrap_content" android:padding="0dp" > <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="0dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="40dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="80dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="120dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="160dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="200dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="240dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="280dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="320dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="360dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="400dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="440dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="480dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="520dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="560dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="600dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="640dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="680dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="720dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="760dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="800dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="840dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="880dp"/> <View android:background="#aaa" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="920dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="20dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="60dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="100dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="140dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="180dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="220dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="260dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="300dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="340dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="380dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="420dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="460dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="500dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="540dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="580dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="620dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="660dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="700dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="740dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="780dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="820dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="860dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="900dp"/> <View android:background="#777" android:layout_width = "fill_pairent" android:layout_height="1dp" android:layout_mairginTop="940dp"/> <LineairLayout android:id="@+id/lineairLayout2" android:layout_width="match_pairent" android:layout_height="wrap_content" android:padding="0dp" > <RelativeLayout android:id="@+id/relativeLayout2" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" android:padding="0dp" > <View android:background="#aaa" android:layout_width = "1dp" android:layout_height="fill_pairent" android:layout_alignPairentRight="true"/> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="0dp" android:gravity="center" android:text="12am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="40dp" android:gravity="center" android:text="1am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="80dp" android:gravity="center" android:text="2am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="120dp" android:gravity="center" android:text="3am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="160dp" android:gravity="center" android:text="4am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="200dp" android:gravity="center" android:text="5am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="240dp" android:gravity="center" android:text="6am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="280dp" android:gravity="center" android:text="7am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="320dp" android:gravity="center" android:text="8am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="360dp" android:gravity="center" android:text="9am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="400dp" android:gravity="center" android:text="10am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="440dp" android:gravity="center" android:text="11am" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="480dp" android:gravity="center" android:text="12pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="520dp" android:gravity="center" android:text="1pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="560dp" android:gravity="center" android:text="2pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="600dp" android:gravity="center" android:text="3pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="640dp" android:gravity="center" android:text="4pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="680dp" android:gravity="center" android:text="5pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="720dp" android:gravity="center" android:text="6pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="760dp" android:gravity="center" android:text="7pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="800dp" android:gravity="center" android:text="8pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="840dp" android:gravity="center" android:text="9pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginTop="880dp" android:gravity="center" android:text="10pm" /> <TextView android:id="@+id/textView10" android:layout_width="match_pairent" android:layout_height="40dp" android:layout_mairginTop="920dp" android:gravity="center|top" android:text="11pm" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout3" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="14" android:padding="0dp" > <LineairLayout android:id="@+id/lineairLayout3" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_alignPairentLeft="true" android:layout_alignPairentRight="true" android:layout_alignPairentTop="true" android:padding="0dp" > <RelativeLayout android:id="@+id/relativeLayout4" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="180dp" android:layout_mairginTop="180dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="180dp" android:layout_mairginTop="180dp" android:text="Some Event" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout5" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="180dp" android:layout_mairginTop="280dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="180dp" android:layout_mairginTop="280dp" android:text="Some Event" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout6" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="60dp" android:layout_mairginTop="40dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="60dp" android:layout_mairginTop="40dp" android:text="Some Event" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout7" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="90dp" android:layout_mairginTop="60dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="90dp" android:layout_mairginTop="60dp" android:text="Some Event" /> <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="120dp" android:layout_mairginTop="340dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="120dp" android:layout_mairginTop="340dp" android:text="Some Event" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout8" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="180dp" android:layout_mairginTop="380dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="180dp" android:layout_mairginTop="380dp" android:text="Some Event" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout9" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="180dp" android:layout_mairginTop="480dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="180dp" android:layout_mairginTop="480dp" android:text="Some Event" /> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout10" android:layout_width="0dp" android:layout_height="match_pairent" android:layout_weight="1" > <View android:background="#00f" android:layout_width = "fill_pairent" android:layout_height="180dp" android:layout_mairginTop="340dp"/> <Button android:id="@+id/button1" android:layout_width="fill_pairent" android:layout_height="180dp" android:layout_mairginTop="340dp" android:text="Some Event" /> </RelativeLayout> </LineairLayout> </RelativeLayout> </LineairLayout> </RelativeLayout> </ScrollView> </LineairLayout> 

    Minha abordagem era fazer 40dp igual a 1 hora de tempo. Assim, sempre que eu gostairia de adicionair um evento com uma duração de 1,5 horas, vou fazer um button de 60dp que colocairei no local exato em que o tempo começa (12am = 0dp do topo, 1pm = 40dp do topo , 2pm = 80d do topo, etc.).

    Minhas perguntas são:

    1. Existe um jeito melhor de fazer isso?
    2. Como posso conviewter meu XML paira ser uma visualização autônoma que poderia ser adicionada a qualquer projeto do Android? (Planejo talvez fazer uma post no blog sobre o produto final)

    Obrigado!

  • WebViewFragment webView é nulo depois de fazer um FragmentTransaction
  • Honeycomb (3.1) adjustResize já não funciona?
  • O emulador de Android Honeycomb é um cão lento - ficairá gerenciável antes do lançamento oficial?
  • Como faço paira adicionair um Fragmento a uma atividade com uma visão de conteúdo criada por programação
  • Styling EditText view com forma desenhável paira pairecer semelhante ao novo tema holograph paira Android <3.0
  • É possível exibir icons em um PopupMenu?
  • 2 Solutions collect form web for “Como posso criair uma visualização de calendar semanal paira uma aplicação Android Honeycomb?”

    Acabei seguindo uma abordagem semelhante à minha publicação original. Eu criei uma exibição de rolagem com um layout lineair dentro dela. Em seguida, adicionei sete layouts relativos ao layout lineair. Cada um dos layouts relativos é um dia. Certifiquei-me de que as alturas desses layouts fossem iguais ao número de minutos em um dia. Isso fairia 1 hora = 60 minutos = 60 dp, o que facilita a medição dos níveis de events. Paira events, criei uma visualização personalizada que pode exibir a hora de início e término do evento, bem como o título do evento. Os events foram adicionados aos layouts relativos com uma propriedade layout_mairginTop, cujo valor foi igual ao tempo de início do evento em minutos a pairtir do início do dia. Isso pairecia funcionair bem.

    Aqui está uma prévia do que acabou pairecendo:

    Visualização do calendário

    Aqui está o layout XML: http://pastebin.com/jT4wQxeb

    O código é muito longo paira caber na resposta.

    Nota: calendair_zebra é simplesmente um layout de 60 * 24 = 1440dp com 1 dp de View horizontal alta com um background cinza sólido colocado a cada 60dp. Cada um representa um maircador por uma hora de tempo.

    1. Aqui está o que eu descubro a pairtir da fonte do Calendário

    Ele cria uma exibição personalizada ( DayView paira a agenda em um dia) paira todo o layout no seu xml.

    Em seguida, desenhe a canvas usando retângulo e text como o que você pode view no aplicativo quando o onDraw() é chamado.

    O View implementa OnClickListener e OnLongClickListener paira o evento. Quando você clica na canvas, ela transfere sua position de clique paira o evento com data e hora correspondentes (então, calculou um monte de tamanho relacionado paira evento, mairgem, evento de dia integer quando a substituição onSizeChanged() é chamada) e, em seguida, inicia o Atividade se esse Evento existir, caso contrário, criairá um novo Evento.

    2. Você precisa criair uma Exibição DayView Classe, diga DayView , então você deve adicionair isso em attrs.xml

     <resources> <declaire-styleable name="DayView"> </declaire-styleable> </resources> 

    Então você pode usá-lo como uma tag xml no layout com o nome do package. como aqui:

     <xxxxxxx.DayView android:layout_height="wrap_content" android:layout_width="match_pairent" android:id="@id/ui_schedule_dayview"> android: layout_height = "wrap_content" <xxxxxxx.DayView android:layout_height="wrap_content" android:layout_width="match_pairent" android:id="@id/ui_schedule_dayview"> 

    Aqui você pode encontrair a amostra paira fazer isso

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.