Tutorial Membuat Aplikasi Resep Masakan dengan Android Studio

    Tutorial Membuat Aplikasi Resep Masakan dengan Android Studio
    Tutorial Membuat Aplikasi Resep Masakan
    السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُه sobat 48😁. Bagaimana kabarnya? Semoga selalu dalam keadaan sehat ya. Kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Aplikasi Resep Masakan dengan Android Studio. Tutorial ini saya buat karena saya terinspirasi dari sebuah blog yang membuat tutorial serupa.

    Aplikasi ini menggunakan Webview untuk menampilkan datanya. Sedangkan datanya berupa file Assets html. File html tersebut sudah saya modifikasi agar bisa responsif disetiap layar smartphone Android. Untuk kamu yang ingin langsung mencobanya, silahkan unduh melalui Github saya SOURCE CODE DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai.

    Tapi, jika kamu ingin mencoba tutorial aplikasi ini dengan 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. Download File Assets DISINI

    3. Ubah build.gradle menjadi seperti ini :

    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    }
    4. Ubah isi activity_main.xml, MainActivity.java dan buat grid_content.xml untuk menampilkan daftar resep makanan :

    <?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"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="220dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:elevation="0dp">

    <com.google.android.material.appbar.CollapsingToolbarLayout
    android:id="@+id/toolbar_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:contentScrim="?attr/colorPrimary"
    app:expandedTitleMarginBottom="15dp"
    app:expandedTitleMarginStart="10dp"
    app:layout_scrollFlags="scroll|exitUntilCollapsed">

    <ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/background_header"
    app:layout_collapseMode="parallax" />

    <androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:fitsSystemWindows="true"
    app:layout_collapseMode="pin"
    app:layout_scrollFlags="scroll|enterAlways"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:title="@string/app_name" />

    </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/grid_content" />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    package com.azhar.resepmasakan.activities;

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

    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;

    import com.azhar.resepmasakan.adapter.DataAdapter;
    import com.azhar.resepmasakan.model.DataModel;
    import com.azhar.resepmasakan.R;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {

    public DataAdapter dataAdapter;
    public RecyclerView recyclerView;
    public ArrayList dataModelArrayList = new ArrayList();

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

    //membuat data yang akan ditampilkan dalam list
    //file .html mengambil di folder assets
    inputData("Ayam Bakar Bumbu Bali", "artikel_1.html");
    inputData("Sate Ayam Srepeh", "artikel_2.html");
    inputData("Pizza Sosis Jumbo (Tanpa Ulen)", "artikel_3.html");
    inputData("Nasgor Mawut (Mawut Sayur)", "artikel_4.html");
    inputData("Fuyung Hai", "artikel_5.html");
    inputData("Lobster Bumbu Padang", "artikel_6.html");
    inputData("Sop Iga Sapi", "artikel_7.html");
    inputData("Opor Ayam Kampung", "artikel_8.html");
    inputData("Bebek Goreng Sambel Ijo", "artikel_9.html");
    inputData("Soto Ayam Kampung", "artikel_10.html");
    inputData("Bakso Ayam", "artikel_11.html");
    inputData("Ikan Gurame Bakar", "artikel_12.html");
    inputData("Pisang Bakar Coklat Keju", "artikel_13.html");
    inputData("Keto Martabak Terang Bulan", "artikel_14.html");
    inputData("Ingkung Ayam Kampung", "artikel_15.html");

    //menampilkan data ke dalam recyclerView
    recyclerView = findViewById(R.id.recyclerView);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    dataAdapter = new DataAdapter(this, dataModelArrayList);
    recyclerView.setAdapter(dataAdapter);

    /*//menambahakan header
    DataModel headerModel = new DataModel();
    headerModel.setViewType(2);
    dataModelArrayList.add(0, headerModel);*/

    //menambahkan footer
    DataModel footerModel = new DataModel();
    footerModel.setViewType(2);
    dataModelArrayList.add(footerModel);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }

    if (Build.VERSION.SDK_INT >= 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    }

    }

    //fungsi input
    public void inputData(String judul, String konten) {
    DataModel dataModel = new DataModel();
    dataModel.setJudul(judul);
    dataModel.setKonten(konten);
    dataModel.setViewType(1);
    dataModelArrayList.add(dataModel);
    }

    public static void setWindowFlag(Activity activity, final int bits, boolean on) {
    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
    winParams.flags |= bits;
    } else {
    winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
    }

    }

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.core.widget.NestedScrollView 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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main">

    <androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical" />

    </androidx.core.widget.NestedScrollView>
    5. Buat activity_detail.xml dan DetailActivity.java untuk menampilkan detail resep yang dipilih :

    <?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:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
    android:id="@+id/tbDetail"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

    <ProgressBar
    android:id="@+id/progress_bar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true" />

    <WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    </LinearLayout>

    package com.azhar.resepmasakan.activities;

    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.MenuItem;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;

    import com.azhar.resepmasakan.model.DataModel;
    import com.azhar.resepmasakan.R;

    public class DetailActivity extends AppCompatActivity {

    WebView webView;
    private ProgressBar mProgressBar;

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

    //Toolbar
    setupToolbar();

    mProgressBar = findViewById(R.id.progress_bar);
    mProgressBar.setMax(100);
    mProgressBar.setProgress(0);

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    DataModel dataModel = (DataModel) bundle.getSerializable("dataModel");

    // setting judul bar
    setTitle(dataModel.getJudul());

    //tampil data konten
    webView = findViewById(R.id.webView);
    webView.loadUrl("file:///android_asset/" + dataModel.getKonten());
    webView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String newUrl) {

    return true;
    }

    @Override
    public void onPageStarted(WebView view, String urlStart, Bitmap favicon) {
    mProgressBar.setVisibility(View.VISIBLE);

    }

    @Override
    public void onPageFinished(WebView view, String urlPage) {
    mProgressBar.setVisibility(View.GONE);

    }
    });
    }

    private void setupToolbar() {
    Toolbar toolbar = findViewById(R.id.tbDetail);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
    finish();
    return true;
    }
    return super.onOptionsItemSelected(item);
    }

    }
    6. Buat list_item.xml, list_footer.xml dan DataAdapter.java sebagai Class adapternya :

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    app:cardCornerRadius="10dp"
    app:cardElevation="3dp">

    <View
    android:layout_width="5dp"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary" />

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

    <ImageView
    android:id="@+id/icon_list"
    style="@style/Widget.AppCompat.ActionButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_centerVertical="true"
    android:src="@drawable/ic_arrow"
    android:tint="@color/colorAccent" />

    <TextView
    android:id="@+id/txtJudul"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginStart="10dp"
    android:layout_toStartOf="@id/icon_list"
    android:gravity="start"
    android:textAppearance="?attr/textAppearanceListItem"
    android:textColor="@color/colorAccent"
    android:textSize="16sp" />

    </RelativeLayout>

    </androidx.cardview.widget.CardView>

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="@color/colorPrimaryDark"
    android:gravity="bottom"
    android:orientation="vertical">

    <TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:padding="5dp"
    android:text="Azhar Rivaldi"
    android:textColor="@android:color/white"
    android:textSize="14sp" />

    </LinearLayout>

    package com.azhar.resepmasakan.adapter;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    import androidx.recyclerview.widget.RecyclerView;

    import com.azhar.resepmasakan.model.DataModel;
    import com.azhar.resepmasakan.R;
    import com.azhar.resepmasakan.activities.DetailActivity;

    import java.util.ArrayList;

    public class DataAdapter extends RecyclerView.Adapter {

    private ArrayList dataModelArrayList;
    private Activity activity;

    public DataAdapter(Activity activity, ArrayList dataModelArrayList) {
    this.activity = activity;
    this.dataModelArrayList = dataModelArrayList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    switch (viewType) {
    case 1: {
    View v = inflater.inflate(R.layout.list_item, parent, false);
    viewHolder = new ItemHolder(v);
    break;
    }
    case 2: {
    View v = inflater.inflate(R.layout.list_footer, parent, false);
    viewHolder = new FooterHolder(v);
    break;
    }

    }
    return viewHolder;
    }

    public static class ItemHolder extends RecyclerView.ViewHolder {

    public TextView txtJudul;

    public ItemHolder(View view) {
    super(view);
    txtJudul = view.findViewById(R.id.txtJudul);
    }
    }


    public static class HeaderHolder extends RecyclerView.ViewHolder {
    public HeaderHolder(View view) {
    super(view);
    }
    }

    public static class FooterHolder extends RecyclerView.ViewHolder {
    public FooterHolder(View view) {
    super(view);
    }
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {

    if (getItem(position).getViewType() == 1) {
    ItemHolder holder = (ItemHolder) viewHolder;
    holder.txtJudul.setText(getItem(position).getJudul());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View v) {
    Intent intent = new Intent(activity, DetailActivity.class);
    Bundle bundle = new Bundle();
    bundle.putSerializable("dataModel", getItem(position));
    intent.putExtras(bundle);
    activity.startActivity(intent);
    }
    });
    }
    }

    @Override
    public int getItemViewType(int position) {
    return dataModelArrayList.get(position).getViewType();
    }

    public DataModel getItem(int position) {
    return dataModelArrayList.get(position);
    }

    @Override
    public int getItemCount() {
    return dataModelArrayList.size();
    }

    }
    7. Buat DataModel.java sebagai Class model untuk implementasi apa saja yang ingin dipanggil ke MainActivity :

    package com.azhar.resepmasakan.model;

    import java.io.Serializable;

    public class DataModel implements Serializable {

    Integer viewType;
    String judul, konten;

    public Integer getViewType() {
    return viewType;
    }

    public void setViewType(Integer viewType) {
    this.viewType = viewType;
    }

    public String getJudul() {
    return judul;
    }

    public String getKonten() {
    return konten;
    }

    public void setKonten(String konten) {
    this.konten = konten;
    }

    public void setJudul(String judul) {
    this.judul = judul;
    }
    }
    8. 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 Aplikasi Resep Masakan 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_