Thursday, December 19, 2019

Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2

Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2

Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2
Aplikasi Pencarian Tempat Terdekat dengan Google Maps
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2 menggunakan Android Studio. Mungkin sudah ada beberapa yang membagikan tutorial serupa, tetapi hanya untuk pencarian Masjid (Masjid Detector) atau pencarian Rumah Sakit saja. Tapi untuk yang saya buat kali ini ada 10 Tempat yang bisa kalian temukan dalam radius 5KM (5 Kilometer). Selain itu, lokasi yang muncul bisa kalian klik dan arahkan ke aplikasi Google Maps.

Sebelum memulai ke langkah-langkah untuk membuat aplikasi ini, ada baiknya kalian buat terlebih dahulu API KEY pada Google Cloud Platform. Login dengan akun Google kalian lalu buka menu Console, pilih API & Layanan. Setelah itu kalian pilih menu AKTIFKAN API DAN LAYANAN. Kemudian aktifkan API KEY Maps dan Place.
Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2
Google Cloud Platform
Jika kalian ingin SOURCE CODE sample aplikasi ini, silahkan download di GITHUB saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai.

Untuk kalian yang ingin mencoba membuat aplikasi ini dengan tutorial versi video, berikut saya berikan Videonya:

Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :

1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 21 ya.

2. Tambahkan library Google Play Service di build.gradle :


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
}

3. Ubah MainActivity.java dan activity_main.xml menjadi seperti ini :


package com.azhar.mapdirection;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ProgressBar;
import android.widget.Spinner;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity implements LocationListener {

    GoogleMap mGoogleMap;
    ProgressBar pbMap;
    Spinner spWisata;
    String [] sWisata = {"mosque", "restaurant", "atm", "bank", "school"
            , "hospital", "laundry", "university", "post_office", "police"};
    String xWisata;

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

        spWisata.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView parent, View view, int pos, long id) {
                Object itemDB = parent.getItemAtPosition(pos);
                xWisata = itemDB.toString();
                SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fMap);
                fragment.getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap googleMap) {
                        mGoogleMap = googleMap;
                        initMap();
                    }
                });
                startProg();
            }

            public void onNothingSelected(AdapterView parent) { }
        });
    }

    private void setID(){
        pbMap = findViewById(R.id.pbMap);
        spWisata = findViewById(R.id.spWisata);
        ArrayAdapter adpWisata = new ArrayAdapter(this, android.R.layout.simple_spinner_item, sWisata);
        adpWisata.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spWisata.setAdapter(adpWisata);
    }

    private void stopProg() {
        pbMap.setVisibility(View.GONE);
    }

    private void startProg() {
        pbMap.setVisibility(View.VISIBLE);
    }

    private void initMap() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 115);
            return;
        }

        if (mGoogleMap != null) {
            startProg();
            mGoogleMap.setMyLocationEnabled(true);

            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            String provider = locationManager.getBestProvider(criteria, true);
            Location location = locationManager.getLastKnownLocation(provider);

            if (location != null) {
                onLocationChanged(location);
            } else
                stopProg();
            locationManager.requestLocationUpdates(provider, 20000, 0, this);
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        double mLatitude = location.getLatitude();
        double mLongitude = location.getLongitude();
        LatLng latLng = new LatLng(mLatitude, mLongitude);
        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12));

        String sb = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?" +
                "location=" + mLatitude + "," + mLongitude +
                "&radius=20000" +
                "&types=" + xWisata +
                "&key=" + getResources().getString(R.string.google_maps_key);
        new MainActivity.PlacesTask().execute(sb);
        stopProg();
    }

    @SuppressLint("StaticFieldLeak")
    private class PlacesTask extends AsyncTask {
        @Override
        protected String doInBackground(String... url) {
            String data = null;
            try {
                data = downloadUrl(url[0]);
            } catch (Exception e) {
                stopProg();
                e.printStackTrace();
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            new MainActivity.ParserTask().execute(result);
        }
    }

    private String downloadUrl(String strUrl) {
        String data = "";
        InputStream iStream;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(strUrl);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();

            iStream = urlConnection.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
            StringBuilder sb = new StringBuilder();

            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();
            br.close();
            iStream.close();
            urlConnection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }

    @SuppressLint("StaticFieldLeak")
    private class ParserTask extends AsyncTask>> {
        JSONObject jObject;
        @Override
        protected List> doInBackground(String... jsonData) {
            List> places = null;
            ParserPlace parserPlace = new ParserPlace();
            try {
                jObject = new JSONObject(jsonData[0]);
                places = parserPlace.parse(jObject);
            } catch (Exception e) {
                stopProg();
                e.printStackTrace();
            }
            return places;
        }

        @Override
        protected void onPostExecute(List> list) {
            mGoogleMap.clear();
            for (int i = 0; i < list.size(); i++) {
                MarkerOptions markerOptions = new MarkerOptions();
                HashMap hmPlace = list.get(i);
                BitmapDescriptor pinDrop = BitmapDescriptorFactory.fromResource(R.drawable.ic_pin);

                double lat = Double.parseDouble(hmPlace.get("lat"));
                double lng = Double.parseDouble(hmPlace.get("lng"));
                String nama = hmPlace.get("place_name");
                String namaJln = hmPlace.get("vicinity");
                LatLng latLng = new LatLng(lat, lng);

                markerOptions.icon(pinDrop);
                markerOptions.position(latLng);
                markerOptions.title(nama + " : " + namaJln);
                mGoogleMap.addMarker(markerOptions);
            }
            stopProg();
        }
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) { }
    @Override
    public void onProviderEnabled(String s) { }
    @Override
    public void onProviderDisabled(String s) { }

}



<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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">

    <RelativeLayout
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
            android:id="@+id/fMap"
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/cvWisata"/>

        <androidx.cardview.widget.CardView
            android:id="@+id/cvWisata"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_margin="20dp">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="5dp">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="5dp"
                    android:text="Tempat Wisata"
                    android:textColor="@android:color/black"
                    android:textSize="14sp" />

                <Spinner
                    android:id="@+id/spWisata"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="10sp" />

            </LinearLayout>

        </androidx.cardview.widget.CardView>

    </RelativeLayout>


    <ProgressBar
        android:id="@+id/pbMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_centerHorizontal="true"
        android:visibility="gone"
        android:layout_gravity="center" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

