CODELAB MEMBUAT PROYEK BARUTEORI ACTIVITY

MEMBUAT PROYEK BARU TEORI ACTIVITY

Codelab ini bertujuan untuk mengimplementasikan komponen Activity pada aplikasi pertama yang Anda bangun. Harapannya aktifitas ini dapat memberi gambaran yang jelas tentang cara kerja activity.

Codelab pertama adalah dengan membuat aplikasi yang dapat menghitung volume balok. Seperti ini tampilannya.

2020111214093503dda7b8f1cca71a79fc9c6efe54094e.png

Logika Dasar

Melakukan input ke dalam obyek EditText → melakukan validasi input → melakukan perhitungan volume balok ketika tombol hitung diklik.

Codelab Membuat Proyek Baru

Hai! Pasti sudah tidak sabar ya untuk memulai membuat aplikasi pertama kalian. Sebelum mulai lebih lanjut, ada video menarik nih buat teman-teman supaya bisa mendapatkan gambaran terlebih dahulu bagaimana proses pembuatan aplikasi pertama. Silakan dicek ya!

Okay, jika sudah dapat gambarannya, yuk kita lanjut untuk bikin aplikasinya. Cuss!

  1. Buat proyek baru dengan klik File → New → New Project pada Android Studio Anda atau Anda bisa memilih Start a new Android Studio project di bagian dashboard.

  2. Pada bagian ini kita akan memilih tipe activity awal dari template yang telah disediakan. Saat ini Android Studio sudah menyediakan berbagai macam template activity dari yang paling sederhana hingga yang paling kompleks seperti:
    Nama Template ActivityFungsinya
    No Activity
    Project murni tanpa ada Activity yang ditambahkan
    Basic Activity
    Activity dengan template komponen material design seperti FloatingActionButton dan menu Toolbar
    Bottom Navigation ActivityActivity dengan tampilan bottom navigation menu di bagian bawah
    Empty ActivityActivity dalam bentuk yang paling sederhana (tanpa menu)
    Fullscreen Activity Activity fullscreen tanpa status bar
    Google AdMob Ads ActivityActivity dengan konfigurasi default iklan Admob
    Google Maps ActivityActivity dengan menyediakan konfigurasi dasar Google Maps
    Login ActivityActivity untuk halaman login
    Master/Detail FlowActivity yang diperuntukan untuk alur aplikasi master detail pada peranti tablet
    Navigation Drawer ActivityActivity dengan tampilan side bar menu yang bisa di-swipe
    Settings Activity
    Activity yang diperuntukan untuk konfigurasi aplikasi
    Scrolling ActivityActivity dengan kemampuan scroll konten didalamnya secara vertikal
    Tabbed ActivityActivity yang diperuntukan untuk menampilkan lebih dari satu tampilan dengan menggunakan Tab dan dapat digeser ke kanan dan ke kiri (swipe) dengan menggunakan komponen ViewPager
    Fragment + ViewModel

    Activity dengan menerapkan Fragment & ViewModel

    Selain itu, Anda juga bisa memilih target device mana yang akan dibuat seperti Phone and Tablet, Wear OS, TV, Android Auto atau Android Things.
    20210603134849f881fcb823ec23bb7644a8bd4ba36f54.pngSaat ini kita pilih tipe Empty Activity untuk belajar dari yang paling dasar, lalu klik Next untuk melanjutkan.

  3. Selanjutnya masukkan nama aplikasi dan nama package aplikasi Anda. Sebaiknya jangan sama dengan apa yang ada di contoh, karena ini berfungsi sebagai id dari aplikasi yang Anda buat. Kemudian Anda bisa menentukan lokasi proyek yang akan Anda buat. Setelah itu pilih tipe gawai/peranti (device) untuk aplikasi beserta target minimum SDK yang akan digunakan. Pilihan target Android SDK akan mempengaruhi banyaknya peranti yang dapat menggunakan aplikasi. Di sini kita memilih nilai minimum SDK kita pasang ke Level 21 (Lollipop). Klik Finish untuk melanjutkan.
    2021060313480181a505943ad9343531973ec65befc2e3.png
    Catatan:
    Pilih : Java

  4. Tampilan layar Anda akan seperti contoh di bawah ini:
    20190116151359393af0e1733c0c2b819b50a2e1d5d471
  5. Di sebelah kanan Anda adalah workspace di mana Activity Anda berada dan bernama MainActivity dengan layout-nya activity_main.xml. Di sebelah kiri Anda terdapat struktur proyek, di mana nanti kita akan banyak menambahkan berbagai komponen baru, asset dan library. Untuk lebih mengenal Android Studio lebih dalam silakan baca materi ini https://developer.android.com/studio/intro/index.html.

