Time Relative

Time relative ini maksudnya adalah membuat waktu yang ditampilkan dalam aplikasi relative terharap waktu yang diinginkan. Misal status pada facebook, jika anda mem-posting sebuah status pukul 19:00, lalu ada pembaca membaca status anda pada pukul 19:01, maka waktu yang dilihat oleh pembaca tersebut adalah 1 min ago.

Cara untuk membuat time relative ini tidak memerlukan library tambahan. Cukup menggunakan beberapa Class yang telah disediakan oleh Android dan Java, dan kita pun sudah dapat membuatnya.

Untuk mempraktekannya, kita butuh sebuah activity dengan tampilan sebagai berikut:

Time Relative 1

Dibagian atas kiri, adalah sebuah TextView yang digunakan untuk menunjukkan waktu acuan. Kemudian terdapat 3 radio button, itu digunakan untuk seberapa detail relative time yang akan dimunculkan. Maksudnya, jika Second dicek, misal ada perubahan 5 second dari waktu acuan, makan akan ditampilkan 5 seconds ago, namun jika yang dicek adalah radio button Minute maka dengan perumpamaan yang sama, waktu relative yang akan ditampilkan adalah 0 minute ago, kurang lebih seperti itu.

 

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/actual_time"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:text="Actual Time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

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


    <RadioGroup
        android:layout_margin="16dp"
        android:layout_below="@+id/relative_time"
        android:layout_centerInParent="true"
        android:id="@+id/radio_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hour"
            android:id="@+id/radio_hour"/>

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Minute"
            android:id="@+id/radio_minute"/>

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Second"
            android:id="@+id/radio_second"/>
    </RadioGroup>

    <Button
        android:layout_centerInParent="true"
        android:layout_below="@+id/radio_container"
        android:id="@+id/refresh"
        android:text="refresh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>

 

MainActivity.java
package com.andevindo.timerelative;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.format.DateUtils;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private TextView mActual, mRelative;
    private RadioButton mHour, mMinute, mSecond;
    private RadioGroup mContainer;
    private Button mRefresh;
    private int mRadioId;
    //Format waktu yang ditampilkan
    private static final String sDateFormat = "kk:mm:ss dd-MMMM-yyyy";

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

        mActual = (TextView)findViewById(R.id.actual_time);
        mRelative = (TextView)findViewById(R.id.relative_time);
        mHour = (RadioButton)findViewById(R.id.radio_hour);
        mMinute = (RadioButton)findViewById(R.id.radio_minute);
        mSecond = (RadioButton)findViewById(R.id.radio_second);
        mSecond.setChecked(true);
        mContainer = (RadioGroup)findViewById(R.id.radio_container);
        mRefresh = (Button)findViewById(R.id.refresh);

        //Menyimpan id dari radio button ke dalam variable mRadioId setiap ada perubahan status radio button
        mContainer.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                mRadioId = checkedId;
            }
        });

        //Membarikan waktu awal sebagai acuan
        mActual.setText(getCurrentTime());

        //Untuk refresh waktu relative
        mRefresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRelative.setText(getRelativeTime());
            }
        });


    }

    //Mendapatkan waktu saat itu juga dan mengembalikannya dalam format string
    String getCurrentTime(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sDateFormat);
        return simpleDateFormat.format(new Date());
    }

    //Merubah waktu menjadi satuan mili
    long convertDateToMillis(String srcDate){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sDateFormat);
        try {
            Date date = simpleDateFormat.parse(srcDate);
            return date.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

    //Untuk mendapatkan DateUtils dari id radio
    long getType(int radioId){
        if(radioId==R.id.radio_hour)
            return DateUtils.HOUR_IN_MILLIS;
        else if(radioId==R.id.radio_minute)
            return DateUtils.MINUTE_IN_MILLIS;
        else
            return DateUtils.SECOND_IN_MILLIS;
    }

    //Mendapatkan waktu relative
    String getRelativeTime(){
        long dateInLong = convertDateToMillis(mActual.getText().toString());
        if(dateInLong==0){
            return "Format not accepted";
        }else{
            String relativeTime = (String) DateUtils.getRelativeTimeSpanString(dateInLong,
                    System.currentTimeMillis(), getType(mRadioId));
            return relativeTime;
        }
    }


}

Didalam class diatas, terdapat beberapa method tambahan seperti getCurrentTime(), itu digunakan untuk mendapatkan waktu ketika program dijalankan, dan mengembalikan nilainya ke dalam format String. Waktu yang ditampilkan dilayar, sebenarnya sudah diformat juga pattern-nya. Saya gunakan seperti dibawah:

private static final String sDateFormat = "kk:mm:ss dd-MMMM-yyyy";
  • kk adalah¬†simbol untuk jam dalam 24 jam (1-24), misal 12, 15, 24
  • mm adalah simbol untuk menit dalam jam, misal 1, 2, 59
  • ss adalah simbol untuk detik dalam menit
  • dd adalah simbol untuk hari dalam bulan tapi berupa angka, misal 02, 20, 30
  • MMMM adalah simbol untuk bulan dalam tahun berupa text, misal January, October, May
  • yyyy adalah simbol untuk tahun dalam bentuk angka, 1999, 2000, 2015

Simbol-simbol lainnya dapat dilihat di http://developer.android.com/reference/java/text/SimpleDateFormat.html

Screenshot aplikasi:

device-2015-10-27-112400 device-2015-10-27-112457