[JAVA] [Android] Créer un calendrier à l'aide de GridView

Sur iOS, il existe de nombreuses façons de créer un calendrier à l'aide de UICollectionView, mais sur Android, il n'y a pas beaucoup de façons de créer un calendrier à l'aide de GridView, c'est donc un mémo.

Formulaire rempli

Screenshot_1518517193.png

C'est comme ça.

Créons-les dans l'ordre.

Définir les ressources de couleur

Définissez simplement les couleurs à utiliser en xml. Surtout le calendrier et GridView ne sont pas liés ...;

colors.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="grayColor">#777</color>
    <color name="blueColor">#00F</color>
    <color name="redColor">#F00</color>
    <color name="whiteColor">#FFF</color>
    <color name="blackColor">#000</color>
</resources>

Décrivez la disposition de l'activité principale

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/grayColor"
    tools:context="jp.co.apps.workout.calendarsample.MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:background="@color/whiteColor">

        <TextView
            android:id="@+id/titleText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="2018.2"
            android:textSize="20sp"
            android:layout_centerInParent="true"/>

        <Button
            android:id="@+id/prevButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Prev"
            android:layout_alignParentLeft="true"
            android:layout_marginVertical="10dp"
            android:layout_marginLeft="10dp"
            android:background="@color/colorAccent"/>

        <Button
            android:id="@+id/nextButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Next"
            android:layout_alignParentRight="true"
            android:layout_marginVertical="10dp"
            android:layout_marginRight="10dp"
            android:background="@color/colorAccent"/>
    </RelativeLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginVertical="1dp">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginHorizontal="1dp"
            android:textAlignment="center"
            android:text="journée"
            android:background="@color/whiteColor"
            android:textColor="@color/redColor"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginRight="1dp"
            android:layout_weight="1"
            android:background="@color/whiteColor"
            android:text="Mois"
            android:textColor="@color/blackColor"
            android:textAlignment="center"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginRight="1dp"
            android:textAlignment="center"
            android:text="Feu"
            android:textColor="@color/blackColor"
            android:background="@color/whiteColor"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginRight="1dp"
            android:textAlignment="center"
            android:text="eau"
            android:textColor="@color/blackColor"
            android:background="@color/whiteColor"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginRight="1dp"
            android:textAlignment="center"
            android:text="bois"
            android:textColor="@color/blackColor"
            android:background="@color/whiteColor"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginRight="1dp"
            android:textAlignment="center"
            android:text="Argent"
            android:textColor="@color/blackColor"
            android:background="@color/whiteColor"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginRight="1dp"
            android:textAlignment="center"
            android:text="sol"
            android:textColor="@color/blueColor"
            android:background="@color/whiteColor"/>

    </LinearLayout>

    <GridView
        android:id="@+id/calendarGridView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="15"
        android:horizontalSpacing="1dp"
        android:layout_marginLeft="1dp"
        android:numColumns="7"
        android:stretchMode="columnWidth"
        android:verticalSpacing="1dp"></GridView>

</LinearLayout>

Il est difficile de dessiner une bordure, je vais donc colorer l'arrière-plan et dessiner une bordure avec une marge.

Créer un fichier de disposition de cellule de vue grille

Étant donné que seule la date est affichée cette fois, il n'est peut-être pas nécessaire de créer une cellule personnalisée, mais je la créerai pour une extension future.

calendar_cell.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <TextView
        android:id="@+id/dateText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"/>
    
    <!--Extensible ici-->

</RelativeLayout>

Créer une classe DateManager

Puisque le calendrier manipule souvent les dates, créez une classe dédiée.

DateManager.java


package jp.co.apps.workout.calendarsample;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;


public class DateManager {
    Calendar mCalendar;

    public DateManager(){
        mCalendar = Calendar.getInstance();
    }