3. Ubah isi Android Manifest.xml menjadi seperti ini :



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.azhar.mapdirection">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:largeHeap="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_key" />

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

    </application>

</manifest>

4. Terakhir buat ParserPlace.java untuk Generate JSON Place :


package com.azhar.mapdirection;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ParserPlace {

    public List> parse(JSONObject jObject) {

        JSONArray jPlaces = null;
        try {
            jPlaces = jObject.getJSONArray("results");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return getPlaces(jPlaces);
    }

    private List> getPlaces(JSONArray jPlaces) {
        int placesCount = jPlaces.length();
        List> placesList = new ArrayList>();
        HashMap place = null;

        for (int i = 0; i < placesCount; i++) {
            try {
                place = getPlace((JSONObject) jPlaces.get(i));
                placesList.add(place);

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

        return placesList;
    }

    private HashMap getPlace(JSONObject jPlace) {

        HashMap place = new HashMap();
        String placeName = "-NA-";
        String vicinity = "-NA-";
        String latitude = "";
        String longitude = "";

        try {
            // extract nama
            if (!jPlace.isNull("name")) {
                placeName = jPlace.getString("name");
            }

            // extract nama jalan
            if (!jPlace.isNull("vicinity")) {
                vicinity = jPlace.getString("vicinity");
            }

            latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat");
            longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng");

            place.put("place_name", placeName);
            place.put("vicinity", vicinity);
            place.put("lat", latitude);
            place.put("lng", longitude);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return place;
    }

}

5. Selesai dan kalian Run. Jika kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama.

Untuk hasilnya seperti berikut :
Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2
Aplikasi Pencarian Tempat Terdekat
Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2
Aplikasi Pencarian Tempat Terdekat
Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Aplikasi Pencarian Tempat Terdekat dengan Google Maps API V2 ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Saturday, December 14, 2019

Perbedaan ScrollView dan NestedScrollView di Android Studio

Perbedaan ScrollView dan NestedScrollView di Android Studio

Perbedaan ScrollView dan NestedScrollView
Perbedaan ScrollView dan NestedScrollView
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Bagaimana kabarnya? Semoga selalu dalam keadaan sehat ya. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Perbedaan ScrollView dan NestedScrollView di Android Studio. Walaupun dalam fungsi hampir tidak kelihatan perbedaannya, tetapi jika kalian perhatikan baik-baik perbedaan ScrollView dan NestedScrollView cukup terasa dalam aplikasi Android.

Dalam pembuatan aplikasi Android kita tidak boleh asal-asalan, harus diperhatikan dengan baik segala fungsi dari layout activity yang sudah kita buat agar jika aplikasi kita di-Instal user tidak ada kendala. Perlu kalian tahu, jika kita menggunakan CoordinatorLayout yang di dalamnya berisi CollapsingToolbarLayout maka kita direkomendasikan menggunakan NestedScrollView. Mengapa tidak ScrollView?

Menurut stackoverflow, perbedaan ScrollView dan NestedScrollView adalah:

NestedScrollView digunakan jika ada View yang harus di-Scroll (digulir) di dalam View lain yang juga harus di-Scroll. NestedScrollView compatible dengan CoordinatorLayout. Perbedaan mendasar bisa dilihat dari hal di atas, tapi secara behaviour pun, ternyata ScrollView dan NestedScrollView punya sifatnya masing-masing. Saya tidak bisa klasifikasikan ini sebagai kelebihan atau kekurangan, jadi kalian bisa nilai sendiri saat menggunakan keduanya.

Untuk ScrollView, ScrollView akan nge-Scroll balik ke fokus EditText yang sedang aktif. Mungkin kalian bingung, jadi di sini akan saya perlihatkan gambarannya:
Perbedaan ScrollView dan NestedScrollView
ScrollView
Kalau kalian lihat gambar di atas, kalian mungkin bisa tahu kalau setiap kali Button di klik, maka layar kembali ke-Scroll ke atas. Ini terjadi karena ada EditText yang sedang dalam kondisi “focus” (bisa dilihat dari cursor yang berkedip). ScrollView punya kecenderungan untuk menampilkan EditText yang sedang fokus itu.

Kalau EditText lagi fokus di dekat Button, mungkin tidak akan kelihatan pengaruhnya di layar. Tapi kalau sudah pakai contoh kasus seperti di atas, EditText di paling atas layar sedangkan Button di paling bawah, ini akan membuat user bingung nantinya.

Hal ini tidak akan terjadi kalau kalian pakai NestedScrollView. Untuk mengatasi masalah di atas dari ScrollView, kalian perlu menambahkan koding untuk menambahkan fokus langsung di ScrollView-nya. Caranya:


ScrollView view = (ScrollView)findViewById(R.id.scrollView);
view.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
view.setFocusable(true);
view.setFocusableInTouchMode(true);
view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.requestFocusFromTouch();
        return false;
    }
});

Sekarang, sebaliknya. Berdasarkan sifatnya, NestedScrollView tidak akan bisa digulir kalau keyboard lagi dalam mode open (sedang dibuka). Kalian lihat kondisinya dari gambar di bawah ini:
Perbedaan ScrollView dan NestedScrollView
NestedScrollView
Kondisi di atas merupakan kondisi normal dari ScrollView. Saat waktu keyboard lagi dalam kondisi terbuka, layar bisa di-Scroll. Tetapi, kondisi di atas tidak akan bisa kalian temui di NestedScrollView. Bisa kalian coba. Saat keyboard menutupi layar, kalian cuma bisa nge-Scroll layarnya sampai jarak tertentu yang sudah kamu atur witdh dan height-nya. Jadi intinya, kalau dari awal layarnya memang sudah tampil sepenuhnya di layar, layar tidak akan nge-Scroll. Walaupun ada View yang ke tutup keyboard. Solusi dari hal ini adalah tambahkan android:windowSoftInputMode="adjustResize" di AndroidManifest.xml kalian.


<activity android:name=".activities.MainActivity" android:windowsoftinputmode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN">

        <category android:name="android.intent.category.LAUNCHER">
    </category></action></intent-filter>
</activity>

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Perbedaan ScrollView dan NestedScrollView ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Sunday, December 1, 2019

Tutorial Membuat Tampilan Aplikasi E-Commerce dengan Android Studio

Tutorial Membuat Tampilan Aplikasi E-Commerce dengan Android Studio

Tutorial Membuat Tampilan Aplikasi E-Commerce dengan Android Studio
Tutorial Membuat Tampilan Aplikasi E-Commerce
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Bagaimana kabarnya? Semoga selalu dalam keadaan sehat ya. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Tampilan Aplikasi E-Commerce dengan Android Studio. Ini hanya sebagai template saja, untuk fungsi klik dari item yang tersedia di dalamnya belum ada. Jadi, silahkan kalian kembangkan lagi ya😁

Data-data yang saya tampilkan itu dari aplikasi Bukalapak berupa file JSON. File JSON tersebut berisi semua gambar-gambar yang akan ditampilkan di menu utama. Untuk Image Slider-nya saya ambil dari aplikasi Lazada. Jika kalian ingin langsung mengunduh Source Code-nya, silahkan langsung ke link Github saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai.

Untuk kalian yang ingin melihat hasil aplikasinya, berikut saya berikan Videonya:

Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :

1. Tambahkan beberapa Library pada build.gradle :


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    implementation 'com.github.smarteist:autoimageslider:1.3.2'
    implementation 'com.github.bumptech.glide:glide:4.10.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
}