Selanjutnya kita akan mulai melakukan pengkodean aplikasi atau lebih enaknya disebut ngoding. Berikut flow umumnya:

  1. Ngoding Layout untuk user interface aplikasi.
  2. Ngoding Activity untuk menambahkan logika aplikasi.

Untuk mengoptimalkan proses pengetikan, Anda dapat memanfaatkan code completion dengan menekan ctrl + space. Android Studio juga akan otomatis mengimpor package dari komponen yang digunakan. 

Dilarang Keras untuk copy - paste! Ngoding pelan-pelan akan membuat Anda lebih jago di masa depan.

Selamat ngoding!


Codelab Layouting

Menambahkan Code Sederhana pada Layout Activity

  1. Silakan pilih berkas activity_main.xml pada workspace Anda(res/layout/activity_main.xml).
    201901161518426978d7756dd739230c63bb08f97581e6Pastikan project window pada pilihan Android seperti di bawah ini.
    20210413092615092f54484600759d71880576f76afd66.pngMaka akan ada tampilan seperti ini, kemudian pilih tab Code di sebelah pojok kanan atas.
    20200728133650677eccc333f698139056188917091da1.pngUbah layout dasar dari ConstraintLayout menjadi LinearLayout seperti berikut:
    20200728134311dd66f4a09df34ca29ee0d958929e095c.gifSelanjutnya tambahkan baris-baris yang dicetak tebal di bawah ini. Berikut adalah contoh cara menuliskannya.
    20200728140117d01c75af9555db779e8fb7013c91b005.gif
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3.     xmlns:tools="http://schemas.android.com/tools"
    4.     android:layout_width="match_parent"
    5.     android:layout_height="match_parent"
    6.     android:padding="16dp"
    7.     android:orientation="vertical">
    8.  
    9.     <TextView
    10.         android:layout_width="match_parent"
    11.         android:layout_height="wrap_content"
    12.         android:text="Panjang" />
    13.     <EditText
    14.         android:id="@+id/edt_length"
    15.         android:layout_width="match_parent"
    16.         android:layout_height="wrap_content"
    17.         android:inputType="numberDecimal"
    18.         android:lines="1" />
    19.     <TextView
    20.         android:layout_width="match_parent"
    21.         android:layout_height="wrap_content"
    22.         android:text="Lebar" />
    23.     <EditText
    24.         android:id="@+id/edt_width"
    25.         android:layout_width="match_parent"
    26.         android:layout_height="wrap_content"
    27.         android:inputType="numberDecimal"
    28.         android:lines="1" />
    29.     <TextView
    30.         android:layout_width="match_parent"
    31.         android:layout_height="wrap_content"
    32.         android:text="Tinggi" />
    33.     <EditText
    34.         android:id="@+id/edt_height"
    35.         android:layout_width="match_parent"
    36.         android:layout_height="wrap_content"
    37.         android:inputType="numberDecimal"
    38.         android:lines="1" />
    39.     <Button
    40.         android:id="@+id/btn_calculate"
    41.         android:layout_width="match_parent"
    42.         android:layout_height="wrap_content"
    43.         android:text="Hitung" />
    44.     <TextView
    45.         android:id="@+id/tv_result"
    46.         android:layout_width="match_parent"
    47.         android:layout_height="wrap_content"
    48.         android:gravity="center"
    49.         android:text="Hasil"
    50.         android:textSize="24sp"
    51.         android:textStyle="bold" />
    52. </LinearLayout>
    Perlu diperhatikan root layout (tag layout terluar) yang dipakai di sini adalah LinearLayout. Jika kita menggunakan Android Studio versi 3 ke atas, secara default root yang dipakai adalah ConstraintLayout. Agar sesuai dengan latihan ini, kita tinggal menggantinya menjadi LinearLayout. Untuk Layout akan dibahas nanti pada modul yang berbeda. Jadi ikuti saja dulu ya!

  • Perhatikan bahwa ada warning berwarna kuning pada atribut android:text di layout tersebut.
    20181112092821af9c83a6062f6880c683b41a9e6d2fd1Ini karena kita melakukan hardcoding (menuliskan teks secara langsung) pada nilai string-nya. Ini merupakan praktik yang kurang baik karena seharusnya kita menuliskan semua teks pada berkas res/values/strings.xml dan setelah itu baru memanggilnya.

    Okey, mari kita hilangkan warning tersebut dengan menekan Alt+Enter (option + return pada Mac) atau menekan lampu kuning yang muncul pada attribut android:text. Akan muncul dialog seperti ini, pilih extract string resource.
    201811120923086c6e448fde7b10eeac1a7ef4fbf25924
  • Kemudian akan muncul dialog seperti di bawah ini. Sesuaikan dengan nama yang ada.
    201811120927217800750fc9fc17abef37ef35bb3ccb31Atau bisa juga melihat animasi berikut:
    20200808111137fc29e3bec4178bbdfa53552690c93f8b.gif

  • Fungsi extract string resource akan secara otomatis menambahkan nilai dari android:text ke dalam berkas res/values/strings.xml.
    2020111214205680472be6debaa74446883a5079bfc974.pngLakukan hal yang sama pada setiap text lainnya. Jika kita buka berkas strings.xml yang ada di folder res/value, maka isinya akan menjadi seperti ini:

    1. <resources>
    2.     <string name="app_name">BarVolume</string>
    3.     <string name="width">Lebar</string>
    4.     <string name="height">Tinggi</string>
    5.     <string name="calculate">Hitung</string>
    6.     <string name="result">Hasil</string>
    7.     <string name="length">Panjang</string>
    8. </resources>
  • Maka kode di dalam activity_main.xml akan menjadi seperti ini:

      1. <?xml version="1.0" encoding="utf-8"?>
      2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3.     xmlns:tools="http://schemas.android.com/tools"
      4.     android:layout_width="match_parent"
      5.     android:layout_height="match_parent"
      6.     android:padding="16dp"
      7.     android:orientation="vertical">
      8.  
      9.     <TextView
      10.         android:layout_width="match_parent"
      11.         android:layout_height="wrap_content"
      12.         android:text="@string/length" />
      13.  
      14.     <EditText
      15.         android:id="@+id/edt_length"
      16.         android:layout_width="match_parent"
      17.         android:layout_height="wrap_content"
      18.         android:inputType="numberDecimal"
      19.         android:lines="1" />
      20.  
      21.     <TextView
      22.         android:layout_width="match_parent"
      23.         android:layout_height="wrap_content"
      24.         android:text="@string/width" />
      25.  
      26.     <EditText
      27.         android:id="@+id/edt_width"
      28.         android:layout_width="match_parent"
      29.         android:layout_height="wrap_content"
      30.         android:inputType="numberDecimal"
      31.         android:lines="1" />
      32.  
      33.     <TextView
      34.         android:layout_width="match_parent"
      35.         android:layout_height="wrap_content"
      36.         android:text="@string/height" />
      37.  
      38.     <EditText
      39.         android:id="@+id/edt_height"
      40.         android:layout_width="match_parent"
      41.         android:layout_height="wrap_content"
      42.         android:inputType="numberDecimal"
      43.         android:lines="1" />
      44.  
      45.     <Button
      46.         android:id="@+id/btn_calculate"
      47.         android:layout_width="match_parent"
      48.         android:layout_height="wrap_content"
      49.         android:text="@string/calculate" />
      50.  
      51.     <TextView
      52.         android:id="@+id/tv_result"
      53.         android:layout_width="match_parent"
      54.         android:layout_height="wrap_content"
      55.         android:gravity="center"
      56.         android:text="@string/result"
      57.         android:textSize="24sp"
      58.         android:textStyle="bold" />
      59. </LinearLayout>
      60.  
    1. Jika Anda perhatikan, hasil layout sementara akan menjadi seperti ini:
      2020111214194013b0bfdb3b0fc948d8648dbcdf923b9b.png

      7. Setelah selesai mendesain aplikasi, silakan coba jalankan aplikasi dengan memilih menu Run → Run ‘app’ dari menu bar.
      201901170910324f3aff89c4b13f86e6f864536dc9d37aSelain cara di atas, Anda juga dapat menekan icon berikut di toolbar:
      202002171624414e0bf3ffd84f26229143bf960490eee7.pngKemudian akan muncul pilihan seperti ini:
      201901170917292fa4e95ece51ff9ab1f2b147f881f674Itu tandanya ADB (Android Debugger) pada peranti yang Anda punya telah terhubung dengan Android Studio. Jika Anda tidak memiliki peranti, maka Anda dapat menggunakan emulator. Ikuti materinya di modul sebelumnya atau lihat materi di sini.

      Catatan:
      Kami merekomendasikan Anda menggunakan peranti Android sewaktu mengembangkan aplikasi. Selain karena beban memori pada peranti Anda akan jadi lebih rendah, pendekatan ini juga akan memungkinkan Anda untuk merasakan bagaimana aplikasi berjalan di device sebenarnya.

      Pilih OK untuk menjalankan dan tunggu hingga proses building dan instalasi APK selesai. Jika sudah, seharusnya hasilnya akan seperti ini:
      20210413101326f36361c9fe01567dd29f6d08ba86eb83.pngSaat ini aplikasi telah tampil, namun ketika Anda coba untuk memasukkan angka dan klik tombol Hitung, aplikasi tidak akan merespons. Hal ini karena kita belum menambahkan logika kode pada MainActivity. Nah, yuk kita lanjut ke codelab selanjutnya supaya aplikasi pertama kita bisa berjalan dengan semestinya. Semangat!



    Codelab Kode Logika

    Menambahkan Kode Logika Sederhana pada MainActivity.

    1. Selanjutnya setelah selesai, lanjutkan dengan membuka berkas MainActivity dan lanjutkan ngoding baris-baris di bawah ini.
      Tambahkan beberapa variabel yang akan digunakan untuk menampung View.
    1. private EditText edtWidth;
    2. private EditText edtHeight;
    3. private EditText edtLength;
    4. private Button btnCalculate;
    5. private TextView tvResult;

    Catatan:
    Perhatikan bagaimana cara menuliskan kodenya. Biasakan menekan Enter ketika mengetik supaya komponen di-import secara otomatis, kecuali nama variabel yang Anda tentukan sendiri seperti edtWidth harus diketik satu per satu.

    2020072814125431742b5d0809d0595c757f356eb90c28.gif

  • Kemudian inisiasi variabel yang telah kita buat dengan menambahkan kode berikut di dalam metode onCreate.
    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3. super.onCreate(savedInstanceState);
    4. setContentView(R.layout.activity_main);
    5.  
    6.     edtWidth = findViewById(R.id.edt_width);
    7. edtHeight = findViewById(R.id.edt_height);
    8. edtLength = findViewById(R.id.edt_length);
    9. btnCalculate = findViewById(R.id.btn_calculate);
    10.     tvResult = findViewById(R.id.tv_result);
    11.  
    12.     btnCalculate.setOnClickListener(this);
    13.  
    14. }
  • Akan muncul baris merah pada kata this. Hal ini karena ketika kita menggunakan setOnClickListener(this), maka kita perlu menambahkan interface View.OnClickListener di kelas MainActivity. Silakan klik di atas baris merah tersebut, kemudian tekan tombol Alt + Enter (option + return pada Mac) atau menekan lampu merah yang muncul lalu pilih aksi berikut untuk implement interface.Maka secara otomatis akan ada penambahan kode pada kelas MainActivity seperti berikut ini:
    1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    2.  
    3.     ...
    4.  
    5. }
  • Jika terdapat baris merah seperti ini:
    20200808113008835412205f0e8c67d4fbd1837deed7b8.png

    Jangan khawatir! Silakan klik di atas baris merah tersebut, kemudian tekan tombol Alt + Enter (option + return pada Mac) atau menekan lampu merah yang muncul lalu pilih implement methods (Java) atau implement members (Kotlin).

    Maka secara otomatis akan ada penambahan metode onClick di kelas MainActivity. Setelah itu, tambahkan kode berikut ke dalam metode onClick:

    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3.     super.onCreate(savedInstanceState);
    4.     setContentView(R.layout.activity_main);
    5.    
    6.     ...
    7.     
    8. }
    9.  
    10. @Override
    11. public void onClick(View v) {
    12.     if (v.getId() == R.id.btn_calculate) {
    13.         String inputLength = edtLength.getText().toString().trim();
    14.         String inputWidth = edtWidth.getText().toString().trim();
    15.         String inputHeight = edtHeight.getText().toString().trim();
    16.         double volume = Double.valueOf(inputLength) * Double.valueOf(inputWidth) * Double.valueOf(inputHeight);
    17.         tvResult.setText(String.valueOf(volume));
    18.     }
    19. }
  • Akhirnya kelas MainActivity akan memiliki kode seperti berikut ini:
    1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    2.     private EditText edtWidth, edtHeight, edtLength;
    3.     private Button btnCalculate;
    4.     private TextView tvResult;
    5.  
    6.     @Override
    7.     protected void onCreate(Bundle savedInstanceState) {
    8.         super.onCreate(savedInstanceState);
    9.         setContentView(R.layout.activity_main);
    10.  
    11.         edtWidth = findViewById(R.id.edt_width);
    12.         edtHeight = findViewById(R.id.edt_height);
    13.         edtLength = findViewById(R.id.edt_length);
    14.         btnCalculate = findViewById(R.id.btn_calculate);
    15.         tvResult = findViewById(R.id.tv_result);
    16.  
    17.         btnCalculate.setOnClickListener(this);
    18.     }
    19.  
    20.     @Override
    21.     public void onClick(View v) {
    22.         if (v.getId() == R.id.btn_calculate) {
    23.             String inputLength = edtLength.getText().toString().trim();
    24.             String inputWidth = edtWidth.getText().toString().trim();
    25.             String inputHeight = edtHeight.getText().toString().trim();
    26.  
    27.           double volume = Double.valueOf(inputLength) * Double.valueOf(inputWidth) * Double.valueOf(inputHeight);
    28.             tvResult.setText(String.valueOf(volume));      
    29.         }
    30.     }
    31. }

  • Setelah selesai, silakan jalankan aplikasi kembali. Jika sudah, seharusnya hasilnya akan seperti ini:
    2020111214430887fae9813b6358f057e1cbdec3e3450a.gifSilakan masukkan nilai panjang, lebar, dan tinggi kemudian tekan tombol Hitung dan hasilnya akan ditampilkan di objek textview tvResultNamun masih ada sedikit masalah di sini, yaitu Anda tetap melakukan proses perhitungan walaupun salah satu nilainya kosong. Hal ini akan menyebabkan aplikasi force close karena perhitungan tidak dapat diproses. Maka untuk mengatasinya Anda akan menggunakan percabangan untuk mengecek apakah masing-masing EditText kosong atau tidak.

  • Silakan buka kembali kelas MainActivity. Tambahkan kode berikut ke dalam metode onClicksebelum melakukan perhitungan.
    1. @Override
    2. public void onClick(View v) {
    3.     if (v.getId() == R.id.btn_calculate) {
    4.         String inputLength = edtLength.getText().toString().trim();
    5.         String inputWidth = edtWidth.getText().toString().trim();
    6.         String inputHeight = edtHeight.getText().toString().trim();
    7.         boolean isEmptyFields = false;
    8.         if (TextUtils.isEmpty(inputLength)) {
    9.             isEmptyFields = true;
    10.             edtLength.setError("Field ini tidak boleh kosong");
    11.         }
    12.         if (TextUtils.isEmpty(inputWidth)) {
    13.             isEmptyFields = true;
    14.             edtWidth.setError("Field ini tidak boleh kosong");
    15.         }
    16.         if (TextUtils.isEmpty(inputHeight)) {
    17.             isEmptyFields = true;
    18.             edtHeight.setError("Field ini tidak boleh kosong");
    19.         }
    20.         if (!isEmptyFields) {
    21.             double volume = Double.valueOf(inputLength) * Double.valueOf(inputWidth) * Double.valueOf(inputHeight);
    22.             tvResult.setText(String.valueOf(volume));
    23.         }
    24.     }
    25. }
  • Akhirnya kelas MainActivity akan memiliki kode seperti berikut ini:
    1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    2. private EditText edtWidth, edtHeight, edtLength;
    3. private Button btnCalculate;
    4. private TextView tvResult;
    5.  
    6. @Override
    7. protected void onCreate(Bundle savedInstanceState) {
    8. super.onCreate(savedInstanceState);
    9. setContentView(R.layout.activity_main);
    10.  
    11. edtWidth = findViewById(R.id.edt_width);
    12. edtHeight = findViewById(R.id.edt_height);
    13. edtLength = findViewById(R.id.edt_length);
    14. btnCalculate = findViewById(R.id.btn_calculate);
    15. tvResult = findViewById(R.id.tv_result);
    16.  
    17. btnCalculate.setOnClickListener(this);
    18. }
    19.  
    20. @Override
    21. public void onClick(View v) {
    22. if (v.getId() == R.id.btn_calculate) {
    23. String inputLength = edtLength.getText().toString().trim();
    24. String inputWidth = edtWidth.getText().toString().trim();
    25. String inputHeight = edtHeight.getText().toString().trim();
    26.  
    27. boolean isEmptyFields = false;
    28.  
    29. if (TextUtils.isEmpty(inputLength)) {
    30. isEmptyFields = true;
    31. edtLength.setError("Field ini tidak boleh kosong");
    32. }
    33.  
    34. if (TextUtils.isEmpty(inputWidth)) {
    35. isEmptyFields = true;
    36. edtWidth.setError("Field ini tidak boleh kosong");
    37. }
    38.  
    39. if (TextUtils.isEmpty(inputHeight)) {
    40. isEmptyFields = true;
    41. edtHeight.setError("Field ini tidak boleh kosong");
    42. }
    43.  
    44. if (!isEmptyFields) {
    45. double volume = Double.valueOf(inputLength) * Double.valueOf(inputWidth) * Double.valueOf(inputHeight);
    46. tvResult.setText(String.valueOf(volume));
    47. }
    48. }
    49. }
    50. }
  • Jalan kembali aplikasi Anda dengan memilih menu Run → Run ‘app’  atau shortcut Shift + F10. Cobalah langsung menekan tombol HITUNG tanpa mengisi EditText, maka aplikasi Anda tidak akan force close dan akan muncul peringatan bahwa "Field ini tidak boleh kosong".
    2020111214474092ecd85eed3b5e4dfe922c059e8f9dad.png
  • Apakah kita sudah selesai? Belum! Masih ada yang kurang. Ketika nilai volume sudah dihitung dan kemudian terjadi pergantian orientasi (portrait-landscape) pada peranti, maka hasil perhitungan tadi akan hilang.
    20201112144935938b4aef1c74186a059961e48e845f4b.pngUntuk mengatasinya, tambahkan metode onSaveInstanceState() pada MainActivitydan sesuaikan seperti berikut:
    1. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    2. private EditText edtWidth;
    3. private EditText edtHeight;
    4. private EditText edtLength;
    5. private Button btnCalculate;
    6. private TextView tvResult;
    7.  
    8.     private static final String STATE_RESULT = "state_result";
    9.  
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. ...
    13. }
    14.  
    15. @Override
    16. protected void onSaveInstanceState(Bundle outState) {
    17. super.onSaveInstanceState(outState);
    18. outState.putString(STATE_RESULT, tvResult.getText().toString());
    19. }
    20.  
    21. ...
    22. }

    Catatan:
    Karena onSaveInstanceState adalah class yang ada di superclass AppCompatActivity, Anda bisa membuat fungsi secara otomatis dengan hanya mengetikkan huruf onSave... dan pilih yang hanya memiliki satu parameter.
    202104161628553b61ab50a605ccd0347a25d4f6601c75.png

    Kemudian tambahkan juga beberapa baris berikut pada baris terakhir metode onCreate.
      1. @Override
      2. protected void onCreate(Bundle savedInstanceState) {
      3. super.onCreate(savedInstanceState);
      4. setContentView(R.layout.activity_main);
      5.  
      6. ...
      7.  
      8.     if (savedInstanceState != null) {
      9. String result = savedInstanceState.getString(STATE_RESULT);
      10. tvResult.setText(result);
      11. }
      12. }

    1. Silakan jalankan kembali aplikasinya. Ulangi proses perhitungan seperti sebelumnya. Kemudian ganti orientasi peranti Anda. Jika sudah benar maka hasil perhitungan tidak akan hilang. 

    Bedah Kode

    Pembahasan tentang layout xml

    Layout merupakan user interface dari suatu activity. Layout dituliskan dalam format xml (extensible markup language).

    1. xml version="1.0" encoding="utf-8"?>

    Baris ini mengidentifikasi bahwa berkas ini berformat xml.

    1. xmlns:android="http://schemas.android.com/apk/res/android"

    Kode di atas menandakan namespace yang digunakan dalam keseluruhan berkas xml ini.

    Macam Views

    Di sini kita menggunakan beberapa komponen user interface yang disebut view. Di antaranya:

    • TextView : Komponen view untuk menampilkan teks ke layar
    • EditText : Komponen view untuk memberikan input teks
    • Button : Komponen view untuk melakukan sebuah aksi klik
    • LinearLayout : Komponen view bertipe viewgroup yang menjadi parent dari semua sub komponen view (sub view) di dalamnya. Komponen ini bersifat sebagai kontainer untuk komponen lain dengan orientasi secara vertikal atau horizontal.

    Cara membaca :

    1.  <TextView
    2.     android:layout_width="match_parent"
    3.     android:layout_height="wrap_content"
    4.     android:text="@string/calculate"
    5.     android:layout_marginBottom="16dp"/>

    Komponen di atas adalah sebuah TextView. Perhatikan gambar di bawah ini. Warna ungu menandakan namespace yang digunakan; warna biru adalah atribut dari komponen dan warna hijau adalah nilai dari atribut. Penjelasannya seperti di bawah ini:

    2016110214142154500af4d8d662f855314a704a

    20161102141427e71b0d44f5baef3f1395940442

    • match_parentIni berarti bahwa ukuran dimensi sebuah View disesuaikan dengan ukuran layar secara horizontal jika pada layout_width dan vertikal jika pada layout_height.
    • wrap_content : Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan ukuran konten di dalamnya baik secara horizontal pada layout_width dan vertikal jika pada layout_height.
    • @string/calculate: value calculate berasal dari berkas strings.xml yang bisa Anda lihat dengan cara menekan dan tahan tombol Ctrl (atau command) + arahkan kursor ke atasnya dan kemudian klik sekali. .

    20180806171303692bcbb8c9bac3045c0da7b981d59067.

    Penggunaan centralize resource value akan memudahkan Anda sewaktu mengembangkan aplikasi Android. Cara tersebut digunakan agar Anda tidak menulis nilai yang sama berulang-ulang. 

    Apa itu ‘@+id/’ ? 

    Salah satu contoh penerapan penggunaan @+id/ sebagai berikut:

    1. <Button
    2.     android:id="@+id/btn_calculate"
    3.     android:layout_width="match_parent"
    4.     android:layout_height="wrap_content"
    5.     android:text="@string/calculate"/>

    Penjelasannya sebagai berikut:

    1. android:id="@+id/btn_calculate"

    Jika kita memberikan id pada sebuah view maka kita telah memberikan identifier untuk view tersebut. Pemberian id ini dimaksudkan agar kita bisa melakukan manipulasi/pengendalian pada level logic di komponen seperti activity atau fragment.

    Id di atas akan diciptakan di berkas R dan disimpan dalam bentuk hexa bertipe data integer public static final int btn_calculate=0x7f0b0057.

    2016110214161078fb3d968af6fd3f8cfc0dbfe0

    Acuan untuk menyusun tampilan pada relativelayout akan dibahas pada modul selanjutnya.

    Pembahasan tentang Logika Kode

    Kode logika dituliskan ke dalam kelas Java atau Koltin. Di sinilah semua aktifitas dari suatu aplikasi berjalan.

    Activity

    1. public class MainActivity extends AppCompatActivity 

    Menandakan bahwa kelas Java / Kotlin di atas merupakan sebuah activity karena inherit ke superclass bernama AppCompatActivity.

    OnClickListener

    1. implements View.OnClickListener 

    Ini adalah listener yang kita implementasikan untuk memantau kejadian klik pada komponen tombol (button)

    Views

    1. private EditText edtWidth;
    2. private EditText edtHeight;
    3. private EditText edtLength;
    4. private Button btnCalculate;
    5. private TextView tvResult;

    Kode di atas mendeklarasikan semua komponen view yang akan dimanipulasi. Kita deklarasikan secara global agar bisa dikenal di keseluruhan bagian kelas.

    OnCreate

    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3.     super.onCreate(savedInstanceState);
    4.     setContentView(R.layout.activity_main);
    5.     edtWidth = findViewById(R.id.edt_width);
    6.     edtHeight = findViewById(R.id.edt_height);
    7.     edtLength = findViewById(R.id.edt_length);
    8.     btnCalculate = findViewById(R.id.btn_calculate);
    9.     tvResult = findViewById(R.id.tv_result);
    10.  
    11.     btnCalculate.setOnClickListener(this);
    12. }

    Metode onCreate() merupakan metode utama pada activity. Di sinilah kita dapat mengatur layout xml. Semua proses inisialisasi komponen yang digunakan akan dijalankan di sini. Pada metode ini kita casting semua komponen view yang kita telah deklarasikan sebelumnya, agar dapat kita manipulasi.

    SetContentView

    1. setContentView(R.layout.activity_main);

    Maksud baris di atas adalah kelas MainActivity akan menampilkan tampilan yang berasal dari layout activity_main.xml.

    Casting View

    1. edtWidth = findViewById(R.id.edt_width);

    Maksud dari baris di atas adalah obyek EditTextedtWidth disesuaikan (cast) dengan komponen EditText ber-ID edt_width di layout activity_main.xml melalui metode findViewById().

    SetOnClickListener

    1. btnCalculate.setOnClickListener(this);

    Kita memasang event click listener untuk obyek btnCalculate sehingga sebuah aksi dapat dijalankan ketika obyek tersebut diklik. Keyword this merujuk pada obyek Activity saat ini yang telah mengimplementasikan listener OnClickListener sebelumnya.  Sehingga ketika btnCalculate diklik, maka fungsi onClick akan dipanggil dan melakukan proses yang ada di dalamnya.

    Mengambil value dari EditText

    1. String inputLength = edtLength.getText().toString().trim();
    2. String inputWidth = edtWidth.getText().toString().trim();
    3. String inputHeight = edtHeight.getText().toString().trim();

    Sintaks .text.toString() di atas berfungsi untuk mengambil isi dari sebuah EditText kemudian menyimpannya dalam sebuah variabel. Tambahan .trim() berfungsi untuk menghiraukan spasi jika ada, sehingga nilai yang didapat hanya berupa angka.

    Cek inputan yang kosong

    1. boolean isEmptyFields = false;
    2.  
    3. if (TextUtils.isEmpty(inputLength)) {
    4. isEmptyFields = true;
    5. edtLength.setError("Field ini tidak boleh kosong");
    6. }
    7.  
    8. if (TextUtils.isEmpty(inputWidth)) {
    9. isEmptyFields = true;
    10. edtWidth.setError("Field ini tidak boleh kosong");
    11. }
    12.  
    13. if (TextUtils.isEmpty(inputHeight)) {
    14. isEmptyFields = true;
    15. edtHeight.setError("Field ini tidak boleh kosong");
    16. }

    Sintaks .isEmpty() berfungsi untuk mengecek apakah inputan dari Editext itu masih kosong. Jika iya, maka kita akan menampilkan pesan error dengan menggunakan .setError("Field ini tidak boleh kosong") dan mengganti variabel Boolean isEmptyField menjadi true supaya bisa lanjut ke proses selanjutnya.

    Menampilkan data ke TextView

    1. if (!isEmptyFields) {
    2. double volume = Double.valueOf(inputLength) * Double.valueOf(inputWidth) * Double.valueOf(inputHeight);
    3. tvResult.setText(String.valueOf(volume));
    4. }

    Sintaks !isEmptyFields memiliki arti "jika semua inputan tidak kosong". Jika kondisi tersebut terpenuhi, maka langkah selanjutnya yaitu melakukan proses perhitungan. Karena yang didapat dari EditText berupa String maka Anda perlu mengkonversinya terlebih dahulu dengan menggunakan Double.valueOf(). Langkah terakhir yaitu menampikan hasil perhitungan pada TextView tvResult dengan menggunakan .setText(). Di sini dapat kita lihat bahwa kita perlu merubah datanya yang sebelumnya Double menjadi String dengan menggunakan String.valueOf() karena untuk menampilkan data dengan setText() harus berupa String.

    Pembahasan SaveInstanceState 

    1. @Override
    2. protected void onSaveInstanceState(Bundle outState) {
    3. super.onSaveInstanceState(outState);
    4. outState.putString(STATE_RESULT, tvResult.getText().toString());
    5. }

    Perhatikan metode onSaveInstanceStateDi dalam metode tersebut, hasil perhitungan yang ditampilkan pada tvResult dimasukkan pada bundle kemudian disimpan isinya. Untuk menyimpan data disini menggunakan konsep Key-Value, dengan STATE_RESULT sebagai key dan isi dari tvResult sebagai value. Fungsi onSaveInstanceState akan dipanggil secara otomatis sebelum sebuah Activity hancur. Di sini kita perlu menambahkan onSaveInstanceState karena ketika orientasi berubah, Activity tersebut akan di-destroy dan memanggil fungsi onCreate lagi, sehingga kita perlu menyimpan nilai hasil perhitungan tersebut supaya data tetap terjaga dan tidak hilang ketika orientasi berubah.

    1. if (savedInstanceState != null){
    2. String hasil = savedInstanceState.getString(STATE_RESULT);
    3.     tvResult.setText(hasil);
    4. }

    Pada onCreate inilah kita menggunakan nilai bundle yang telah kita simpan sebelumnya pada onSaveInstanceState. Nilai tersebut kita dapatkan dengan menggunakan Key yang sama dengan saat menyimpan, yaitu STATE_RESULT. Kemudian kita isikan kembali pada tvResult.