    //Obtenez les éléments du mois
    public List<Date> getDays(){
        //Garder l'état actuel
        Date startDate = mCalendar.getTime();

        //Calculer le nombre total de cellules affichées dans GridView
        int count = getWeeks() * 7 ;
        
        //Calculer le nombre de jours du mois précédent affiché sur le calendrier du mois en cours
        mCalendar.set(Calendar.DATE, 1);
        int dayOfWeek = mCalendar.get(Calendar.DAY_OF_WEEK) - 1;
        mCalendar.add(Calendar.DATE, -dayOfWeek);

        List<Date> days = new ArrayList<>();
        
        for (int i = 0; i < count; i ++){
            days.add(mCalendar.getTime());
            mCalendar.add(Calendar.DATE, 1);
        }
        
        //Restaurer l'état
        mCalendar.setTime(startDate);
        
        return days;
    }

    //Vérifiez si c'est ce mois-ci
    public boolean isCurrentMonth(Date date){
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM", Locale.US);
        String currentMonth = format.format(mCalendar.getTime());
        if (currentMonth.equals(format.format(date))){
            return true;
        }else {
            return false;
        }
    }

    //Obtenez le nombre de semaines
    public int getWeeks(){
        return mCalendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
    }

    //Obtenez la journée
    public int getDayOfWeek(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_WEEK);
    }

    //Au mois suivant
    public void nextMonth(){
        mCalendar.add(Calendar.MONTH, 1);
    }

    //Au mois précédent
    public void prevMonth(){
        mCalendar.add(Calendar.MONTH, -1);
    }
}

Créer une classe Adapter à définir dans GridView

Cette fois, j'ai également défini une méthode pour changer le mois dans la classe adaptateur, et je la porte un peu sur le côté. Veuillez pardonner. .. ..

CalendarAdapter.java


package jp.co.apps.workout.calendarsample;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class CalendarAdapter extends BaseAdapter {
    private List<Date> dateArray = new ArrayList();
    private Context mContext;
    private DateManager mDateManager;
    private LayoutInflater mLayoutInflater;

    //Après avoir développé la cellule personnalisée, définissez Wiget ici
    private static class ViewHolder {
        public TextView dateText;
    }

    public CalendarAdapter(Context context){
        mContext = context;
        mLayoutInflater = LayoutInflater.from(mContext);
        mDateManager = new DateManager();
        dateArray = mDateManager.getDays();
    }

    @Override
    public int getCount() {
        return dateArray.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.calendar_cell, null);
            holder = new ViewHolder();
            holder.dateText = convertView.findViewById(R.id.dateText);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        //Spécifiez la taille de la cellule
        float dp = mContext.getResources().getDisplayMetrics().density;
        AbsListView.LayoutParams params = new AbsListView.LayoutParams(parent.getWidth()/7 - (int)dp, (parent.getHeight() - (int)dp * mDateManager.getWeeks() ) / mDateManager.getWeeks());
        convertView.setLayoutParams(params);

        //Afficher uniquement la date
        SimpleDateFormat dateFormat = new SimpleDateFormat("d", Locale.US);
        holder.dateText.setText(dateFormat.format(dateArray.get(position)));

        //Grisé les cellules autres que ce mois-ci
        if (mDateManager.isCurrentMonth(dateArray.get(position))){
            convertView.setBackgroundColor(Color.WHITE);
        }else {
            convertView.setBackgroundColor(Color.LTGRAY);
        }

        //Dimanche au rouge, samedi au bleu
        int colorId;
        switch (mDateManager.getDayOfWeek(dateArray.get(position))){
            case 1:
                colorId = Color.RED;
                break;
            case 7:
                colorId = Color.BLUE;
                break;

            default:
                colorId = Color.BLACK;
                break;
        }
        holder.dateText.setTextColor(colorId);
        
        return convertView;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
    
    @Override
    public Object getItem(int position) {
        return null;
    }

    //Obtenez le mois d'affichage
    public String getTitle(){
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM", Locale.US);
        return format.format(mDateManager.mCalendar.getTime());
    }

    //Affichage du mois prochain
    public void nextMonth(){
        mDateManager.nextMonth();
        dateArray = mDateManager.getDays();
        this.notifyDataSetChanged();
    }

    //Affichage du mois précédent
    public void prevMonth(){
        mDateManager.prevMonth();
        dateArray = mDateManager.getDays();
        this.notifyDataSetChanged();
    }
}