2. Untuk Source Java-nya, kalian bisa lihat dibawah ini :

MainActivity.java
Sebagai Source yang memanggil semua Class untuk menampilkan data di menu utama. Coding-nya DISINI.

ItemGridAdapter.java
Sebagai adapter untuk menampilkan data dengan tampilan Grid. Coding-nya DISINI.

ProductAdapter.java
Sebagai adapter yang berisi semua produk yang ingin ditampilkan. Coding-nya DISINI.

SliderImageAdapter.java
Sebagai adapter pada Image Slider. Coding-nya DISINI.

CategoryModel.java
Sebagai model untuk menampilkan kategori yang tersedia. Coding-nya DISINI.

ProductModel.java
Sebagai model untuk menampilkan produk dari file JSON. Coding-nya DISINI.

Constant.java
Sebagai Class yang berisi kategori dan data yang akan dipanggil. Coding-nya DISINI.

3. Berikutnya adalah Source XML-nya, kalian bisa lihat dibawah ini :

activity_main.xml
Sebagai layout untuk menampilkan data di menu utama. Coding-nya DISINI.

content_main.xml
Sebagai layout yang include ke dalam activity_main.xml untuk menampilkan data. Coding-nya DISINI.

image_slider_myshop.xml
Sebagai layout yang menampilkan Image Slider. Coding-nya DISINI.

item_card.xml
Sebagai layout yang menampilkan data dalam bentuk List. Coding-nya DISINI.

item_grid.xml
Sebagai layout yang menampilkan data dalam bentuk Grid. Coding-nya DISINI.

item_product.xml
Sebagai layout yang menampilkan data produk dari adapter. Coding-nya DISINI.

main_header.xml
Sebagai layout yang include ke dalam activity_main.xml untuk menampilkan toolbar.xml dan Image Slider. Coding-nya DISINI.

main_image_slider.xml
Sebagai sama seperti image_slider_myshop.xml, layout ini menampilkan Image Slider. Coding-nya DISINI.

navigation_bar.xml
Sebagai layout yang berfungsi untuk membuat Tab yang berisi beberapa menu. Coding-nya DISINI.

product_horizontal.xml
Sebagai layout yang menampilkan data produk yang bisa di geser secara horizontal. Coding-nya DISINI.

toolbar.xml
Sebagai layout yang berfungsi untuk menampilkan Search dan menu Shop. Coding-nya DISINI.

4. Jika semua sudah selesai, kalian Run. Jika kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Tampilan Aplikasi E-Commerce dengan Android Studio ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Saturday, November 30, 2019

Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik?

Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik?

Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik?
Fast Android Networking vs Retrofit vs Volley
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Mana yang lebih baik antara Fast Android Networking vs Retrofit vs Volley. Karena di beberapa Grup Developer Android yang saya gabung, ketiga Library ini selalu dibanding-bandingkan mana yang lebih baik dan mana yang lebih cepat dalam proses HTTP Request dan JSON Parsing. Oke tanpa basa-basi lagi kita langsung saja bandingkan satu per satu ya😉

1. Fast Android Networking (FAN)

Library ini dibuat oleh Amit Shekhar asal India. Dalam repository di Github-nya dia mengklaim bahwa Library buatannya tersebut lebih baik dan lebih cepat daripada Retrofit, "Fast Android Networking Library is a powerful library for doing any type of networking in Android applications which is made on top of OkHttp Networking Layer". Fast Android Networking ini juga memiliki fitur diantaranya GET, POST, DELETE, HEAD, PUT, PATCH yang sama dengan Retrofit.

Tetapi kalian juga bisa menambahkan Priority untuk proses HTTP Request dan JSON Parsing yaitu LOW, MEDIUM, HIGH, IMMEDIATE yang mirip dengan Volley. Jadi ibaratnya Fast Android Networking ini adalah gabungan antara Retrofit dan Volley. Saya sudah mencobanya dan hasilnya memang cukup baik dalam melakukan HTTP Request dan JSON Parsing. Sampai saat ini, saya masih setia menggunakan Library Fast Android Networking ini😁
Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik?
Fast Android Networking
Jika ingin menggunakan Library ini, kalian cukup menambahkan implementation 'com.amitshekhar.android:android-networking:1.0.2' pada build.gradle Android Studio kalian. Untuk Method-nya sebagai berikut :


AndroidNetworking.get(URL)
                 .addPathParameter("pageNumber", "0")
                 .addQueryParameter("limit", "3")
                 .addHeaders("token", "1234")
                 .setTag("test")
                 .setPriority(Priority.LOW)
                 .build()
                 .getAsJSONArray(new JSONArrayRequestListener() {
                    @Override
                    public void onResponse(JSONArray response) {
                      // do anything with response
                    }
                    @Override
                    public void onError(ANError error) {
                      // handle error
                    }
                });  



AndroidNetworking.post(URL)
                 .addBodyParameter("firstname", "Amit")
                 .addBodyParameter("lastname", "Shekhar")
                 .setTag("test")
                 .setPriority(Priority.MEDIUM)
                 .build()
                 .getAsJSONObject(new JSONObjectRequestListener() {
                    @Override
                    public void onResponse(JSONObject response) {
                      // do anything with response
                    }
                    @Override
                    public void onError(ANError error) {
                      // handle error
                    }
                });



AndroidNetworking.download(URL,dirPath,fileName)
                 .setTag("downloadTest")
                 .setPriority(Priority.MEDIUM)
                 .build()
                 .setDownloadProgressListener(new DownloadProgressListener() {
                    @Override
                    public void onProgress(long bytesDownloaded, long totalBytes) {
                      // do anything with progress  
                    }
                 })
                 .startDownload(new DownloadListener() {
                    @Override
                    public void onDownloadComplete() {
                      // do anything after completion
                    }
                    @Override
                    public void onError(ANError error) {
                      // handle error    
                    }
                }); 



AndroidNetworking.upload(URL)
                 .addMultipartFile("image",file)    
                 .addMultipartParameter("key","value")
                 .setTag("uploadTest")
                 .setPriority(Priority.HIGH)
                 .build()
                 .setUploadProgressListener(new UploadProgressListener() {
                    @Override
                    public void onProgress(long bytesUploaded, long totalBytes) {
                      // do anything with progress 
                    }
                 })
                 .getAsJSONObject(new JSONObjectRequestListener() {
                    @Override
                    public void onResponse(JSONObject response) {
                      // do anything with response                
                    }
                    @Override
                    public void onError(ANError error) {
                      // handle error 
                    }
                 }); 

2. Retrofit

Retrofit ini merupakan Library turunan dari OkHTTP yang dibuat oleh Square yang digunakan sebagai REST Client pada Android, yang pasti akan memudahkan kita. Karena kita tidak perlu lagi untuk membuat Method sendiri untuk menggunakan REST Client API dari Backend. Library ini menyediakan framework yang powerfull untuk authenticating dan berinteraksi dengan API dengan mengirimkan request menggunakan OkHTTP. Library Retrofit ini juga banyak digunakan oleh perusahaan-perusahaan Startup dalam aplikasi Mobile-nya, salah satunya Tokopedia dan OVO. Tidak hanya itu, aplikasi Sosmed yang kita gunakan sehari-hari juga menggunakan Library Retrofit.
Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik?
Retrofit
Jika ingin menggunakan Library ini, kalian cukup menambahkan implementation 'com.squareup.retrofit2:retrofit:2.6.2' pada build.gradle Android Studio kalian. Untuk menggunakan Methodnya, silahkan cek DISINI.

3. Volley

Volley adalah library HTTP yang mempermudah dan yang terpenting mempercepat networking untuk aplikasi Android. Tetapi Library buatan Google ini kurang populer dibanding kedua Library sebelumnya, karena fitur yang dimilikinya pun sedikit. Secara default, Volley menggunakan metode sinkronisasi. Jadi kalian tidak perlu membuat sebuah Method atau fungsi yang menggunakan Class Asynctask. Dalam penggunaannya memang 'sedikit' sulit. Volley tidak cocok untuk operasi download atau streaming yang besar karena Volley menyimpan semua respons dalam memori selama mengambil data API.
Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik?
Volley
Jika ingin menggunakan Library ini, kalian cukup menambahkan implementation 'com.android.volley:volley:1.1.1' pada build.gradle Android Studio kalian. Untuk menggunakan Methodnya, silahkan cek DISINI.

Sudah jelas belum pembahasan perbedaan ketiga Library antara Fast Android Networking, Retrofit dan Volley? Kalau masih kurang jelas silahkan berikan pertanyaan kalian di kolom komentar ya. Saya sendiri lebih 'prefer' Fast Android Networking, karena dalam menggunakannya sangat mudah dan cocok untuk pemula. Jika kalian menggunakan Retrofit atau Volley itu selera ya. Semua sama, yang penting kalian paham dalam penggunannya.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Fast Android Networking vs Retrofit vs Volley, Mana yang lebih baik? ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Thursday, November 7, 2019

Tutorial Membuat Tabel dengan RecyclerView | Android Studio

Tutorial Membuat Tabel dengan RecyclerView | Android Studio

Tutorial Membuat Tabel dengan RecyclerView | Android Studio
Membuat Tabel dengan RecyclerView
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Tabel dengan RecyclerView dengan Android Studio. Mungkin selama ini kita tahu bahwa untuk membuat Tabel di Android Studio menggunakan TableLayout dan TableRow. Tetapi, kita juga bisa membuat Tabel dengan RecyclerView. Selain itu, dengan RecyclerView kita bisa kostumisasi tampilannya agar lebih enak dilihat😄

Data dari API pun bisa kita tampilkan dalam bentuk Tabel dengan Tutorial ini. Jika kalian ingin SOURCE CODE sample aplikasi ini, silahkan download di GITHUB saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai.

Untuk kalian yang ingin mencoba membuat aplikasi ini dengan tutorial versi video, berikut saya berikan Videonya:

Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :

1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 21 ya.

2. Karena saya menggunakan AndroidX, maka ubah library di build.gradle menjadi :


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.0.0'
    //implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

3. Ubah MainActivity.java menjadi seperti ini :