Décrivez l'activité principale

MainActivity.java


package jp.co.apps.workout.calendarsample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.GridView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView titleText;
    private Button prevButton, nextButton;
    private CalendarAdapter mCalendarAdapter;
    private GridView calendarGridView;

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

        titleText = findViewById(R.id.titleText);
        prevButton = findViewById(R.id.prevButton);
        prevButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCalendarAdapter.prevMonth();
                titleText.setText(mCalendarAdapter.getTitle());
            }
        });
        nextButton = findViewById(R.id.nextButton);
        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCalendarAdapter.nextMonth();
                titleText.setText(mCalendarAdapter.getTitle());
            }
        });
        calendarGridView = findViewById(R.id.calendarGridView);
        mCalendarAdapter = new CalendarAdapter(this);
        calendarGridView.setAdapter(mCalendarAdapter);
        titleText.setText(mCalendarAdapter.getTitle());
    }

}

Cela fonctionne complètement. Si vous souhaitez opérer lorsqu'un calendrier est sélectionné, définissez setOnItemClickListener dans GridView et enchevêtrer autour de getItem et de getItemId de CalendarAdapter.

En fait, il serait préférable de créer un DateManager avec MainActivity et de le transmettre à l'adaptateur, mais cette fois c'est le cas. .. ..

Recommended Posts

[Android] Créer un calendrier à l'aide de GridView
[Android] Créer un menu coulissant sans utiliser la vue de navigation
Créer un calendrier avec Ruby
Créer une loterie avec Ruby
Créer un projet Jetty à l'aide d'Eclipse
Créer un projet Tomcat à l'aide d'Eclipse
Créer un projet Java à l'aide d'Eclipse
Créer une fonction de filtrage en utilisant actes-as-taggable-on
[Kotlin / Android] Créer une vue personnalisée
Créez rapidement un environnement Web à l'aide de Docker
Créer un service d'API RESTful à l'aide de Grape
Créez une fonction de connexion à l'aide de l'option Swift
Créez instantanément un environnement Privoxy + Tor à l'aide de Docker
[Android] Créez une nouvelle classe en héritant d'ImageView
Créons une API REST à l'aide de WildFly Swarm.
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Créez un environnement de développement Java à l'aide de jenv sur votre Mac
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
[Java] Créer un filtre
Un mémorandum lors de la tentative de création d'une interface graphique à l'aide de JavaFX
Créez un écran d'authentification de connexion à l'aide de la fonction de session
Création d'un calendrier hebdomadaire 2021 (recharge pour notebook système) avec Ruby
Comment créer un formulaire pour sélectionner une date dans le calendrier
[Débutant] Application Android qui fait rouler des balles à l'aide de capteurs [Java]
Créer un projet Tomcat en utilisant Eclipse Pleiades All in One
Création d'un MOB à l'aide du plug-in Minecraft Java Mythicmobs | Préparation 1
Créer une méthode java [Memo] [java11]
[Java] Créer un fichier temporaire
Créez un plugin VSCode.
Créez un terrain de jeu avec Xcode 12
Faire un diamant en utilisant Java
Comment créer une méthode
Créez un classement temporel clair avec la base de données en temps réel de Firebase (application Android)
Comment créer un fichier jar et un fichier war à l'aide de la commande jar
J'ai essayé de créer une application cartographique simple dans Android Studio
Créez une application mémo avec Tomcat + JSP + Servlet + MySQL à l'aide d'Eclipse
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
Créez un fichier statique qui développe les variables à l'aide de la classe ERB
[Procédure d'implémentation] Créer une fonction d'authentification utilisateur à l'aide de sorcellerie dans Rails
[Android] Créez une vue carrée tout en conservant les proportions: SquareLayout
Un moyen simple de créer une classe de mappage lors de l'utilisation de l'API
Créez un calendrier à partir de la classe Calendar en spécifiant l'année et le mois