package com.azhar.table.activities;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.azhar.table.R;
import com.azhar.table.adapter.TableViewAdapter;
import com.azhar.table.model.MovieModel;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Azhar Rivaldi on 03/11/2019.
 */

public class MainActivity extends AppCompatActivity {

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

        RecyclerView recyclerView = findViewById(R.id.recyclerViewDeliveryProductList);

        TableViewAdapter adapter = new TableViewAdapter(getMovieList());

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

        recyclerView.setAdapter(adapter);
    }

    private List getMovieList() {
        List movieList = new ArrayList<>();

        movieList.add(new MovieModel(1, "Pirates of the Caribbean: On Stranger Tides", 2011, 378));
        movieList.add(new MovieModel(2, "Avengers: Age of Ultron", 2015, 365));
        movieList.add(new MovieModel(3, "Avengers: Infinity War", 2018, 316));
        movieList.add(new MovieModel(4, "Pirates of the Caribbean: At World's End", 2007, 300));
        movieList.add(new MovieModel(5, "Justice League", 2017, 300));
        movieList.add(new MovieModel(6, "Solo: A Star Wars Story", 2018, 275));
        movieList.add(new MovieModel(7, "John Carter", 2012, 264));
        movieList.add(new MovieModel(8, "Batman v Superman: Dawn of Justice", 2016, 263));
        movieList.add(new MovieModel(9, "Star Wars: The Last Jedi", 2017, 263));
        movieList.add(new MovieModel(10, "Tangled", 2010, 260));

        return movieList;
    }
}

4. Ubah activity_main.xml menjadi seperti ini :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".activities.MainActivity">

    <RelativeLayout
        android:id="@+id/llViewTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp"
            android:text="Table RecyclerView"
            android:textSize="18sp" />

    </RelativeLayout>

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/llViewTitle"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerViewDeliveryProductList"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:nestedScrollingEnabled="false"
            tools:listitem="@layout/table_list_item" />

    </HorizontalScrollView>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="16dp"
        android:src="@drawable/ic_refresh" />

</RelativeLayout>

5. Buat TableViewAdapter.java :


package com.azhar.table.adapter;

import android.annotation.SuppressLint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.azhar.table.R;
import com.azhar.table.model.MovieModel;

import java.util.List;

/**
 * Created by Azhar Rivaldi on 03/11/2019.
 */

public class TableViewAdapter extends RecyclerView.Adapter {

    private List movieList;

    public TableViewAdapter(List movieList) {
        this.movieList = movieList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(R.layout.table_list_item, parent, false);

        return new RowViewHolder(itemView);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        RowViewHolder rowViewHolder = (RowViewHolder) holder;

        int rowPos = rowViewHolder.getAdapterPosition();

        if (rowPos == 0) {

            rowViewHolder.txtRank.setBackgroundResource(R.drawable.table_header_cell_bg);
            rowViewHolder.txtMovieName.setBackgroundResource(R.drawable.table_header_cell_bg);
            rowViewHolder.txtYear.setBackgroundResource(R.drawable.table_header_cell_bg);
            rowViewHolder.txtCost.setBackgroundResource(R.drawable.table_header_cell_bg);

            rowViewHolder.txtRank.setText("Rank");
            rowViewHolder.txtMovieName.setText("Name");
            rowViewHolder.txtYear.setText("Year");
            rowViewHolder.txtCost.setText("Budget");
        } else {
            MovieModel modal = movieList.get(rowPos - 1);

            rowViewHolder.txtRank.setBackgroundResource(R.drawable.table_content_cell_bg);
            rowViewHolder.txtMovieName.setBackgroundResource(R.drawable.table_content_cell_bg);
            rowViewHolder.txtYear.setBackgroundResource(R.drawable.table_content_cell_bg);
            rowViewHolder.txtCost.setBackgroundResource(R.drawable.table_content_cell_bg);

            rowViewHolder.txtRank.setText(modal.getRank() + "");
            rowViewHolder.txtMovieName.setText(modal.getMovieName());
            rowViewHolder.txtYear.setText(modal.getYear() + "");
            rowViewHolder.txtCost.setText(modal.getBudgetInMillions() + "");
        }
    }

    @Override
    public int getItemCount() {
        return movieList.size() + 1;
    }

    public class RowViewHolder extends RecyclerView.ViewHolder {
        TextView txtRank;
        TextView txtMovieName;
        TextView txtYear;
        TextView txtCost;

        RowViewHolder(View itemView) {
            super(itemView);
            txtRank = itemView.findViewById(R.id.txtRank);
            txtMovieName = itemView.findViewById(R.id.txtMovieName);
            txtYear = itemView.findViewById(R.id.txtYear);
            txtCost = itemView.findViewById(R.id.txtCost);
        }
    }
}

6. Buat table_list_item.xml untuk menampilkan isi tabel :


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

    <TextView
        android:id="@+id/txtRank"
        android:layout_width="56dp"
        android:layout_height="match_parent"
        android:layout_gravity="top"
        android:background="@drawable/table_content_cell_bg"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/txtMovieName"
        android:layout_width="260dp"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="@drawable/table_content_cell_bg"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/txtYear"
        android:layout_width="124dp"
        android:layout_height="match_parent"
        android:layout_gravity="top"
        android:background="@drawable/table_content_cell_bg"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/txtCost"
        android:layout_width="128dp"
        android:layout_height="match_parent"
        android:layout_gravity="top"
        android:background="@drawable/table_content_cell_bg"
        android:textAlignment="center"
        android:textSize="18sp" />

</LinearLayout>

7. Buat MovieModel.java Modelnya :


package com.azhar.table.model;

/**
 * Created by Azhar Rivaldi on 03/11/2019.
 */

public class MovieModel {
    private int rank;
    private String movieName;
    private int year;
    private int budgetInMillions;

    public MovieModel(int rank, String movieName, int year, int budgetInMillions) {
        this.rank = rank;
        this.movieName = movieName;
        this.year = year;
        this.budgetInMillions = budgetInMillions;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public String getMovieName() {
        return movieName;
    }

    public void setMovieName(String movieName) {
        this.movieName = movieName;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getBudgetInMillions() {
        return budgetInMillions;
    }

    public void setBudgetInMillions(int budgetInMillions) {
        this.budgetInMillions = budgetInMillions;
    }
}

8. Untuk background header dari tabelnya, kalian bisa unduh DISINI ya. Selesai dan kalian Run. Jika kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Tabel dengan RecyclerView | Android Studio ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Saturday, October 19, 2019

Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya

Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya

Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya
 Realme 5 Pro 8/128
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Solusi Mengatasi Delay Touch HP Realme 5, Realme 5 Pro, Realme 3, Realme 3 Pro dan Tipe Lainnya. Artikel ini saya buat karena banyak yang bertanya tentang masalah Delay Touch pada Realme 5 Pro. Jujur saya juga mengalaminya dan sangat sangat sangat mengganggu jika kita sedang membuka sosmed, apalagi saat bermain Game😞

Setelah saya bergabung di grup Komunitas Realme 5 | Realme 5 Pro di Facebook, ada salah satu member yang memberikan solusi untuk mengurangi Delay Touch pada Realme 5 Pro ini. Jadi, saya sangat berterima kasih (saya lupa nama orangnya) karena Delay Touch hilang dari HP Realme 5 pro yang saya gunakan. Dan mungkin solusi ini bisa kalian coba untuk mengurangi Delay Touch tersebut.

Lalu bagaimana cara mengatasi Delay Touch Realme 5 dan Realme 5 Pro ini? Berikut solusinya :
  1. Matikan Mode Pemisah Layar Aplikasi
    Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya
     Realme 5 Pro
    Langkah pertama yang saya coba adalah Matikan Mode Pemisah Layar Aplikasi. Cukup buka Pengaturan lalu ke menu Mode Pemisah Layar Aplikasi.
  2. Matikan fitur Screenshot 3 Jari
    Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya
     Realme 5 Pro
    Solusi yang kedua jika Delay Touch masih belum hilang adalah Matikan fitur Screenshot 3 Jari. Menu ini ada di Pengaturan, tepatnya di Bantuan Praktis.
  3. Reset Pabrik
    Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya
     Realme 5 Pro
    Sebenarnya jika kita baru saja beli smartphone ada baiknya kita Reset Pabrik terlebih dahulu sebelum kita gunakan. Mungkin ini bisa jad solusi yang ketiga untuk menghilangkan Delay Touch.
  4. Lepas Pelindung Layar
  5. Ada yang bilang jika pelindung bawaan yang menutup layar harus dilepas agar layar lebih responsif dan di ganti dengan TG (Tempered Glass). Tetapi menurut saya ini opsional saja. Sedangkan Delay Touch saya hilang tanpa melakukan lengkah ini. Cukup di langkah pertama dan kedua saja.
Bagaimana? Sudah Solved belum masalah Delay Touch-nya? Kalau masih belum hilang juga, coba update OS atau bawa ke Service Center terdekat ya😁

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Solusi Mengatasi Delay Touch HP Realme 5 Pro dan Tipe Lainnya ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Sunday, September 22, 2019

Tutorial Membuat Aplikasi Jadwal Sholat dengan Android Studio | Rivaldi 48

Tutorial Membuat Aplikasi Jadwal Sholat dengan Android Studio | Rivaldi 48

Tutorial Membuat Aplikasi Jadwal Sholat dengan Android Studio
Aplikasi Jadwal Sholat
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Aplikasi Jadwal Sholat dengan Android Studio. Aplikasi ini saya buat sebagai referensi teman-teman, siapa tahu membutuhkannnya untuk tugas skripsi atau yang lain. Bahasa pemrograman yang digunakan untuk sample ini adalah Kotlin. Karena saya sendiri sedang belajar Kotlin juga gan, harap maklum ya😂

Jadwal Sholat datanya saya ambi dari https://api.banghasan.com/. Disana juga ada API untuk surah-surah dan ayat-ayat Al-Qur`an loh! Jika kalian ingin SOURCE CODE sample aplikasi ini, silahkan download di GITHUB saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai. Untuk kalian yang ingin mencoba membuat aplikasi ini dengan tutorial versi video, berikut saya berikan Videonya:

Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :

1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 21 ya.

2. Ubah MainActivity.kt menjadi seperti ini :


package com.azhar.jadwalsholat

import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.azhar.jadwalsholat.networking.ClientAsyncTask
import com.azhar.jadwalsholat.networking.DaftarKota
import kotlinx.android.synthetic.main.activity_main.*
import org.json.JSONException
import org.json.JSONObject
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList

@Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
class MainActivity : AppCompatActivity() {

    private var listDaftarKota: MutableList? = null
    private var mDaftarKotaAdapter: ArrayAdapter? = null
    private var greetImg: ImageView? = null
    private var greetText: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        greetImg = findViewById(R.id.greeting_img)
        greetText = findViewById(R.id.greeting_text)

        listDaftarKota = ArrayList()
        mDaftarKotaAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, listDaftarKota)
        mDaftarKotaAdapter!!.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        kota.adapter = mDaftarKotaAdapter
        kota.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(p0: AdapterView<*>?) {

            }

            override fun onItemSelected(p0: AdapterView<*>?, view: View?, position: Int, id: Long) {

                val kota = mDaftarKotaAdapter!!.getItem(position)
                loadJadwal(kota.id)
            }

        }

        loadKota()
        greeting()
    }

    @SuppressLint("SetTextI18n")
    private fun greeting() {
        val calendar = Calendar.getInstance()
        val timeOfDay = calendar.get(Calendar.HOUR_OF_DAY)
        if (timeOfDay >= 0 && timeOfDay < 12) {
            greetText?.setText("Selamat Pagi, sudah sholat Subuh?")
            greetImg?.setImageResource(R.drawable.img_default_half_morning)
        } else if (timeOfDay >= 12 && timeOfDay < 15) {
            greetText?.setText("Selamat Siang, sudah sholat Dzuhur?")
            greetImg?.setImageResource(R.drawable.img_default_half_afternoon)
        } else if (timeOfDay >= 15 && timeOfDay < 18) {
            greetText?.setText("Selamat Sore, sudah sholat Ashar?")
            greetImg?.setImageResource(R.drawable.img_default_half_without_sun)
        } else if (timeOfDay >= 18 && timeOfDay < 24) {
            greetText?.setText("Selamat Malam, sudah sholat Maghrib?\njangan tidur dulu ya, lanjut sholat Isya")
            greetText?.setTextColor(Color.BLACK)
            greetImg?.setImageResource(R.drawable.img_default_half_night)
        }
    }

    @SuppressLint("SimpleDateFormat")
    private fun loadJadwal(id: Int?) {
        try {
            val idKota = id.toString()

            val current = SimpleDateFormat("yyyy-MM-dd")
            val tanggal = current.format(Date())

            val url = "https://api.banghasan.com/sholat/format/json/jadwal/kota/$idKota/tanggal/$tanggal"
            val task = ClientAsyncTask(this, object : ClientAsyncTask.OnPostExecuteListener {
                override fun onPostExecute(result: String) {

                    Log.d("JadwalData", result)
                    try {
                        val jsonObj = JSONObject(result)
                        val objJadwal = jsonObj.getJSONObject("jadwal")
                        val obData = objJadwal.getJSONObject("data")

                        tv_tanggal.text = obData.getString("tanggal")
                        tv_subuh.text = obData.getString("subuh")
                        tv_dzuhur.text = obData.getString("dzuhur")
                        tv_ashar.text = obData.getString("ashar")
                        tv_maghrib.text = obData.getString("maghrib")
                        tv_isya.text = obData.getString("isya")

                        Log.d("dataJadwal", obData.toString())

                    } catch (e: JSONException) {
                        e.printStackTrace()
                    }
                }

            })
            task.execute(url)
        } catch (e: Exception) {
            e.printStackTrace()
        }

    }

    private fun loadKota() {
        try {
            val url = "https://api.banghasan.com/sholat/format/json/kota"
            val task = ClientAsyncTask(this, object : ClientAsyncTask.OnPostExecuteListener {
                override fun onPostExecute(result: String) {

                    Log.d("KotaData", result)
                    try {
                        val jsonObj = JSONObject(result)
                        val jsonArray = jsonObj.getJSONArray("kota")
                        var daftarKota: DaftarKota?
                        for (i in 0 until jsonArray.length()) {
                            val obj = jsonArray.getJSONObject(i)
                            daftarKota = DaftarKota()
                            daftarKota.id = obj.getInt("id")
                            daftarKota.nama = obj.getString("nama")
                            listDaftarKota!!.add(daftarKota)
                        }
                        mDaftarKotaAdapter!!.notifyDataSetChanged()

                    } catch (e: JSONException) {
                        e.printStackTrace()
                    }
                }

            })
            task.execute(url)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

3. Ubah isi activity_main.xml menjadi seperti ini :


<?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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"
        android:orientation="vertical">

    <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_gravity="center">

        <ImageView
                android:id="@+id/greeting_img"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:scaleType="fitXY"/>

        <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">

            <androidx.cardview.widget.CardView
                    android:id="@+id/car4"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="11dp"
                    android:background="#fff"
                    app:cardCornerRadius="10dp"
                    app:cardElevation="5dp">

                <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        android:gravity="center">

                    <TextView
                            android:id="@+id/tv_tanggal"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="15dp"
                            android:layout_marginTop="5dp"
                            android:textColor="#000"
                            android:textSize="16sp"
                            android:textStyle="bold"/>

                    <LinearLayout
                            android:id="@+id/garis"
                            android:layout_width="match_parent"
                            android:layout_height="1dp"
                            android:layout_below="@id/tv_tanggal"
                            android:layout_marginTop="10dp"
                            android:background="#f0efef"
                            android:orientation="horizontal"/>

                    <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@id/garis"
                            android:layout_marginTop="10dp"
                            android:orientation="horizontal">

                        <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="70dp"
                                android:layout_marginRight="25dp"
                                android:layout_marginLeft="25dp"
                                android:background="?attr/selectableItemBackground"
                                android:gravity="center">

                            <Spinner
                                    android:id="@+id/kota"
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"/>

                        </RelativeLayout>

                    </LinearLayout>

                </RelativeLayout>

            </androidx.cardview.widget.CardView>

        </RelativeLayout>

    </RelativeLayout>

    <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical"
                android:padding="8.0dip">

            <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="center_vertical">

                <TextView
                        android:id="@+id/greeting_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:gravity="center"
                        android:textColor="#000"
                        android:textSize="15dp"
                        android:textStyle="bold"/>

                <!--<TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_below="@+id/greeting_text"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:gravity="center"
                        android:text="Jangan lupa sholat..."
                        android:textColor="#000"
                        android:textSize="10dp"/>-->

            </RelativeLayout>

            <LinearLayout android:layout_width="match_parent"
                          android:layout_height="match_parent"
                          android:gravity="center"
                          android:orientation="vertical">

                <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:clipToPadding="false"
                        android:gravity="center"
                        android:orientation="horizontal">

                    <androidx.cardview.widget.CardView
                            android:id="@+id/noWhatsapp"
                            android:layout_width="340dp"
                            android:layout_height="wrap_content"
                            android:layout_margin="10dp"
                            app:cardBackgroundColor="@android:color/holo_blue_light"
                            android:foreground="?android:attr/selectableItemBackground"
                            app:cardCornerRadius="8dp">

                        <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:gravity="center"
                                android:orientation="vertical">

                            <ImageView
                                    android:layout_width="80dp"
                                    android:layout_marginTop="5dp"
                                    android:src="@drawable/adzan"
                                    android:layout_height="80dp"/>

                            <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1dp"
                                    android:layout_margin="10dp"
                                    android:background="#fff"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:text="Waktu Adzan Subuh"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:id="@+id/tv_subuh"
                                    android:text="Subuh"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                        </LinearLayout>

                    </androidx.cardview.widget.CardView>

                </LinearLayout>

                <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:orientation="horizontal">

                    <androidx.cardview.widget.CardView
                            android:layout_width="160dp"
                            android:layout_height="170dp"
                            android:layout_margin="10dp"
                            app:cardBackgroundColor="@android:color/holo_purple"
                            android:foreground="?android:attr/selectableItemBackground"
                            app:cardCornerRadius="10dp"
                            app:cardElevation="5dp">

                        <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:gravity="center"
                                android:orientation="vertical">

                            <ImageView
                                    android:layout_width="80dp"
                                    android:src="@drawable/adzan"
                                    android:layout_height="80dp"/>

                            <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1dp"
                                    android:layout_margin="10dp"
                                    android:background="#fff"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:text="Waktu Adzan Dzuhur"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:id="@+id/tv_dzuhur"
                                    android:text="Dzuhur"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                        </LinearLayout>

                    </androidx.cardview.widget.CardView>

                    <androidx.cardview.widget.CardView
                            android:layout_width="160dp"
                            android:layout_height="170dp"
                            android:layout_margin="10dp"
                            app:cardBackgroundColor="@android:color/holo_orange_light"
                            android:foreground="?android:attr/selectableItemBackground"
                            app:cardCornerRadius="10dp"
                            app:cardElevation="5dp">

                        <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:gravity="center"
                                android:orientation="vertical">

                            <ImageView
                                    android:layout_width="80dp"
                                    android:src="@drawable/adzan"
                                    android:layout_height="80dp"/>

                            <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1dp"
                                    android:layout_margin="10dp"
                                    android:background="#fff"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:text="Waktu Adzan Ashar"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:id="@+id/tv_ashar"
                                    android:text="Ashar"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                        </LinearLayout>

                    </androidx.cardview.widget.CardView>

                </LinearLayout>

                <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:orientation="horizontal">

                    <androidx.cardview.widget.CardView
                            android:layout_width="160dp"
                            android:layout_height="170dp"
                            android:layout_margin="10dp"
                            app:cardBackgroundColor="@android:color/holo_red_light"
                            android:foreground="?android:attr/selectableItemBackground"
                            app:cardCornerRadius="10dp"
                            app:cardElevation="5dp">

                        <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:gravity="center"
                                android:orientation="vertical">

                            <ImageView
                                    android:layout_width="80dp"
                                    android:src="@drawable/adzan"
                                    android:layout_height="80dp"/>

                            <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1dp"
                                    android:layout_margin="10dp"
                                    android:background="#fff"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:text="Waktu Adzan Maghrib"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:id="@+id/tv_maghrib"
                                    android:text="Maghrib"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                        </LinearLayout>

                    </androidx.cardview.widget.CardView>

                    <androidx.cardview.widget.CardView
                            android:layout_width="160dp"
                            android:layout_height="170dp"
                            android:layout_margin="10dp"
                            app:cardBackgroundColor="@android:color/holo_green_light"
                            android:foreground="?android:attr/selectableItemBackground"
                            app:cardCornerRadius="10dp"
                            app:cardElevation="5dp">

                        <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:gravity="center"
                                android:orientation="vertical">

                            <ImageView
                                    android:layout_width="80dp"
                                    android:src="@drawable/adzan"
                                    android:layout_height="80dp"/>

                            <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1dp"
                                    android:layout_margin="10dp"
                                    android:background="#fff"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:text="Waktu Adzan Isya"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                            <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:gravity="center"
                                    android:padding="5dp"
                                    android:id="@+id/tv_isya"
                                    android:text="Isya"
                                    android:textColor="#fff"
                                    android:textStyle="bold"/>

                        </LinearLayout>

                    </androidx.cardview.widget.CardView>

                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

    </ScrollView>

</LinearLayout>

4. Buat ClientAsyncTask.kt untuk koneksi ke API :


package com.azhar.jadwalsholat.networking

import android.content.Context
import android.os.AsyncTask
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL

@Suppress("UNREACHABLE_CODE")
class ClientAsyncTask constructor(private val mContext: Context, postExecuteListener: OnPostExecuteListener) :
    AsyncTask() {
    val CONNECTON_TIMEOUT_MILLISECONDS = 60000
    private val mPostExecuteListener : OnPostExecuteListener = postExecuteListener

    interface OnPostExecuteListener {
        fun onPostExecute(result: String)
    }

    /*init {
        if (mPostExecuteListener == null)
            throw Exception("Param cannot be null.")
    }*/

    override fun onPostExecute(result: String) {
        super.onPostExecute(result)
        mPostExecuteListener.onPostExecute(result)
    }

    override fun doInBackground(vararg urls: String?): String {
        var urlConnection: HttpURLConnection? = null

        try {
            val url = URL(urls[0])

            urlConnection = url.openConnection() as HttpURLConnection
            urlConnection.connectTimeout = CONNECTON_TIMEOUT_MILLISECONDS
            urlConnection.readTimeout = CONNECTON_TIMEOUT_MILLISECONDS

            val inString = streamToString(urlConnection.inputStream)

            return inString
        } catch (ex: Exception) {

        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect()
            }
        }

        return ""
    }

    fun streamToString(inputStream: InputStream): String {

        val bufferReader = BufferedReader(InputStreamReader(inputStream))
        var line: String
        var result = ""

        try {
            do {
                line = bufferReader.readLine()
                if (line != null) {
                    result += line
                }
            } while (true)
            inputStream.close()
        } catch (ex: Exception) {

        }

        return result
    }

}

5. Buat DaftarKota.kt untuk data Spinner Kota :


package com.azhar.jadwalsholat.networking

class DaftarKota {
    var id: Int? = null
    var nama: String? = null

    override fun toString(): String {
        return nama.toString()
    }
}


6. Selesai dan kalian Run. Jika kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama. Berikut hasilnya :
Tutorial Membuat Aplikasi Jadwal Sholat dengan Android Studio
Aplikasi Jadwal Sholat
Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Aplikasi Jadwal Sholat dengan Android Studio ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_