Aplikasi WordListSQLWithContentProvider yang ada yang telah Anda buat di praktik sebelumnya.
Aplikasi WordListClient baru yang akan melakukan kueri pada penyedia konten WordListSQLWithContentProvider. UI untuk aplikasi ini sama dengan WordListInteractive.
Tugas 1. Menjadikan penyedia konten Anda tersedia untuk aplikasi lain
1.1 Modifikasi WordListSQLWithContentProvider untuk mengizinkan akses aplikasi
Buat salinan WordListSQLInterative dan jalankan pada Android Studio
Ubah nama paket menjadi wordlistsqlwithcontentprovider
Tugas 2. Menambahkan kelas Contract ke WordListSQLInteractive
2.1 Tambahkan kelas Contract
Tambahkan kelas final publik ke proyek Anda dan beri nama Contract.
Kelas Contract ini berisi semua informasi yang diperlukan aplikasi lain untuk menggunakan penyedia konten aplikasi Anda. Anda bisa memberi nama apa pun pada kelas ini, tetapi umumnya disebut sebagai “Contract”.
public final class Contract {}
Agar kelas Contract tidak dibuat instance-nya, tambahkan constructor pribadi yang kosong.
Ini adalah pola standar untuk kelas yang digunakan untuk menampung informasi meta dan konstanta untuk aplikasi.
private Contract() {}
2.2 Pindahkan konstanta database ke dalam Contract
Pindahkan DATABASE_NAME dan buat menjadi publik.
public static final String DATABASE_NAME = "wordlist";
Buat kelas dalam WordList yang mengimplementasikan BaseColumns.
public static abstract class WordList implements BaseColumns {
}
2.3 Definsikan Konstanta URI
Deklarasikan skema URI untuk penyedia konten Anda.
Menggunakan Contract di MinimalistContentProvider sebagai contoh, deklarasikan AUTHORITY, CONTENT_PATH. Tambahkan CONTENT_PATH_URI untuk mengembalikan semua item dan ROW_COUNT_URI yang mengembalikan nomor entri. Di AUTHORITY, gunakan nama aplikasi Anda.
public static final int ALL_ITEMS = -2;
public static final String COUNT = "count";
public static final String AUTHORITY =
"com.android.example.wordlistsqlwithcontentprovider.provider";
public static final String CONTENT_PATH = "words";
public static final Uri CONTENT_URI =
Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH);
public static final Uri ROW_COUNT_URI =
Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH + "/" + COUNT);
2.4 Deklarasikan tipe MIME
Deklarasikan tipe MIME untuk satu atau beberapa respons catatan:
static final String SINGLE_RECORD_MIME_TYPE =
"vnd.android.cursor.item/vnd.com.example.provider.words";
static final String MULTIPLE_RECORDS_MIME_TYPE =
"vnd.android.cursor.item/vnd.com.example.provider.words";
Jalankan aplikasi Anda. Aplikasi harus berjalan dan tampak dan bertindak persis seperti sebelum Anda mengubahnya.
Tugas 3. Membuat Penyedia Konten
3.1 Buat kelas WordListContentProvider
Buat kelas baru yang memperluas ContentProvider dan beri nama WordListContentProvider.
Deklarasikan UriMatcher.
Deklarasikan variabel kelas WordListOpenHelper, mDB.
Deklarasikan kode untuk URI matcher sebagai konstanta.
Ini akan menyatukan kode di satu tempat dan memudahkannya diubah. Gunakan kelipatan sepuluh, sehingga menyisipkan kode tambahan bisa langsung dilakukan.
private static final int URI_ALL_ITEMS_CODE = 10;
private static final int URI_ONE_ITEM_CODE = 20;
private static final int URI_COUNT_CODE = 30;
Ubah metode onCreate() untuk
menginsialisasi mDB dengan WordListOpenHelper,
memanggil metode initializeUriMatching() yang akan Anda buat nanti,
dan mengembalikan true.
@Override
public boolean onCreate() {
mDB = new WordListOpenHelper(getContext());
initializeUriMatching();
return true;
}
Buat metode void pribadi initializeUriMatching().
Di initializeUriMatching(), tambahkan URI ke matcher untuk mendapatkan semua item, satu item, dan jumlahnya.
Periksa Contract dan gunakan metode initializeUriMatching() di aplikasi MinimalistContentProver sebagai template.
Gunakan MiniContentProvider sebagai template untuk mengimplementasikan metode query().
Modifikasi WordListContentProvider.query().
Gunakan pernyataan Switch untuk kode yang dikembalikan oleh sUriMatcher.
Untuk URI_ALL_ITEMS_CODE, URI_ONE_ITEM_CODE, URI_COUNT_CODE, panggil yang sesuai di WordListOpenHelper (mDB).
3.3 Perbaiki WordListOpenHelper.query() untuk mengembalikan Cursor dan menangani pengembalian semua item.
Tambahkan kode dengan sebuah kueri untuk mengembalikan semua item dari database untuk menangani kasus cursor = mDB.query(ALL_ITEMS) dari pernyataan Switch di atas.
Sederhanakan WordListOpenHelper.query() agar mengembalikan kursor.
Ini memperbaiki kesalahan di WordListContentProvider.query().
Akan tetapi, ini merusak WordListOpenHelper.OnBindViewHolder(), yang mengharapkan WordItem dari WordListOpenHelper.
3.4 Perbaiki WordListOpenHelper.count() untuk mengembalikan sebuah Cursor
Buat MatrixCursor menggunakan Contract.CONTENT_PATH.
3.5 Perbaiki WordListAdapter.onBindViewHolder() untuk menggunakan resolver konten
Tambahkan variabel instance untuk parameter kueri karena akan digunakan lebih dari sekali.
Resolver konten mengambil parameter kueri, yang harus Anda bangun. Pembuatan struktur kueri sama dengan kueri SQL, tetapi sebagai ganti pernyataan Selection, kueri menggunakan URI. Parameter kueri sangat mirip dengan kueri SQL.
Buat resolver konten dengan parameter kueri yang ditetapkan dan simpan hasilnya di sebuah Cursor yang disebut sebagai cursor. (Lihat MainActivity aplikasi MinimalistContentProvider untuk contohnya.)
String word = "";
int id = -1;
Cursor cursor = mContext.getContentResolver().query(Uri.parse(
queryUri), null, null, null, sortOrder);
Ganti panggilan ke mDB.delete(id) di callback tombol DELETE dengan panggilan resolver konten yang akan dihapus.
selectionArgs = new String[]{Integer.toString(id)};
int deleted = mContext.getContentResolver().delete(
Contract.CONTENT_URI, Contract.CONTENT_PATH, selectionArgs);
3.6 Ubah WordListAdapter.getItemCount() untuk menggunakan resolver konten
Sebagai ganti meminta hitungan dari database, getItemCount() harus tersambung ke resolver konten dan meminta hitungan. Di Contract, Anda mendefinisikan URI untuk mendapatkan hitungan tersebut:
public static final String COUNT = "count";
public static final Uri ROW_COUNT_URI =
Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH + "/" + COUNT
3.7 Tambahkan penyedia konten ke Manifes Android
Periksa logcat untuk melihat penyebab kesalahan (yang sangat umum).
Tambahkan penyedia konten ke Manifes Android di dalam tag <application>.
Tugas 4. Mengimplementasikan Metode Penyedia Konten
4.1 getType()
Metode getType() dipanggil oleh aplikasi lain yang ingin menggunakan penyedia konten ini, untuk melihat jenis data seperti apa yang dikembalikan oleh aplikasi Anda.
Gunakan pernyataan Switch untuk mengembalikan tipe MIME yang sesuai.
Tipe MIME dicantumkan dalam Contract.
SINGLE_RECORD_MIME_TYPE adalah untuk URI_ALL_ITEMS_CODE
MULTIPLE_RECORDS_MIME_TYPE adalah untuk URI_ONE_ITEM_CODE
4.2 Panggil penyedia konten untuk menyisipkan dan memperbarui kata di MainActivity.
Untuk memperbaiki operasi penyisipan, MainActivity().onActivityResult perlu memanggil penyedia konten, bukan database untuk menyisipkan dan memperbarui kata.
Di MainActivity, hapus deklarasi mDB dan pembuatan instance-nya.
Di OnActivityResult()
Menyisipkan:
Jika panjang kata tidak nol, buat variabel ContentValues bernama “values” dan tambahkan kata yang dimasukkan oleh pengguna ke dalamnya menggunakan string “word” sebagai kunci.
Ganti mDB.insert(word); dengan permintaan insert ke sebuah resolver konten.
Memperbarui:
Ganti mDB.update(id, word); dengan permintaan update ke sebuah resolver konten.
4.3 Implementasikan insert() di penyedia konten
Metode insert() di penyedia konten merupakan pass-through. Jadi, Anda
memanggil metode insert() OpenHelper,
mengonversi long id yang dikembalikan ke sebuah URI konten ke item yang disisipkan,
dan mengembalikan URI tersebut.
public Uri insert(Uri uri, ContentValues values) {
long id = mDB.insert(values);
return Uri.parse(CONTENT_URI + "/" + id);
}
4.4 Perbaiki insert() di WordListOpenHelper
Android Studio melaporkan kesalahan untuk parameter values.
Buka WordListOpenHelper. Metode insert() ditulis untuk mengambil parameter String.
Ubah parameter menjadi tipe ContentValues.
Hapus deklarasi dan penetapan values di isi metode.
4.5 Implementasikan update() di penyedia konten
Perbaiki metode update dengan cara yang sama seperti yang Anda pakai untuk memperbaiki metode insert.
Di WordListContentProvider, implementasikan update(), yang merupakan satu baris kode yang meneruskan id dan word sebagai argumen.
Di MainActivity, buat variabel anggota untuk tampilan teks dan lakukan inisialisasi di onCreate().
Di onClickDisplayEntries(), gunakan pernyataan switch untuk memeriksa tombol mana yang ditekan. Gunakan view id untuk mengenali tombol. Cetak pernyataan log untuk setiap kasus.
Di onClickDisplayEntries(), di bagian akhir, tambahkan beberapa teks ke TextView.
Seperti biasanya, ekstrak sumber daya string.
Tugas 2: Membuat kelas Contract, URI, dan data tiruan
2.1. Buat kelas Contract
Buat kelas Java Contract publik yang baru dengan tanda tangan berikut. Ini harus final.
public final class Contract {}
Untuk mencegah seseorang tidak sengaja membuat instance kelas Contract, berikan constructor pribadi kosong.
private Contract() {}
Di kelas Contract, buat sebuah konstanta untuk AUTHORITY. Untuk menjadikan Authority unik, gunakan nama paket yang ditambah dengan “provider.” public static final String AUTHORITY = "com.android.example.minimalistcontentprovider.provider";
Buat konstanta untuk CONTENT_PATH. Jalur konten mengidentifikasi data. Anda harus menggunakan sesuatu yang deskriptif, misalnya, nama tabel atau file atau jenis data, misalnya “words”. public static final String CONTENT_PATH = "words";
Buat konstanta untuk CONTENT_URI. Ini adalah URI yang bergaya content:// yang menunjuk ke satu rangkaian data. Jika Anda memiliki beberapa “data container” di backend, Anda harus membuat URI konten untuk masing-masing data container tersebut.
[URI[(https://developer.android.com/reference/android/net/Uri.html) adalah kelas helper untuk membangun dan memanipulasi URI. Karena ini tidak pernah berubah, string untuk semua instance kelas Contract, Anda bisa melakukan inisialisasi secara statis. public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH);
Buat konstanta bantu untuk ALL_ITEMS. Ini adalah nama kumpulan data yang akan Anda gunakan saat mengambil semua kata. Nilainya -2 karena ini adalah nilai terendah pertama yang tidak dikembalikan oleh panggilan metode. static final int ALL_ITEMS = -2;
Buat konstanta bantu untuk WORD_ID. Ini adalah id yang akan Anda gunakan saat mengambil satu kata. static final String WORD_ID = "id";
Deklarasikan tipe MIME untuk satu item data.
static final String SINGLE_RECORD_MIME_TYPE = "vnd.android.cursor.item/vnd.com.example.provider.words";
Deklarasikan tipe MIME untuk beberapa catatan.
static final String MULTIPLE_RECORD_MIME_TYPE = "vnd.android.cursor.dir/vnd.com.example.provider.words";
2.4 Buat data tiruan
Penyedia konte selalu menyajikan hasil sebagai Cursor dalam format tabel yang mirip dengan database SQL. Ini terpisah dari bagaimana data sebenarnya disimpan. Aplikasi ini menggunakan larik string kata.
Dalam strings.xml, tambahkan satu daftar kata yang pendek:
Tugas 3: Mengimplementasikan kelas MiniContentProvider
Buat kelas Java MiniContentProvider yang memperluas ContentProvider. (Untuk praktik ini, jangangunakan opsi menu Create Class > Other > Content Provider.)
Implementasikan metode (Code > Implement methods).
Tambahkan tag log.
Tambahkan variabel anggota untuk data tiruan.
public String[] mData;
Di onCreate(), inisialisasikan mData dari larik kata dan kembalikan true.
3.2. Terbtikan penyedia konten dengan menambahkannya ke manifest Android.
Untuk mengetahui penyedia konten, aplikasi Anda dan aplikasi lain perlu mengetahui bahwa penyedia konten ada. Tambahkan deklarasi untuk penyedia konten ke manifes Android di dalam sebuah .
Deklarasi berisi nama penyedia konten dan otoritas (identifier uniknya).
Dalam AndroidManifest, di dalam tag aplikasi, setelah tag penutup aktivitas, tambahkan:
Buat perubahan berikut di kelas MiniContentProvider.
Dalam kelas MiniContentProvider, buat variabel statis pribadi untuk UriMatcher.
Argumen untuk constructor menentukan nilai untuk dikembalikan jika tidak ada kecocokan. Sebagai praktik terbaik, gunakan UriMatcher.NO_MATCH.
private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
Buat metode Anda sendiri untuk menginisialisasi URI matcher.
private void initializeUriMatching(){}
Dalam metode initializeUriMatching(), tambahkan URI yang diterima penyedia konten Anda ke matcher dan tetapkan sebagai kode integer. Ini adalah URI berdasarkan otoritas dan jalur konten yang ditetapkan di Contract.
Simbol # mencocokkan string karakter numerik dengan panjang berapa saja. Di aplikasi ini, ini mengacu pada indeks kata di larik string. Di aplikasi produksi, ini bisa jadi id entri dalam database. Tetapkan URI ini nilai numerik 1.
URI kedua adalah yang Anda tentukan di Contract untuk mengembalikan semua item. Tetapkan nilai numerik 0. sUriMatcher.addURI(Contract.AUTHORITY, Contract.CONTENT_PATH, 0);
3.4 Implementasikan metode getType()
Metode getType() penyedia konten mengembalikan tipe MIME untuk setiap URI yang ditetapkan.
Kecuali Anda melakukan sesuatu yang khusus di kode Anda, implementasi metode ini akan sangat mirip untuk penyedia konten apa pun. Ini melakukan yang berikut:
Projection: Sebuah larik string dengan nama kolom untuk dikembalikan. Menyetel ini ke null akan mengembalikan semua kolom. Jika hanya ada satu kolom, seperti di contoh ini, menyetel ini secara eksplisit adalah opsional, tetapi bisa berguna untuk tujuan dokumentasi. // Only get words. String[] projection = new String[] {Contract.CONTENT_PATH};
selectionClause: Klausa argumen untuk kriteria pilihan, yaitu, baris mana yang akan dikembalikan. Diformat sebagai klausa SQL WHERE (mengecualikan kata kunci “WHERE”). Meneruskan null akan mengembalikan semua baris untuk tampilan URI yang diberikan. Karena ini akan berbeda sesuai dengan tombol mana yang ditekan, deklarasikan ini sekarang dan setel nanti.
String selectionClause;
selectionArgs: Nilai argumen untuk kriteria pilihan. Jika Anda menyertakan ? di String selection, ? akan digantikan oleh nilai dari selectionArgs, dengan urutan munculnya.
PENTING: Praktik terbaik keamanan adalah selalu memisahkan selection dan selectionArgs.
String selectionArgs[];
sortOrder: Urutan untuk mengurutkan hasil. Diformat sebagai klausa SQL ORDER BY (mengecualikan kata kunci ORDER BY). Biasanya ASC atau DESC; null meminta tata urutan default, yang bisa jadi tidak berurutan.
// For this example, accept the order returned by the response.
String sortOrder = null;
4.3. Putuskan kriteria selection
Nilai selectionClause dan selectionArgs bergantung pada tombol mana yang ditekan di UI.
Untuk menampilkan semua kata, setel kedua argumen ke null.
Untuk mendapatkan kata pertama, kueri kata dengan ID 0. (Ini mengasumsikan bahwa ID kata dimulai dari 0 dan dibuat sesuai urutan. Anda mengetahui ini, karena informasinya diperlihatkan di contract. Untuk penyedia konten yang berbeda, sebaiknya ketahui id-nya dan telusuri dengan cara yang berbeda.)
Ganti blok switch yang sudah ada dengan kode berikut ini di onClickDisplayEntries, sebelum Anda mendapatkan content resolver.
Dalam bidang q masukkan nama buku, atau sebagain nama buku. Parameter q adalah satu-satunya bidang yang diwajibkan.
Gunakan bidang maxResults dan printType untuk membatasi hasil ke 10 buku yang cocok yang dicetak. Bidang maxResults mengambil nilai integer yang membatasi jumlah hasil per kueri. Bidang printType mengambil satu dari tiga argumen string: all, yang tidak membatasi hasil menurut tipe sama sekali; books, yang hanya memberikan hasil buku dalam bentuk cetak; dan magazines yang memberikan hasil majalah saja.
Pastikan switch “Authorize requests using OAuth 2.0” di bagian atas formulir dinonaktifkan. Klik Execute without OAuth di bagian bawah formulir.
Gulir ke bawah untuk melihat Permintaan dan Respons.
1.2 Menganalisis Respons API Books
Di bagian bawah laman Anda bisa melihat Respons terhadap kueri. Respons menggunakan formatJSON, yang merupakan format umum untuk respons kueri API. Dalam laman web API Explorer, kode JSON diformat dengan baik agar dapat dibaca oleh manusia. Dalam aplikasi Anda, repons JSON akan dikembalikan dari layanan API sebagai string tunggal, dan Anda perlu melakukan parsing pada string tersebut untuk mengesktrak informasi yang diperlukan.
Dalam bagian Respons, temukan nilai untuk kunci “title”. Perhatikan bahwa hasil ini memiliki nilai dan kunci tunggal.
Termukan nilai untuk kunci “authors”. Perhatikan bahwa kunci ini berisi larik nilai.
Dalam praktik ini Anda hanya akan mengembalikan judul dan penulis item pertama.
Tugas 2: Membuat “Who Wrote it?” Aplikasi
Buat project baru bernama Who Wrote it
Ubah layout menjadi LinearLayout dan tambahkan elemen UI berikut dalam file xml
Dalam file strings.xml, tambahkan sumber daya string berikut ini:
<string name="instructions">Enter a book name, or part of a
book name, or just some text from a book to find
the full book title and who wrote the book!</string>
<string name="button_text">Search Books</string>
<string name="input_hint">Enter a Book Title</string>
Buat metode bernama searchBooks() dalam MainActivity.java untuk menangani tindakan tombol onClick. Seperti pada semua metode onClick, yang satu ini memerlukan View sebagai parameter.
Dalam MainActivity tambahkan variabel EditText, TextView penulis dan TextView judul
Inisialisasi variabel ini dalam onCreate()
Dalam method searchBooks() get EditText dan konversikan ke dalam string
Buat kelas bernama FetchBook
Implementasi method doInBackground()
Buat kelas bernama NetworkUtils
Buat variabel Log_tag
Buat method getBookInfo untuk mengambil nilai string
Buat dua variabel dalam getBookInfo() untuk menyambugkan dan membaca data yang datang
Buat variabel dalam getBookInfo() untuk memasukkan respon dari query dan mengembalikannya
Buat konstanta berikut dalam NetworkUtils
Buat block try, catch dan finally dalam getBookInfo()
Bangun URI dalam block try
Konversi URI ke URL
Buat koneksi URL dan buat permintaan
Baca respon menggunakan InputStream dan StringBuffer lalu konversikan ke string
Tutup block try dan log dalam block catch
Tutup kedua urlConnection dan variabel pembaca dalam block finally
Log nilai variabel bookJSONString sebelum mengebalikannya
Dalam method AsyncTask doInBackground() panggil method getBookInfo()
Tambahkan code berikut dalam method searchBooks()
Jalankan aplikasi
Buka AndroidManifest.xml
Tambahkan tag berikut untuk memberi izin internet
Dalam onPostExecute() tambahkan block try dan catch
Gunakan kelas JSON Java bawaan untuk mendapatkan larik JSON
Iterasi melalui itemsArray
Jika tidak ada hasil yang memenuhi kriteria, setel TextView No Result Found dan hapus TextView authors
Dalam block catch cetak log
Tugas 3. Mengimplementasikan praktik terbaik UI
3.1 Menyembunyikan Keyboard dan Memperbarui TextView
Menambahkan kode berikut ke metode searchBooks() untuk menyembunyikan keyboard saat tombol ditekan:
Menambahkan satu baris kode di bawah panggilan untuk mengeksekusi tugas FetchBook yang mengubah TextView judul untuk menbaca “Loading…” dan menghapus TextView penulis.
Mengekstrak sumber daya String.
Tugas 4. Migrasi ke AsyncTaskLoader
Salin project WhoWroteIt dan ganti nama menjadi WhoWroteItLoade
Buat kelas baru bernama BookLoader
Implementasikan method laodInBackground()
Buat variabel mQueryString
Dalam method loadInBackground dan panggil method getBookInfo()
Loader tidak akan mulai memuat data sampai dipanggil method forceLoad()
Tambahkan implementasi LoaderManager.LoaderCallback ke deklarasi kelas MainActivity
Implementasi method onCreateLoader(), onLoadFinished() dan onLoaderReset()
Dalam method searchBooks() panggil restartLoader()
Dalam onCreateLoader() kembalikan instance kelas BookLoader
Perbarui onLoadFinished
Tambahkan kode berikut di onCreate() untuk menghubungkan ulang ke Loader jika sudah ada:
Catatan: Jika loader ada, inisialisasikan loader. Anda hanya perlu mengaitkan kembali loader ke Aktivitas jika kueri sudah dieksekusi. Dalam status awal aplikasi, data tidak dimuat sehingga tidak ada yang perlu dipertahankan.
Jalankan aplikasi lagi dan putar perangkat. LoaderManager sekarang mempertahankan data di semua konfigurasi perangkat!
Hapus kelas FetchBook karena sudah tidak digunakan lagi.
Ubah tampilan root RelativeLayout ke LinearLayout.
Tambahkan elemen UI penting berikut ke layout untuk MainActivity:
Tampilan
Atribut
Nilai
LinearLayout
android:orientation
vertical
TextView
android:text
android:id
I am ready to start work!
@+id/textView1
Button
android:text
android:onClick
Start Task
startTask
Tugas 2: Membuat subkelas AsyncTask
Buat kelas java baru bernama SimpleAsyncTask
Definisikan variabel mTextView
Implementasi konstruktor untuk AsyncTask
Tambahkan metode doInBackground() yang diperlukan. Letakkan kursor pada deklarasi kelas yang disorot, tekan Alt + Enter (Option + Enter di Mac) dan pilih metode Implement. Pilih doInBackground() dan klik OK:
Implementasikan doInBackground() menjadi seperti di bawah ini
Buat integer acak antara 0 dan 10
Kalikan jumlahnya dengan 200
Buat thread saat ini agar tertidur. (Gunakan Thread.sleep()) dalam blok try/catch.
Kembalikan String “Awake at last after xx milliseconds” (xx adalah jumlah milidetik saat aplikasi tertidur)
Implementasikan method onPostExecute() agar dapat mengambil argumen string
Tugas 3: Mengimplementasikan Langkah Terakhir
3.1 Implementasikan metode yang mulai dengan AsyncTask
Pada MainActivity, tambahkan variabel untuk TextView
Dalam method onCreate(), inisialisasi mTextView
Perbarui TextView untuk menampilkan teks “Napping…”
public void startTask (View view) {
// Put a message in the text view
mTextView.setText("Napping... ");
// Start the AsyncTask.
// The AsyncTask has a callback that will update the text view.
new SimpleAsyncTask(mTextView).execute();
}
Jalankan aplikasi dan klik tombol Start Task
Ganti metode onSaveInstanceState() dalam MainActivity untuk mempertahankan teks di dalam TextView saat aktivitas dimusnahkan:
Buat file sumber daya baru yang bernama integers.xml. Masuk ke direktori sumber daya Anda, klik kanan nama direktori nama dan pilih New > Values resource file.
Beri nama file dengan integers.xml dan klik OK.
Buat konstanta integer antara tag <resources> yang bernama “grid_column_count” dan setel sama dengan 1:
<integer name="grid_column_count">1</integer>
Buat file sumber daya nilai lain, yang bernama integers.xml tetapi dengan karakteristik yang berbeda.
Perhatikan opsi “Available qualifiers” di dialog untuk membuat file sumber daya. Karakteristik ini disebut sebagai “resource qualifiers” dan digunakan untuk melabeli konfigurasi sumber daya untuk beragam situasi.
Pilih Orientation dan tekan simbol >> di tengah dialog untuk mengakses qualifier ini.
Ubah pemilih orientasi Layar ke Landscape dan perhatikan bagaimana nama direktori “values-land” otomatis berubah. Ini adalah inti qualifier sumber daya: nama direktori memberi tahu Android kapan harus menggunakan file layout spesifik. Dalam hal ini, ini terjadi saat ponsel diputar ke mode lanskap.
Klik OK untuk membuat file layout baru.
salin konstanta integer yang Anda buat ke dalam file sumber daya ini, tetapi ubah nilainya menjadi 2.
Anda sekarang seharusnya memiliki dua file integers.xml individual. Dalam tampilan proyek “Android” di Android Studio, ini seharusnya dikelompokkan ke dalam folder “integers.xml” yang setiap file dalamnya dilabeli dengan qualifier yang Anda pilih (“land” dalam hal ini).
1.2 Modifikasi MainActivity
Dalam onCreate() di MainActivity, dapatkan integer dari file sumber daya integers.xml:
int gridColumnCount = getResources().getInteger(R.integer.grid_column_count);
Android Runtime akan memproses penentuan file integers.xml mana yang akan digunakan, bergantung pada status perangkat.
Ubah LinearLayoutManager ke GridLayoutManager, dengan meneruskan konteks dan integer yang baru dibuat:
Jalankan aplikasi dan putar perangkat. Jumlah kolom berubah secara otomatis dengan orientasi perangkat.
Saat menggunakan aplikasi dalam mode lanskap, Anda akan melihat bahwa fungsionalitas gesek untuk menutup tidak lagi mudah digunakan, karena item sekarang berada dalam grid, bukan dalam daftar. Anda bisa menggunakan variabel gridColumnCount untuk menonaktifkan tindakan gesek jika terdapat lebih dari satu kolom:
Sebelum membuat modifikasi pada aplikasi, jelajahi strukturnya saat ini. Strukturnya berisi elemen berikut:
Sport.java
Kelas ini mewakili model data untuk setiap baris data di RecyclerView. Sekarang, ini berisi sebuah bidang untuk judul olahraga dan sebuah bidang untuk beberapa informasi tentang olahraga.
/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.materialme;
/**
* Data model for each row of the RecyclerView.
*/
class Sport {
//Member variables representing the title and information about the sport
private String title;
private String info;
/**
* Constructor for the Sport data model
* @param title The name if the sport.
* @param info Information about the sport.
*/
Sport(String title, String info) {
this.title = title;
this.info = info;
}
/**
* Gets the title of the sport
* @return The title of the sport.
*/
String getTitle() {
return title;
}
/**
* Gets the info about the sport
* @return The info about the sport.
*/
String getInfo() {
return info;
}
}
SportsAdapter.java
Ini adalah adaptor untuk RecyclerView. Ini menggunakan ArrayList objek olahraga sebagai datanya dan mengisi setiap baris dengan data ini.
/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.materialme;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
/***
* The adapter class for the RecyclerView, contains the sports data
*/
class SportsAdapter extends RecyclerView.Adapter<SportsAdapter.ViewHolder> {
//Member variables
private ArrayList<Sport> mSportsData;
private Context mContext;
/**
* Constructor that passes in the sports data and the context
* @param sportsData ArrayList containing the sports data
* @param context Context of the application
*/
SportsAdapter(Context context, ArrayList<Sport> sportsData) {
this.mSportsData = sportsData;
this.mContext = context;
}
/**
* Required method for creating the viewholder objects.
* @param parent The ViewGroup into which the new View will be added after it is bound to an adapter position.
* @param viewType The view type of the new View.
* @return The newly create ViewHolder.
*/
@Override
public SportsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false));
}
/**
* Required method that binds the data to the viewholder.
* @param holder The viewholder into which the data should be put.
* @param position The adapter position.
*/
@Override
public void onBindViewHolder(SportsAdapter.ViewHolder holder, int position) {
//Get current sport
Sport currentSport = mSportsData.get(position);
//Populate the textviews with data
holder.bindTo(currentSport);
}
/**
* Required method for determining the size of the data set.
* @return Size of the data set.
*/
@Override
public int getItemCount() {
return mSportsData.size();
}
/**
* ViewHolder class that represents each row of data in the RecyclerView
*/
class ViewHolder extends RecyclerView.ViewHolder {
//Member Variables for the TextViews
private TextView mTitleText;
private TextView mInfoText;
/**
* Constructor for the ViewHolder, used in onCreateViewHolder().
* @param itemView The rootview of the list_item.xml layout file
*/
ViewHolder(View itemView) {
super(itemView);
//Initialize the views
mTitleText = (TextView)itemView.findViewById(R.id.title);
mInfoText = (TextView)itemView.findViewById(R.id.subTitle);
}
void bindTo(Sport currentSport){
//Populate the textviews with data
mTitleText.setText(currentSport.getTitle());
mInfoText.setText(currentSport.getInfo());
}
}
}
MainActivity.java
MainActivity melakukan inisialisasi RecyclerView dan adaptor, dan membuat data dari file sumber daya.
/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.materialme;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
/***
* Main Activity for the Material Me app, a mock sports news application with poor design choices
*/
public class MainActivity extends AppCompatActivity {
//Member variables
private RecyclerView mRecyclerView;
private ArrayList<Sport> mSportsData;
private SportsAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initialize the RecyclerView
mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);
//Set the Layout Manager
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//Initialize the ArrayLIst that will contain the data
mSportsData = new ArrayList<>();
//Initialize the adapter and set it ot the RecyclerView
mAdapter = new SportsAdapter(this, mSportsData);
mRecyclerView.setAdapter(mAdapter);
//Get the data
initializeData();
}
/**
* Method for initializing the sports data from resources.
*/
private void initializeData() {
//Get the resources from the XML file
String[] sportsList = getResources().getStringArray(R.array.sports_titles);
String[] sportsInfo = getResources().getStringArray(R.array.sports_info);
//Clear the existing data (to avoid duplication)
mSportsData.clear();
//Create the ArrayList of Sports objects with the titles and information about each sport
for(int i=0;i<sportsList.length;i++){
mSportsData.add(new Sport(sportsList[i],sportsInfo[i]));
}
//Notify the adapter of the change
mAdapter.notifyDataSetChanged();
}
}
strings.xml
File sumber daya ini berisi semua data untuk aplikasi, termasuk judul dan informasi untuk setiap olahraga.
<resources>
<string name="app_name">Material Me!</string>
<string name="title_placeholder">Title</string>
<string name="news_placeholder">News</string>
<string name="sports_info_placeholder">Here is some news</string>
<string-array name="sports_titles">
<item>Baseball</item>
<item>Badminton</item>
<item>Basketball</item>
<item>Bowling</item>
<item>Cycling</item>
<item>Golf</item>
<item>Running</item>
<item>Soccer</item>
<item>Swimming</item>
<item>Table Tennis</item>
<item>Tennis</item>
</string-array>
<string-array name="sports_info">
<item>Here is some Baseball news!</item>
<item>Here is some Badminton news!</item>
<item>Here is some Basketball news!</item>
<item>Here is some Bowling news!</item>
<item>Here is some Cycling news!</item>
<item>Here is some Golf news!</item>
<item>Here is some Running news!</item>
<item>Here is some Soccer news!</item>
<item>Here is some Swimming news!</item>
<item>Here is some Table Tennis news!</item>
<item>Here is some Tennis news!</item>
</string-array>
</resources>
list_item.xml
File layout ini mendefinisikan setiap baris RecyclerView. Ini terdiri dari tiga TextView, satu untuk setiap bagian data (judul dan info untuk setiap olahraga) dan satu digunakan sebagai label.
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2016 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:text="@string/title_placeholder"
android:padding="8dp"
style="@style/TextAppearance.AppCompat.Headline"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/newsTitle"
android:text="@string/news_placeholder"
android:padding="8dp"
style="@style/TextAppearance.AppCompat.Subhead" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/subTitle"
android:text="@string/sports_info_placeholder"
android:padding="8dp"
style="@style/TextAppearance.AppCompat.Subhead" />
</LinearLayout>
Tugas 2: Menambahkan CardView dan Gambar
2.1 Tambahkan CardView
Di file build.gradle tingkat aplikasi Anda, tambahkan baris berikut ke blok dependensi: Catatan: Versi pustaka dukungan mungkin telah berubah sejak penulisan praktik ini. Perbarui ke versi paling baru dan sinkronkan file gradle Anda.
Di file list_item.xml, kurung LinearLayout root dengan CardView dengan atribut berikut:
Atribut
Nilai
android:layout_width
“match_parent”
android:layout_height
“wrap_content”
android:layout_margin
“8dp”
Catatan: Anda perlu memindahkan deklarasi skema (xmlns:android="http://schemas.android.com/apk/res/android") dari LinearLayout ke CardView yang sekarang menjadi View tingkat tinggi file layout Anda.
Salin file ini ke direktori res > drawable di aplikasi Anda.
Definisikan larik yang berisi semua jalur ke drawable sebagai item di file string.xml Anda. Pastikan larik dalam urutan yang sama dengan larik judul olahraga:
Objek Sport.java perlu menyertakan sumber daya yang dapat digambar yang berkaitan dengan olahraga. Untuk mencapai ini:
Tambahkan variabel anggota integer ke objek Sport yang akan berisi sumber daya yang dapat digambar:
private final int imageResource;
Modifikasi konstruktor sehingga akan mengambil sebuah integer sebagai parameter dan menetapkannya ke variabel anggota:
public Sport(String title, String info, int imageResource) {
this.title = title;
this.info = info;
this.imageResource = imageResource;
}
Buat getter untuk integer sumber daya:
public int getImageResource() {
return imageResource;
}
Perbaiki metode initializeData()
Dalam metode initializeData(), dapatkan TypedArray id sumber daya dengan memanggil getResources().obtainTypedArray(), dan meneruskan nama larik sumber daya yang dapat digambar, yang Anda definisikan di file strings.xml:
Anda bisa mengakses elemen pada indeks i di TypedArray dengan menggunakan metode “get” yang sesuai, bergantung pada tipe sumber daya di larik. Dalam kasus spesifik ini, ini berisi ID sumber daya, sehingga Anda bisa menggunakan metode getResourceId().
Perbaiki kode di loop yang membuat objek Sport, dengan menambahkan ID sumber daya yang dapat digambar yang sesuai sebagai parameter ketiga dengan memanggil getResourceId() di TypedArray:
Bersihkan data di TypedArray setelah Anda membuat ArrayList data Sport:
sportsImageResources.recycle();
2.5 Tambahkan ImageView ke item daftar
Ubah LinearLayout di dalam file list_item.xml menjadi RelativeLayout, dan hapus atribut orientasi.
Tambahkan ImageView dengan atribut berikut:
Atribut
Nilai
android:layout_width
“match_parent”
android:layout_height
“wrap_content”
android:id
“@+id/sportsImage”
android:adjustViewBounds
“true”
Atribut adjustViewBounds membuat ImageView menyesuaikan batasnya untuk mempertahankan rasio aspek gambar.
Tambahkan atribut berikut ke TextView yang ada:
TextView id: title
Atribut
Nilai
android:layout_alignBottom
“@id/sportsImage”
android:theme
“@style/ThemeOverlay.AppCompat.Dark”
TextView id: newsTitle
Atribut
Nilai
android:layout_below
“@id/sportsImage”
android:textColor
“?android:textColorSecondary”
TextView id: subTitle
android:layout_below
“@id/newsTitle”
Catatan: Tanda tanya di atribut textColor di atas (“?android:textColorSecondary”) artinya adalah framework akan menerapkan nilai dari tema yang saat ini diterapkan. Dalam hal ini, atribut ini diwarisi dari tema “Theme.AppCompat.Light.DarkActionBar” yang mende
2.6 Muat gambar menggunakan Glide
Tambahkan dependensi berikut untuk Glide, di file build.gradle tingkat aplikasi Anda:
compile 'com.github.bumptech.glide:glide:3.5.2'
Tambahkan variabel di kelas SportsAdapter, kelas ViewHolder untuk ImageView, dan lakukan inisialisasi di konstruktor ViewHolder:
Tambahkan baris kode berikut ke onBindViewHolder() untuk mendapatkan sumber daya gambar dari objek Sport dan muat ke dalam ImageView menggunakan Glide:
Begitulah cara memuat gambar dengan Glide. Glide juga memiliki beberapa fitur tambahan yang memungkinkan Anda mengubah ukuran, mentransformasi, dan memuat gambar dengan berbagai cara. Kunjungi laman GitHub Glide untuk mengetahui selengkapnya.
Tugas 3: Membuat CardView Anda bisa digesek, dipindahkan, dan diklik
3.1 Implementasikan gesek untuk menutup
Lakukan yang berikut:
Buat objek ItemTouchHelper baru, di metode onCreate() MainActivity.java. Untuk argumennya, buat instance baru ItemTouchHelper.SimpleCallback dan tekan Enter untuk membuat Android Studio mengisi metode yang diperlukan: onMove() dan onSwiped().
Catatan: Jika metode yang diperlukan tidak otomatis ditambahkan, klik bola lampu merah dan pilih Implement methods.
Konstruktor SimpleCallback akan diberi garis bawah merah karena Anda belum menyediakan parameter yang diperlukan: arah yang Anda rencanakan untuk mendukung pemindahan dan penggesekan item daftar.
Karena kita hanya mengimplementasikan gesek untuk menutup sekarang, Anda harus meneruskan 0 untuk arah pemindahan yang didukung dan ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT untuk arah penggesekan yang didukung:
Sekarang Anda harus mengimplementasikan perilaku yang diinginkan di onSwiped(). Dalam hal ini, menggesek kartu ke kiri atau ke kanan akan menghapusnya dari daftar. Panggili remove() di rangkaian data, dengan meneruskan indeks yang sesuai dengan mendapatkan posisi dari ViewHolder:
Agar RecyclerView dapat menggerakkan penghapusan dengan benar, Anda juga harus memanggil notifyItemRemoved(), lagi dengan meneruskan indeks yang sesuai dengan mendapatkan posisi dari ViewHolder:
Setelah membuat objek ItemTouchHelper baru di metode onCreate() MainActivity, pangil attachToRecyclerView() di instance ItemTouchHelper untuk menambahkannya ke RecyclerView Anda:
helper.attachToRecyclerView(mRecyclerView);
Implementasikan tampilan detail
Buat aktivitas baru dengan masuk ke File > New > Activity > Empty Activity.
Beri nama DetailActivity, dan terima semua default.
Di file layout yang baru dibuat, buang padding dari RelativeLayout rootview.
Salin semua dari tampilan TextView dan ImageView dari file list_item.xml ke file activity_detail.xml.
Tambahkan kata “Detail” ke setiap referensi ke sebuah id, untuk membedakannya dengan id list_item. Misalnya, ubah id ImageView dari sportsImage ke sportsImageDetail, serta semua referensi ke id ini untuk penepatan relatif, seperti layout_below.
Untuk textview subTitleDetal, buang semua string teks placeholder dan tempelkan paragraf teks generik untuk menggantikan semua teks detail (Misalnya, beberapa paragraf Lorem Ipsum).
Ubah padding TextView menjadi 16dp.
Bungkus keseluruhan activity_detail.xml di ScrollView dan ubah atribut layout_height RelativeLayout ke “wrap_content”.
Catatan: Atribut untuk ScrollView mungkin berwarna merah terlebih dulu. Ini karena Anda harus menambahkan atribut yang mendefinisikan namespace Android. Ini adalah atribut yang muncul di semua file layout Anda secara default: xmlns:android="http://schemas.android.com/apk/res/android".
Cukup pindahkan deklarasi ini ke tampilan tingkat atas dan warna merah pun akan hilang.
Dalam kelas SportsAdapter, buat kelas dalam ViewHolder agar mengimplementasikan View.OnClickListener dan dan implementasikan metode yang diperlukan (onClick()).
Setel OnClickListener ke itemview di konstruktor:
itemView.setOnClickListener(this);
Dalam metode onClick(), dapatkan objek Sport untuk item yang diklik menggunakan getAdapterPosition().
Sport currentSport = mSportsData.get(getAdapterPosition());
Buat sebuah Intent yang meluncurkan aktivitas Detail, dan letakkan judul dan sumber daya gambar sebagai ekstra di Intent:
Intent detailIntent = new Intent(mContext, DetailActivity.class);
detailIntent.putExtra("title", currentSport.getTitle());
detailIntent.putExtra("image_resource", currentSport.getImageResource());
Panggil startActivity() di variabel mContext, dengan meneruskan Intent baru.
Dalam DetailActivity.java, lakukan inisialisasi ImageView dan TextView judul di onCreate():
Tambahkan baris kode berikut ke file build.gradle tingkat aplikasi untuk menambahkan dependensi pustaka dukungan desain:
compile 'com.android.support:design:24.2.1'
Gunakan studio aset vektor untuk mengunduh ikon untuk digunakan di FAB. Tombol akan menyetel ulang konten di RecyclerView sehingga ikon ini akan melakukan: . Mengubah nama ke ic_reset.
Di activity_main.xml, tambahkan tampilkan Tombol Aksi Mengambang dengan parameter berikut:
Atribut
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:layout_alignParentBottom
“true”
android:layout_alignParentRight
“true
android:layout_margin
“16dp”
android:src
“@drawable/ic_reset”
android:onClick
resetSports
Definisikan metode resetSports() di MainActivity.java agar cukup memanggil initializeData() untuk menyetel ulang data.
Jalankan aplikasi. Anda sekarang bisa menyetel ulang data dengan menekan FAB.
Catatan: Karena aktivitas dihapus dan dibuat ulang saat konfigurasi berubah, memutar perangkat akan menyetel ulang data pada implementasi ini. Agar perubahan menjadi persisten (seperti kasus mengubah urutan dan membuang data), Anda harus mengimplementasikan onSaveInstanceState() atau menuliskan perubahan ke sumber yang persisten (seperti database atau SharedPreferences).
Mulai Android Studio dan buat proyek Android Studio baru.
Beri nama proyek Anda “Scorekeeper”
Terima default untuk Company Domain dan Project location.
Pilih template Empty Activity. 1 Terima nama default untuk aktivitas, pastikan Generate Layout Filedicentang dan klik Finish.
1.2 Buat layout untuk aktivitas utama
Buka file layout untuk aktivitas utama.
Hapus TextView yang berisi “Hello World.”
Ubah tampilan root menjadi LinearLayout dan tambahkan atribut berikut (tanpa menghapus atribut yang sudah ada):
Atribut
Nilai
android:orientation
“vertical”
Di dalam LinearLayout, tambahkan dua grup tampilan RelativeLayout (satu untuk menampung skor untuk setiap tim) dengan atribut berikut:
Atribut
Nilai
android:layout_width
“match_parent”
android:layout_height
“0dp”
android:layout_weight
“1”
Tambahkan dua tampilan ImageButton (satu untuk meningkatkan skor dan satu untuk menurunkan skor) dan sebuah TextView untuk menampilkan skor di antara tombol ke setiap RelativeLayout.
Tambahkan atribut android:id ke TextView skor dan semua ImageButton.
Tambahkan satu lagi TextView ke setiap RelativeLayout di atas skor untuk menunjukkan Nama Tim.
Implementasikan fungsionalitas onClick untuk tombol Anda.
Di MainActivity Anda, implementasi dua metode onClick: increaseScore() dan decreaseScore().
Catatan: semua metode onClick memiliki tanda tangan yang sama – metode ini mengembalikan void dan mengambil View sebagai argumen.
Tombol kiri akan mengurangi TextView skor, sedangkan tombol kanan akan menambahnya.
Tugas 2: Membuat sumber daya Drawable
2.1 Buat Drawable Bentuk
Klik kanan folder drawable di direktori sumber daya.
Pilih New > Drawable resource file.
Beri nama file “button_background” dan klik OK.
Buang semua kode, kecuali:
<?xml version="1.0" encoding="utf-8"?>
Tambahkan kode berikut yang membuat bentuk oval dengan garis luar:
2.2 Terapkan drawable bentuk sebagai latar belakang
Buka file layout untuk aktivitas utama Anda.
Untuk semua tombol, tambah drawable sebagai latar belakang: android:background="@drawable/button_background". Perhatikan bahwa latar belakang otomatis diskalakan agar pas dengan ukuran tampilan.
Ukuran tombol besarnya harus sedemikian rupa sehingga bisa dirender dengan benar di semua perangkat. Ubah “layout_height” dan “layout_width” untuk setiap tombol menjadi 70dp, yaitu ukuran yang baik untuk kebanyakan perangkat. Menggunakan dimensi yang di-hardcode bukanlah praktik terbaik, tetapi menggunakan ketebalan dengan layout linear yang dilapiskan untuk mendapatkan ukuran yang diinginkan akan melibatkan terlalu banyak detail untuk praktik ini.
Ekstrak sumber daya dimensi sehingga Anda bisa mengaksesnya di satu lokasi. Untuk informasi cara melakukannya, lihat Appendix.
Jalankan aplikasi Anda.
Tugas 3: Tata gaya tampilan Anda
3.1 Buat gaya tombol
Dalam direktori sumber daya, cari dan buka file “values/styles.xml”. Di file inilah semua kode gaya Anda ditempatkan. Gaya “AppTheme” selalu ditambahkan secara otomatis dan Anda bisa melihat bahwa gaya ini diluaskan dari “Theme.AppCompat.Light.DarkActionBar”.
Tekan Ctrl – O untuk membuka menu Override Method di file Java aktivitas utama Anda dan pilih metode onCreateOptionsMenu yang terletak di bawah kategori “android.app.Activity”. Klik OK.
Mekarkan menu yang baru Anda buat di dalam metode onCreateOptionsMenu() :
Di file styles.xml, ubah induk AppTheme menjadi “Theme.AppCompat.DayNight.DarkActionBar.
Ganti metode onOptionsItemSelected() di MainActivity dan periksa item menu mana yang diklik:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Check if the correct item was clicked
if(item.getItemId()==R.id.night_mode){}
}
Sebagai respons terhadap klik pada tombol menu, Anda bisa memverifikasi setelan mode malam saat ini dengan memanggil AppCompatDelegate.getDefaultNightMode().
Jika mode malam diaktifkan, ubah menjadi status nonaktif:
//Get the night mode state of the app
int nightMode = AppCompatDelegate.getDefaultNightMode();
//Set the theme mode for the restarted activity
if(nightMode == AppCompatDelegate.MODE_NIGHT_YES) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
Tema hanya bisa berubah saat aktivitas sedang dibuat, sehingga panggil recreate() agar perubahan tema bisa diterapkan.
Metode onOptionsItemSelected() Anda harus mengembalikan true, karena klik item ditangani.
Jalankan aplikasi Anda. Menu “Mode Malam” sekarang akan mengalihkan tema aktivitas Anda. Anda mungkin memperhatikan bahwa label untuk item menu Anda selalu tampak sebagai “Night Mode” yang mungkin membingungkan pengguna jika aplikasi Anda sudah dalam tema gelap.
Tambahkan kode berikut di metode onCreateOptionsMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu from XML
getMenuInflater().inflate(R.menu.main_menu, menu);
//Change the label of the menu based on the state of the app
int nightMode = AppCompatDelegate.getDefaultNightMode();
if(nightMode == AppCompatDelegate.MODE_NIGHT_YES){
menu.findItem(R.id.night_mode).setTitle(R.string.day_mode);
} else{
menu.findItem(R.id.night_mode).setTitle(R.string.night_mode);
}
return true;
}
Jalankan aplikasi Anda. Label tombol menu sekarang berubah dengan tema.
4.4 SaveInstanceState
Ganti metode onSaveInstanceState() di MainActivity agar mempertahankan nilai dua TextView skor:
Mungkin terdapat baris yang sudah ada seperti ini, tetapi jumlahnya mungkin berbeda: compile 'com.android.support:appcompat-v7:23.1.1'
Tambahkan baris Anda bawah baris tersebut.
Pastikan nomor versi baris Anda sesuai dengan nomor versi baris tersebut.
Pastikan nomor versi semua pustaka sama dan cocok dengan compiledSdkVersion di bagian atas file. Jika tidak cocok, Anda akan mendapatkan kesalahan build time.
Buka file MainActivity.java.
Tambahkan variabel anggota privat untuk daftar tertaut mWordList.
Tambahakn variabel mCount penghitung integer untuk melacak angka kata.
Tambahkan kode yang mengisikan mWordList dengan kata. Gabungkan string “Word” dengan nilai mCount, lalu tingkatkan hitungan angka.
Karena Anda belum bisa menampilkan kata untuk pengujian, tambahkan pernyataan log yang memverifikasi bahwa kata ditambahkan ke daftar tertaut dengan benar.
Jalankan aplikasi Anda untuk memastikan tidak ada kesalahan.
UI aplikasi tidak berubah, tetapi Anda seharusnya melihat daftar pesan log di logcat, seperti: android.example.com.wordlist D/WordList: Word 1.
Tugas 3: Membuat RecyclerView
3.1 Buat layout utama di activity_main.xml
Di main_activity.xml, ganti kode yang dibuat oleh Empty Activity dengan kode untuk CoordinatorLayout, lalu tambahkan RecyclerView:
Buka activity_main.xml.
Pilih semua kode di activity_main.xml dan ganti dengan kode ini:
Jalankan aplikasi Anda dan pastikan tidak ada kesalahan yang ditampilkan di logcat. Anda hanya akan melihat layar kosong karena Anda belum menempatkan item apa pun ke dalam RecyclerView.
3.2 Buat layout untuk satu item daftar
Buat layout item kata sederhana menggunakan LinearLayout vertikan dengan TextView:
Klik kanan folder app/res/layout dan pilih New > Layout resource file.
Beri nama file wordlist_item dan klik OK.
Dalam mode Text, ubah LinearLayout yang dibuat dengan file agar sesuai dengan atribut berikut. Ekstrak sumber daya selagi Anda bekerja.
Atribut
Nilai
android:layout_width
“match_parent”
android:layout_height
“wrap_content”
android:orientation
“vertical”
android:padding
“6dp”
Tambahkan TextView untuk kata ke LinearLayout:
Atribut
Nilai
android:id
“@+id/word”
android:layout_width
“match_parent”
android:layout_height
“wrap_content”
android:textSize
“24sp”
android:textStyle
“bold”
3.3 Buat gaya dari atribut TextView
Saat wordlist_item.xml terbuka, arahkan mouse ke atas bagian TextView yang baru Anda buat dan Klik kanan > Refactor > Extract > Style.
Dalam dialog Extract Android Style dialog,
Beri nama gaya Anda dengan word_title.
Biarkan semua kotak tidak tercentang.
Centang kotak Launch ‘Use Style Where Possible‘.
Klik OK.
Temukan dan periksa gaya word_title di values/styles.xml.
Jalankan aplikasi Anda. Karena Anda telah membuang tampilan teks “Hello World” default, Anda akan melihat judul “RecyclerView” dan tampilan kosong
3.4. Buat adapter dengan holder tampilan
Klik kanan java/com.android.example.recyclerview dan pilih New >> Java Class.
Beri nama kelas sebagai WordListAdapter.
Klik deklarasi kelas (WordListAdapter) lalu klik bola lampu merah di sebelah kiri panel. Pilih Implement methods. Ini akan memunculkan kotak dialog yang meminta Anda memilih metode mana yang akan diimplementasikan. Pilih ketiga metode dan klik OK.
Di dalam kelas WordListAdapter, tambahkan kelas dalam WordViewHolder dengan tanda tangan ini:
class WordViewHolder extends RecyclerView.ViewHolder {}
Di dalam kelas WordListAdapter, tambahkan kelas dalam WordViewHolder dengan tanda tangan ini:
class WordViewHolder extends RecyclerView.ViewHolder {}
Anda akan melihat kesalahan tentang konstruktor default yang tidak ada. Anda bisa melihat detail tentang kesalahan dengan mengarahkan mouse ke atas kode sumber yang digaris bawah merah atau ke atas baris horizontal merah di margin kanan panel open-files.
Tambahkan variabel ke kelas dalam WordViewHolder untuk tampilan teks dan adaptor:
public final TextView wordItemView;
final WordListAdapter mAdapter;
Dalam kelas dala WordViewHolder, tambahkan sebuah konstruktor yang melakukan inisialisasi tampilan teks holder tampilan dari sumber daya XML dan menyetel adaptornya:
Jalankan aplikasi Anda untuk memastikan tidak ada kesalahan. Anda masih akan melihat tampilan kosong. Perhatikan peringatan E/RecyclerView: No adapter attached; skipping layout di logcat.
3.6 Menyimpan data Anda di adaptor
Untuk menampung data Anda di adaptor, buat daftar string yang tertaut dan privat di WordListAdapter dan beri nama mWordList.
private final LinkedList<String> mWordList;
Anda sekarang bisa mengisi metode getItemCount() untuk mengembalikan ukuran mWordList.
@Override
public int getItemCount() {
return mWordList.size();
}
Buat variabel anggota untuk inflater di WordListAdapter.
Implementasikan constructor untuk WordListAdapter. Constructor perlu memiliki parameter konteks dan daftar kata tertaut dengan data aplikasi. Metode perlu membuat instance layout inflater untuk mInflater dan menyetel mWordList ke data yang diteruskan.
Isikan metode onCreateViewHolder() dengan kode berikut. Metode onCreateViewHolder sama dengan metode onCreate. Metode ini memekarkan layout item dan mengembalikan holder tampilan dengan layout dan adaptor.
Isikan metode onBindViewHolder dengan kode berikut. Metode onBindViewHolder menghubungkan d ata Anda ke holder tampilan.
@Override
public void onBindViewHolder(WordViewHolder holder, int position) {
String mCurrent = mWordList.get(position);
holder.wordItemView.setText(mCurrent);
}
Jalankan aplikasi Anda untuk memastikan tidak ada kesalahan. Anda masih akan melihat peringatan “E/RecyclerView: No adapter attached; skipping layout”. Anda akan memperbaikinya di tugas selanjutnya.
Tugas 1. Menambahkan tombol Naik untuk navigasi ancestral
Jika Anda belum memiliki aplikasi DroidCafe yang terbuka dari praktik sebelumnya, unduh proyek Android Studio DroidCafe Bagian 3 dan ganti nama proyek menjadi DroidCafe.
Buka proyek DroidCafe.
Buka AndroidManifest.xml.
Ubah elemen aktivitas untuk OrderActivity ke yang berikut ini:
Tambahkan fragmen yang mewakili setiap layar bertab: TabFragment1, TabFragment2, dan TabFragment3. Untuk menambahkan setiap fragmen:
Klik com.example.android.tabexperiment di tampilan proyek.
Pilih File > New > Fragment > Fragment (Blank).
Beri nama fragmen TabFragment1.
+
Periksa opsi “Create layout XML?” dan ubah Nama Layout Fragmen untuk file XML ke tab_fragment1.
Hapus centang opsi “Include fragment factory methods?” dan “include interface callbacks?”. Anda tidak memerlukan metode ini.
Klik Finish.
Ulangi langkah-langkah di atas, menggunakan TabFragment2 dan TabFragment3 untuk Langkah C dan tab_fragment2 dan tab_fragment3 untuk Langkah D.
Edit setiap file XML layout fragmen (tab_fragment1, tab_fragment2, dan tab_fragment3):
Ubah Root Tag ke RelativeLayout.
Tambahkan TextView dengan teks, seperti “These are the top stories”.
Atur penampilan teks dengan android:textAppearance="?android:attr/textAppearanceLarge".
Ulangi langkah-langkah dia atas untuk setiap file XML layout, dengan memasukkan teks yang berbeda untuk TextView di langkah B.
Di file XML layout fragmen tab_fragment1, ekstrak string untuk "These are the top stories:" ke dalam sumber daya string tab_1. Lakukan yang sama untuk string di tab_fragment2 dan tab_fragment_3.
2.3 Tambahkan PagerAdapter
Tambahkan kelas PagerAdapter baru pada aplikasi yang meluaskan FragmentStatePagerAdapterdan mendefinisikan jumlah tab ( mNumOfTabs):
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
}
Saat memasukkan kode di atas, Android Studio otomatis mengimpor:
Jalankan aplikasi. Ketuk setiap tab untuk melihat setiap “laman” (layar). Anda juga bisa menggesek ke kiri dan ke kanan untuk mengunjungi “laman” yang berbeda
Buka proyek Droid Cafe dari praktik sebelumnya. Proyek menyertakan file layout berikut di folder res > layout:
activity_main.xml: Layout utama untuk MainActivity, layar pertama yang dilihat pengguna.
content_main.xml: Layout untuk konten layar MainActivity, yang (seperti akan segera Anda lihat) disertakan di dalam activity_main.xml**.
activity_order.xml: Layout untuk OrderActivity, yang Anda tambahkan di praktik sebelumnya.
Buka content_main.xml: Di praktik sebelumnya, Anda telah menambahkan TextView dan ImageView ke grup view root, yang merupakan RelativeLayout.
Buka activity_main.xml untuk melihat layout utama, yang menggunakan layout CoordinatorLayout dengan layout AppBarLayout yang disematkan. Tag CoordinatorLayout dan AppBarLayout memerlukan nama yang sepenuhnya memenuhi kualifikasi yang menetapkan android.support.design, yaitu Android Design Support Library.
Jalankan aplikasi. Perhatikan bilah di bagian atas layar yang menampilkan nama aplikasi (Droid Cafe). Ini juga menampilkan tombol luapantindakan (tiga titik vertikal) di sebelah kanan. Ketuk tombol luapan untuk melihat menu opsi, yang di tahap ini hanya memiliki satu menu opsi, Settings.
Periksa file AndroidManifest.xml. Aktivitas .MainActivity disetel untuk menggunakan tema NoActionBar:
android:theme="@style/AppTheme.NoActionBar"
Tema NoActionBar didefinisikan di file styles.xml (luaskan expand app > res >values > styles.xml untuk melihatnya). Gaya dicakup di pelajaran lainnya, tetapi Anda bisa melihat bahwa tema NoActionBar menyetel atribut windowActionBar ke false (tanpa bilah tindakan jendela) dan atribut windowNoTitle ke true (tanpa judul).
Lihat MainActivitMainActivity yang memperluas AppCompatActivity dan dimulai dengan metode onCreate():
1.2 Menambahkan lebih banyak item menu ke menu opsi
Anda akan menambahkan item menu berikut ke menu opsi aplikasi Droid Cafe:
Order: Masuk ke layar Order Activity untuk melihat pesanan makanan.
Status: Memeriksa status pesanan makanan.
Favorites: Menampilkan makanan favorit.
Contact: Menghubungi restoran. Karena Anda tidak memerlukan item Settings yang ada, anda akan mengubah Settings ke Contact.
Lihat menu_main.xml (luaskan res > menu di tampilan Project). Ini mendefinisikan item menu dengan <item> </item> di dalam <menu> </menu>block. Satu-satunya item menu yang tersedia dari template adalah `action_settings’ (pilihan Settings) yang didefinisikan sebagai:
Ubah atribut item action_settings berikut untuk membuatnya sebagai item action_contact (jangan ubah atribut android:orderInCategory yang sudah ada):
Atribut
Nilai
android:id
“@+id/action_contact”
android:title
“Contact”
app:showAsAction
“never”
Ekstrak string "Contact" yang di-hardcode ke dalam sumber daya string action_contact.
Tambahkan item menu baru menggunakan blok <item> </item> di dalam <menu> </menu>, dan berikan atribut berikut ke item:
Atribut
Nilai
android:id
“@+id/action_order”
android:orderInCategory
“10”
android:title
“Order”
app:showAsAction
“never”
Ekstrak string "Order" yang di-hardcode ke dalam sumber daya string action_order.
Tambahkan dua item menu lagi dengan cara yang sama dengan atribut berikut:
Atribut Item Status
Nilai
android:id
“@+id/action_status”
android:orderInCategory
“20”
android:title
“Status”
app:showAsAction
“never”
Atribut Item Favorit
Nilai
android:id
“@+id/action_favorites”
android:orderInCategory
“40”
android:title
“Favorites”
app:showAsAction
“never”
Ekstrak "Status" ke dalam sumber daya action_status dan "Favorites" ke dalam sumber daya action_favorites.
Anda akan menampilkan pesan toast dengan pesan tindakan bergantung pada item menu apa yang dipilih pengguna. Tambahkan nama dan nilai string berikut di strings.xml untuk pesan ini:
Buka MainActivity dan ubah pernyataan if di metode onOptionsItemSelected() dengan mengganti id action_settings dengan id action_order baru:
if (id == R.id.action_order)
Jalankan aplikasi dan ketuk ikon luapan tindakan, yang ditampilkan di sebelah kiri gambar di bawah ini, untuk melihat menu opsi, yang ditampilkan di sebelah kanan gambar di bawah ini. Anda akan segera menambahkan callback untuk merespons item yang dipilih dari menu ini.
Tugas 2. Menambahkan ikon untuk item menu
Luaskan res di tampilan Project, dan klik kanan (atau Kontrol-klik) drawable.
Pilih New > Image Asset. Dialog Configure Image Asset akan muncul.
Pilih Action Bar and Tab Items di menu tarik-turun.
Ubah ic_action_name ke ic_order_white (untuk tindakan Order). Layar Configure Image Asset akan tampak seperti berikut (lihat Ikon Create App dengan Image Asset Studio untuk deskripsi selengkapnya.)
Klik gambar clipart (logo Android di sebelah “Clipart”) untuk memilih gambar clipart sebagai ikon. Laman ikon akan muncul. Klik ikon yang ingin Anda gunakan untuk tindakan Order (misalnya, ikon keranjang belanja mungkin sesuai).
Pilih HOLO_DARK dari menu tarik-turun Theme. Ini akan menyetel ikon menjadi putih dengan latar belakang berwarna gelap (atau hitam). Klik Next.
Klik Finish, dalam dialog Confirm Icon Path.
Ulang langkah-langkah di atas untuk ikon Status dan Favorites, dan beri nama masing-masing ic_status_white dan ic_favorites_white.
Buka menu_main.xml lagi dan tambahkan atribut berikut ke item Order, Status, dan Favorites sehingga dua item pertama (Order dan Status) selalu muncul, dan item Favorites hanya muncul jika terdapat ruang untuknya:
Atribut Item Order
Nilai Lama
Nilai Baru
android:icon
“@drawable/ic_order_white”
app:showAsAction
“never”
“always”
Atribut Item Status
Nilai Lama
Nilai Baru
android:icon
“@drawable/ic_status_white”
app:showAsAction
“never”
“always”
Atribut Item Favorit
Nilai Lama
Nilai Baru
android:icon
“@drawable/ic_favorites_white”
app:showAsAction
“never”
“ifRoom”
Putar perangkat Anda ke orientasi horizontal, atau jika Anda menjalankan emulator, klik ikon Rotete Left atau Rotate Right untuk memutar layar ke orientasi horizontal. Anda seharusnya melihat ketiga ikon di bilah aplikasi untuk Order, Status, dan Favorites.
Tugas 3. Menangani item menu yang dipilih
3.1 Buat metode untuk menampilkan pilihan menu
Buka MainActivity.
Jika Anda belum menambahkan metode berikut (di pelajaran sebelumnya) untuk menampilkan pesan toast, tambahkan sekarang:
public void displayToast(String message) {
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
}
Metode displayToast() mengambil message dari string yang sesuai (misalnya action_contact_message).
Temukan metode onOptionsItemSelected(). Pernyataan if di metode yang disediakan oleh template ini, menentukan apakah item menu tertentu diklik, menggunakan id menu item (action_order di contoh berikut):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_order) {
return true;
}
return super.onOptionsItemSelected(item);
}
Ganti pernyataan if dan penetapannya ke id dengan blok switch caseberikut yang menyetel message yang sesuai berdasarkan id item menu:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_order:
displayToast(getString(R.string.action_order_message));
return true;
case R.id.action_status:
displayToast(getString(R.string.action_status_message));
return true;
case R.id.action_favorites:
displayToast(getString(R.string.action_favorites_message));
return true;
case R.id.action_contact:
displayToast(getString(R.string.action_contact_message));
return true;
default:
// Do nothing
}
return super.onOptionsItemSelected(item);
}
Jalankan aplikasi. Anda sekarang seharusnya melihat pesan toast berbeda di layar, seperti yang ditampilkan di sebelah kanan gambar di bawah, berdasarkan item menu mana yang Anda pilih.
Tugas 1: Bereksperimen dengan atribut keyboard entri teks
1.1 Membuat layout utama dan metode showText
akan menambahkan Tombol, dan mengubah elemen TextView menjadi elemen EditText sehingga pengguna bisa memasukkan teks.
Buat proyek baru yang bernama Keyboard Samples, dan pilih template Empty Activity.
Buka file layout activity_main.xml untuk mengedit kode XML.
Tambahkan Tombol di atas elemen TextView yang sudah ada dengan atribut berikut:
Atribut Tombol
Nilai Baru
android:id
“@+id/button_main”
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:layout_alignParentBottom
“true”
android:layout_alignParentRight
“true”
android:onClick
“showText”
android:text
“Show”
Ekstrak sumber daya string untuk nilai atribut android:text untuk membuat dan memasukkannya di strings.xml: Letakkan kursor pada Show, tekan Alt-Enter (Option-Enter di Mac), dan pilih Extract string resource. Lalu ubah name sumber daya untuk nilai string ke show.
Ubah elemen TextView yang sudah ada seperti berikut:
Hapus atribut android:text yang menetapkan “Hello World!”.
Ubah tag TextView menjadi tag EditText dan pastikan tag diakhiri dengan />.
Tambahkan atau ubah atribut berikut:
Atribut EditText
Nilai Lama TextView
Nilai Baru EditText
android:id
“@+id/editText_main”
android:layout_width
“wrap_content”
“match_parent”
android:layout_height
“wrap_content”
“wrap_content”
android:layout_alignParentBottom
“true”
android:layout_toLeftOf
“@id/button_main”
android:hint
“Enter a message”
Ekstrak sumber daya string untuk nilai atribut android:hint “Enter a message” ke nama sumber daya enter.
Buka MainActivity.java dan masukkan metode showText berikut, yang mengambil informasi yang dimasukkan ke dalam elemen EditText dan menampilkannya di dalam pesan toast
Buka strings.xml (dalam app > res > values) dan edit nilai app_name ke “Keyboard Samples”(pastikan untuk menyertakan spasi antara “Keyboard” dan “Samples”).
Jalankan aplikasi dan periksa cara kerja keyboard.
1.2 Setel keyboard untuk menjadikan huruf besar di awal kalimat
Tambahkan atribut android:inputType ke elemen EditTextmenggunakan nilai textCapSentences untuk menyetel keyboard menjadi huruf besar di awal kalimat, sehingga pengguna bisa otomatis memulai kalimat dengan huruf besar:
android:inputType="textCapSentences"
1.3 Setel keyboard untuk menyembunyikan sandi saat memasukkannya
Ubah elemen EditText untuk menggunakan nilai textPassworduntuk atribut android:inputType.
android:inputType="textPassword"
Ubah android:hint menjadi “Enter your password”.
Jalankan aplikasi.
Tugas 2. Mengubah tipe keyboard
2.1 Menggunakan keyboard email
Pada elemen EditText di file layout activity_main.xml, ubah atribut android:inputType menjadi yang berikut:
android:inputType="textEmailAddress"
Ubah atribut android:hint menjadi "Enter an email address".
Ekstrak sumber daya string untuk nilai android:hint ke enter_emailJalankan aplikasi. Mengetuk bidang akan memunculkan keyboard email di layar dengan simbol “@” yang terletak di sebelah tombol spasi.
2.2 Menggunakan keypad ponsel
Ubah elemen EditText aktivitas utama agar menampilkan keypad ponsel, bukan keyboard standar:
Pada elemen EditText di file layout activity_main.xml, ubah atribut android:inputType menjadi yang berikut:
android:inputType="phone"
Ubah atribut android:hint menjadi “Enter a phone number”.
Ekstrak sumber daya string untuk nilai android:hint ke enter_phone.
Jalankan aplikasi.
Tugas 3: Menambahkan kontrol masukan spinner untuk memilih label telepon
3.1 Salin proyek KeyboardSamples dan ubah layout
Salin folder proyek KeyboardSamples, ubah namanya menjadi PhoneNumberSpinner, dan optimalkan kode untuk mengisikan nama baru di seluruh proyek aplikasi.
Setelah mengoptimalkan kode, ubah nilai ” di file strings.xml (di dalam app > res > values) menjadi Phone Number Spinner (berikut spasinya) sebagai nama aplikasi.
Bukan file layout activity_main.xml.
Kurung elemen EditText dan Button yang ada dari pelajaran sebelumnya di dalam LinearLayoutdengan orientasi horizontal, dan menempatkan elemen EditText di atas Button, dan Tambahkan elemen Spinner di antara elemen EditText dan elemen Button
Tambakan LinearLayout lagi di bawah LinearLayout yang baru saja Anda buat, dengan orientasi horizontal untuk mengurung dua elemen TextView
Periksa layout Anda dengan mengeklik tab Preview di sebelah kanan jendela layout.
Ekstrak string Anda ke dalam sumber daya string
Elemen
String
Sumber daya string
EditText
“Enter phone number”
“@string/hint_phonenumber”
Button
“Show”
“@string/show_button”
TextView
“Phone Number: “
“@string/phonenumber_label”
TextView
“Nothing entered.”
“@string/nothing_entered”
3.2 Tambahkan kode untuk mengaktifkan spinner dan listener-nya
Buka strings.xml untuk mendefinisikan nilai yang bisa dipilih (Home, Work, Mobile, dan Other) untuk spinner sebagai larik string labels_array.
Untuk mendefinisikan callback pilihan untuk spinner, ubah kelas MainActivityAnda untuk mengimplementasikan antarmuka AdapterView.OnItemSelectedListener seperti yang ditampilkan:
public class MainActivity extends AppCompatActivity implements
AdapterView.OnItemSelectedListener {
Klik bola lampu dan pilih Implement methods. Metode onItemSelected() dan onNothingSelected() yang diperlukan untuk OnItemSelectedListener, seharusnya sudah disorot, dan opsi “Insert @Override” harus dicentang. Klik OK.
Buat instance objek spinner di metode onCreate() menggunakan elemen Spinner di layout (label_spinner), dan tetapkan listener-nya (spinner.setOnItemSelectedListener) di metode onCreate(). Tambahkan kode ke metode onCreate():
3.3 Tambahkan kode untuk merespons pilihan pengguna
Deklarasikan string mSpinnerLabel di awal definisi kelas MainActivity:
Tambahkan kode ke metode callback onItemSelected() kosong, seperti yang ditampilkan di bawah ini, untuk mengambil item yang dipilih pengguna menggunakan getItemAtPosition, dan tetapkan ke mSpinnerLabel. Anda juga bisa menambahkan sebuah panggilan ke metode showText() yang sudah Anda tambahkan ke versi aplikasi sebelumnya:
Tambahkan kode ke metode callback onNothingSelected() yang kosong, seperti yang ditampilkan di bawah ini, untuk menampilkan pesan logcat jika tidak satu pun yang dipilih:
Ekstrak sumber daya string untuk "onNothingSelected: " ke nothing_selected.
Tambahkan MainActivity.class.getSimpleName() agar menggunakan nama sederhana kelas untuk TAG:
private static final String TAG = MainActivity.class.getSimpleName();
Ubah pernyataan String showString di metode showText untuk menampilkan string yang dimasukkan dan item spinner yang dipilih (mSpinnerLabel):
Tugas 4: Menggunakan dialog untuk peringatan yang memerlukan keputusan
4.1 Buat proyek baru dengan layout untuk menampilkan dialog peringatan
Dalam latihan ini, Anda akan membangun sebuah peringatan dengan tombol OK dan Cancel, yang akan dipicu oleh klik pengguna pada tombol.
Buat proyek baru bernama Alert Sample berdasarkan template Empty Activity.
Bukan layout activity_main.xml dan buat perubahan berikut:
Atribut TextView
Nilai
android:id
“@+id/top_message”
android:text
“Tap to test the alert:”
Ekstrak string android:text di atas ke dalam tap_test sumber daya untuk membuatnya lebih mudah diterjemahkan
Tambahkan Button dengan atribut berikut:
Atribut Tombol
Nilai
android:id
“@+button1”
android:layout_width
wrap_content
android:layout_height
wrap_content
android:layout_below
“@id/top_message”
android:layout_marginTop
“36dp”
android:text
“Alert”
android:onClick
“onClickShowAlert”
Ekstrak string android:text di atas ke dalam alert_button
Ekstrak nilai dimensi untuk android:layout_marginTop dengan cara yang sama: Letakkan kursor di "36dp", tekan Alt-Enter (Option-Enter di Mac), dan pilih Extract dimension resource. Lalu edit nama Sumber Daya untuk nilai ke button_top_margin.Tambahkan metode onClickShowAlert() ke MainActivity.java seperti berikut: Setel judul dan pesan untuk dialog peringatan dalam onClickShowAlert()setel kode di langkah sebelumnya:
Ekstrak judul dan pesan ke dalam sumber daya string. Baris kode sebelumnya sekarang seharusnya menjadi:
Tambahkan tombol OK pada peringatan dengan setPositiveButton() dan menggunakan onClickListener():
Ekstrak sumber daya string untuk "OK" dan untuk "Pressed OK". Pernyataan sekarang seharusnya menjadi:
Tambahkan tombol Cancel pada peringatan dengan setNegativeButton() dan onClickListener(), tampilkan pesan toast jika tombol diklik, lalu batalkan dialog:
Ekstrak sumber daya string untuk "Cancel" dan "Pressed Cancel". Pernyataan sekarang seharusnya menjadi:
Tambahkan show() yang membuat lalu menampilkan dialog peringatan, ke akhir onClickShowAlert():
...
// Create and show the AlertDialog.
myAlertBuilder.show();
}
Tugas 5: Menggunakan picker untuk masukan pengguna
5.1 Membuat layout aktivitas utama
Mulai proyek baru yang bernama Date Time Pickers menggunakan template Empty Activity.
Buka activity_main.xml untuk mengedit kode layout,Ubah induk RelativeLayout agar menjadi LinearLayout dan tambahkan android:orientation="vertical"
Ubah teks elemen TextView pertama ke “Choose the date and time: “ dan ekstrak teks ke sumber daya string choose_datetime.
+
Atribut TextView
Nilai Lama
Nilai Baru
android:text
“Hello World”
“@string/choose_datetime”
Tambahkan atribut android:textSize dan masukkan ukuran teks 20sp. Ekstrak dimensi android:textSize ke text_size.
Atribut TextView
Nilai Lama
Nilai Baru
android:textSize
“@dimen/text_size”
Ekstrak string "Date" ke dalam sumber daya string date_button.
Ekstrak dimensi "12dp" untuk android:layout_marginTop ke button_top_margin.
Tambahkan elemen Button kedua di dalam turunan RelativeLayout atribut berikut:
Atribut Tombol Kedua
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:id
“@+id/button_time”
android:layout_marginTop
“@dimen/button_top_margin”
android:layout_alignBottom
“@id/button_date”
android:layout_toRightOf
“@id/button_date”
android:text
“Time”
android:onClick
“showTimePickerDialog”
8. Ekstrak string "Time" ke dalam sumber daya string time_button.
5.2 Buat fragmen baru untuk picker tanggal
Luaskan app > java > com.example.android.DateTimePickers dan pilih MainActivity.
Pilih File > New > Fragment > Fragment (Blank), dan beri nama fragmen DatePickerFragment.
Buka DatePickerFragment dan edit definisi kelas DatePickerFragment untuk memperluas DialogFragment dan dan implementasikan DatePickerDialog.OnDateSetListener untuk membuat picker tanggal standar dengan sebuah listener.
Selagi Anda mengetik DialogFragment dan DatePickerDialog.OnDateSetListener , Android Studio otomatis menambahkan yang berikut di blok import
Buka DatePickerFragment dan edit definisi kelas DatePickerFragment untuk memperluas DialogFragment dan dan implementasikan DatePickerDialog.OnDateSetListener untuk membuat picker tanggal standar dengan sebuah listener. Lihat Picker untuk informasi selengkapnya tentang memperluas DialogFragment untuk picker tanggal:
public class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
Ganti onCreateView() dengan onCreateDialog() yang mengembalikan Dialog, dan anotasikan onCreateDialog() dengan @NonNull untuk menunjukkan bahwa nilai pengembalian Dialog tidak boleh null—upaya apa pun untuk mengacu pada nilai pengembalian Dialog harus dicentang null.
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
...
}
Tambahkan kode berikut ke onCreateDialog() untuk membuat instance year, month, dan day dari Calendar, dan mengembalikan dialog dan nilai ini ke aktivitas utama. Saat Anda memasukkan Calendar, tetapkan import menjadi java.util.Calendar.
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker.
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it.
return new DatePickerDialog(getActivity(), this, year, month, day);
}
5.3 Buat fragmen baru untuk picker waktu
Pilih MainActivity lagi.
Pilih File > New > Fragment > Fragment (Blank), dan beri nama fragmen TimePickerFragment. Kosongkan ketiga opsi sehingga Anda tidak membuat XML layout, jangan sertakan metode pabrik fragmen, dan jangan sertakan callback antarmuka. Klik Finish untuk membuat fragmen.
Bukan *TimePickerFragment dan ikuti prosedur yang sama dengan DatePickerFragment, mengimplementasikan metode kosong onTimeSet(), mengganti onCreateView() dengan onCreateDialog(), dan menghapus konstruktor publik untuk TimePickerFragment.
5.4 Modifikasi aktivitas utama
Buat sumber daya string di strings.xml:
Tambahkan metode showDatePickerDialog() dan showTimePickerDialog(), dengan merujuk ke kode di bawah ini. Ini membuat instance FragmentManageruntuk mengelola fragmen secara otomatis, dan untuk menampilkan picker. Untuk informasi selengkapnya tentang fragmen
dan jalankan
Tugas 6: Menggunakan tampilan gambar sebagai tombol
6.1 Mulai proyek baru
Mulai proyek Android Studio baru dengan nama aplikasi Droid Cafe. Pilih template Basic Activity, terima setelan default, dan klik Finish.
Proyek terbuka dengan dua layout dalam folder res > layout: activity_main.xml, dan content_main.xml.
Buka content_main.xml dan ekstrak string "Hello World" di TextView untuk menggunakan nama sumber daya intro_text. Lalu buka strings.xml dan ubah definisi sumber daya intro_text untuk menggunakan lebih banyak teks deskriptif, seperti Droid Desserts:
<string id="intro_text">Droid Desserts</string>
Ubah TextView di layout agar menggunakan ukuran teks yang lebih besar 24sp dan padding 10dp, dan tambahkan atribut android:id dengan id textintro.
Ekstrak sumber daya dimensi untuk atribut android:padding ke nama sumber daya padding_regular, dan atribut android:textSize ke sumber daya text_heading. Anda akan menggunakan nama sumber daya ini di langkah-langkah selanjutnya.
Tambahkan TextView lagi di bawah textintroTextView dengan atribut berikut:
Atribut TextView
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:padding
“@dimen/padding_regular”
android:id
“@+id/choose_dessert”
android:layout_below
“@id/textintro”
android:text
“Choose a dessert.”
Ekstrak sumber daya string untuk atribut android:text ke nama sumber daya choose_a_dessert.
6.2 Tambahkan gambar
Salin file gambar ke dalam folder drawable proyek Anda. Temukan folder drawable di proyek dengan menggunakan jalur ini: project_name> app > src > main > res > drawable
Buka kembali proyek Anda.
Buka file content_main.xml lagi dan tambahkan sebuah ImageView untuk gambar donat ke layout di bawah tampilan choose_dessert, menggunakan atribut berikut:
Atribut ImageView untuk donat
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:padding
“@dimen/padding_regular”
android:id
“@+id/donut”
android:layout_below
“@id/choose_dessert”
android:contentDescription
“Donuts are glazed and sprinkled with candy.”
android:src
“@drawable/donut_circle”
Ekstrak nilai atribut android:contentDescription ke sumber daya string donuts. Anda akan menggunakan sumber daya string ini di langkah berikutnya.
Tambahkan TextView yang akan muncul di di sebelah gambar donat sebagai deskripsi, atribut berikut:
Atribut TextView
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:padding
“35dp”
android:layout_below
“@+id/choose_dessert”
android:layout_toRightOf
“@id/donut”
android:text
“@string/donuts”
Ekstrak sumber daya dimensi untuk atribut android:padding ke nama sumber daya padding_wide. Anda akan menggunakan nama sumber daya ini di langkah-langkah selanjutnya.
Tambahkan ImageView kedua ke layout untuk sandwich es krim, menggunakan atribut berikut:
Atribut ImageView untuk ice_cream
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:padding
“@dimen/padding_regular”
android:id
“@+id/ice_cream”
android:layout_below
“@id/donut”
android:contentDescription
“Ice cream sandwiches have chocolate wafers and vanilla filling.”
android:src
“@drawable/icecream_circle”
Ekstrak nilai atribut android:contentDescription ke sumber daya string ice_cream_sandwiches.
Tambahkan TextView yang akan muncul di di sebelah sandwich es krim sebagai deskripsi, dengan atribut berikut:
Atribut TextView
Nilai
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:padding
“@dimen/padding_wide”
android:layout_below
“@+id/donut”
android:layout_toRightOf
“@id/ice_cream”
android:text
“@string/ice_cream_sandwiches”
6.3 Tambahkan metode onClick untuk tampilan gambar
Tambahkan sumber daya string berikut ke file strings.xml yang akan ditampilkan di pesan toast:
<string name="donut_order_message">You ordered a donut.</string>
<string name="ice_cream_order_message">You ordered an ice cream sandwich.</string>
<string name="froyo_order_message">You ordered a FroYo.</string>
Tambahkan metode displayToast() berikut untuk menampilkan pesan toast:
Tambahkan metode showFoodOrder() berikut di akhir MainActivity* (sebelum tanda kurung penutup). Untuk tugas ini, gunakan metode displayToast()untuk menampilkan pesan toast:
Tambahkan metode berikut di akhir MainActivity (Anda bisa menambahkannya sebelum showFoodOrder()):
jalankan Appnya
Tugas 7: Menggunakan tombol radio
7.1 Tambahkan aktivitas lain
Klik kanan folder com.example.android.droidcafe di kolom kiri dan pilih New > Activity > Empty Activity. Edit Nama Aktivitas agar menjadi OrderActivity dan Nama Layout menjadi activity_order. Jangan ubah opsi lain, dan klik Finish.
Buka MainActivity. Ubah metode showFoodOrder() untuk membuat intent eksplisit untuk memulai OrderActivity:
Jalankan aplikasi. Mengeklik tombol gambar sekarang akan meluncurkan aktivitas kedua, yaitu layar kosong. (Pesan toast muncul sebentar di layar kosong.)
7.2 Tambahkan layout untuk tombol radio
Buka activity_order.xml dan tambahkan elemen TextView dengan id order_intro_text:
Atribut TextView
Nilai
android:id
“@+id/order_intro_text”
android:layout_width
“match_parent”
android:layout_height
“wrap_content”
android:layout_marginTop
“24dp”
android:layout_marginBottom
“6dp”
android:textSize
“18sp”
android:text
“Choose a delivery method:”
Ekstrak sumber daya string untuk "Choose a delivery method:"menjadichoose_delivery_method.
Ekstrak sumber daya dimensi untuk nilai margin:
"24dp" ke text_margin_top
"6dp" ke text_margin_bottom
"18sp" ke intro_text_size
Tambahkan RadioGroup ke layout di bawah TextView yang baru saja Anda tambahkan:
Tambahkan tiga elemen RadioButton berikut di dalam RadioGroupmenggunakan atribut berikut. Entri "onRadioButtonClicked" untuk atribut onClick akan disorot sampai Anda menambahkan metode tersebut di tugas berikutnya.
Atribut #1 RadioButton
Nilai
android:id
“@+id/sameday”
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:text
“Same day messenger service”
android:onClick
“onRadioButtonClicked”
Atribut #2 RadioButton
Nilai
android:id
“@+id/nextday”
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:text
“Next day ground delivery”
android:onClick
“onRadioButtonClicked”
Atribut #3 RadioButton
Nilai
android:id
“@+id/pickup”
android:layout_width
“wrap_content”
android:layout_height
“wrap_content”
android:text
“Pick up”
android:onClick
“onRadioButtonClicked”
Ekstrak tiga sumber daya string untuk atribut android:text ke nama-nama berikut, sehingga string bisa dengan mudah diterjemahkan:
same_day_messenger_service
next_day_ground_delivery
pick_up
7.3 Tambahkan handler klik tombol radio
Buka strings.xml dan buat sumber daya string berikut:
Sebuah sumber daya yang bernama chosen untuk string "Chosen: "(sertakan spasi setelah titik dua dan tanda tanya).
Sebuah sumber daya yang bernama nothing_clicked untuk string “onRadioButtonClicked: Nothing clicked.”
Buka OrderActivity dan tambahkan pernyataan berikut untuk mendefinisikan TAG_ACTIVITY untuk pesan log:
Tambahkan metode displayToast berikut ke OrderActivity:
public void displayToast(String message) {
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
}
Tambahkan metode onRadioButtonClicked() berikut, yang memeriksa untuk melihat apakah tombol radio telah dicentang, dan menggunakan blok switch case untuk menentukan item tombol radio mana yang dipilih, untuk menyetel message yang sesuai untuk item tersebut untuk digunakan bersama displayToast():
Jalankan aplikasi. Ketuk sebuah pesan untuk melihat aktivitas OrderActivity, yang menampilkan pilihan pengantaran. Ketuk pilihan pengantaran dan Anda akan melihat pesan toast di bagian bawah layar dengan pilihan, seperti yang ditampilkan dalam gambar di bawah ini.
Untuk tugas ini Anda akan menyiapkan proyek baru untuk aplikasi HelloCompat dan mengimplementasikan layout serta perilaku dasar.
1.1 Memverifikasi bahwa Pustaka Dukungan Android tersedia
Pustaka dukungan Android diunduh berdasarkan bagian dari SDK, dan tersedia dalam Android SDK Manager. Dalam Android Studio, Anda akan menggunakan Android Support Repository, repositori lokal untuk pustaka pendukung, untuk mendapatkan akses ke pustaka di dalam file pembangunan gradle. Dalam tugas ini Anda akan memverifikasi bahwa Android Support Repository diunduh dan tersedia untuk proyek.
Klik tab SDK Tools dan perluas Support Repository.
Cari Support Repository dalam daftar.
Jika kata Installed muncul di kolom Status, Anda sudah siap. Klik Cancel.
1.2 Menyiapkan Proyek dan memeriksa build.gradle
Buat proyek baru bernama HelloCompat, dan pilih template Empty Activity.
Pada laman Perangkat Android Target, catat bahwa API 15: Android 4.0.3 (IceCreamSandwich) dipilih untuk SDK minimum.
Di Android Studio, pastikan panel Project dibuka dan tab Android diklik.
Temukan baris compileSdkVersion di dekat bagian atas file.
compileSdkVersion 24
Versi kompilasi adalah versi framework Android yang menyusun aplikasi Annda dalam Android Studio. Untuk proyek baru, versi kompilasi adalah serangkaian framework API terbaru yang Anda pasang. Nilai ini memengaruhi hanya Android Studio itu sendiri dan peringatan atau kesalahan yang Anda dapatkan dalam Android Studio, jika menggunakan API yang lebih lama atau lebih baru.
Temukan baris minSdkVersion dalam bagian defaultConfig beberapa baris di bawah.
minSdkVersion 15
Versi minimum adalah versi API Android terlama tempat aplikasi Anda dijalankan. Ini sama dengan angka yang Anda pilih pada Langkah 1 saat membuat proyek. Google Play store menggunakan angka ini untuk memastikan aplikasi dapat berjalan pada perangkat pengguna yang diberikan Android Studio juga menggunakan angka ini untuk mengingatkan Anda tentang penggunaan API yang sudah tidak digunakan lagi.
Temukan baris targetSdkVersion dalam bagian defaultConfig.
targetSdkVersion 24
Versi target menunjukkan versi API yang didesain dan diuji untuk aplikasi Anda. Jika API platform Android lebih tinggi dari angka ini (yakni aplikasi Anda berjalan pada perangkat yang lebih baru), platform dapat mengaktifkan perilaku kompatibilitas untuk memastikan aplikasi terus bekerja seperti yang didesain. Contohnya, Android 6.0 (API 23) menyediakan model izin waktu proses baru. Jika aplikasi menargetkan level API yang lebih rendah, platform kembali ke model izin waktu proses yang lebih lama.
Temukan bagian dependencies build.gradle, dekat bagian akhir file.
Bagian dependensi untuk proyek baru menyertakan beberapa dependensi untuk mengaktifkan pengujian dengan Espresso, JUnit, dan pustaka dukungan v7 appcompat. Catat bahwa nomor versi pustaka ini dalam proyek Anda bisa berbeda dengan yang ditunjukkan di sini.
Pustaka dukungan v7 appcompat menyediakan kompatibilitas-mundur untuk versi Android yang lebih lama hingga ke API 9. Ini juga termasuk pustaka v4 compat, jadi Anda tidak perlu menambahkan keduanya sebagai dependensi.
Tugas 1. Menjelajahi dan menjalankan SimpleCalc di Android Studio
1.1 Menjelajahi rangkaian sumber dan SimpleCalc
rangkaian sumber adalah kumpulan kode terkait dalam proyek untuk target membangun yang berbeda atau “variasi” lainnya dari aplikasi Anda. Saat Android Studio membuat proyek, Android Studio membuat tiga rangkaian sumber:
Rangkaian sumber utama, untuk kode dan sumber daya aplikasi Anda.
Rangkaian sumber pengujian, untuk pengujian unit lokal aplikasi.
Rangkaian sumber androidTest, untuk pengujian berinstrumen Android.
Buka tampilan Project, dan perluas folder aplikasi dan java.Folder java dalam tampilan Android mencantumkan semua rangkaian sumber dalam aplikasi menurut nama paket (com.android.example.simplecalc), dengan pengujian dan androidTest ditampilkan dalam tanda kurung setelah nama paket. Dalam aplikasi SimpleCalc, hanya rangkaian sumber utama dan pengujian yang digunakan.
Ini adalah folder tempat Anda meletakkan pengujian unit lokal aplikasi. Android Studio membuat kelas pengujian contoh untuk Anda dalam folder ini untuk proyek baru, tetapi untuk SimpleCalc, kelas pengujiannya disebut CalculatorTest.
Buka CalculatorTest.java.
Periksa kode dan catat hal-hal berikut ini:
Satu-satunya impor adalah dari paket org.junit, org.hamcrest, dan android.test. Tidak ada dependensi pada kelas framework Android di sini.
Anotasi @RunWith(JUnit4.class) menunjukkan runner yang akan digunakan untuk menjalankan pengujian dalam kelas ini. Runner pengujian adalah pustaka atau serangkaian alat yang memungkinkan pengujian terjadi dan hasilnya dicetak ke log. Untuk pengujian dengan penyiapan atau persyaratan infrastruktur yang lebih rumit (seperti Espresso), Anda akan menggunakan runner pengujian yang berbeda. Untuk contoh berikut kita menggunakan runner pengujian JUnit4 dasar.
Anotasi @SmallTest menunjukkan bahwa semua pengujian dalam kelas ini adalah pengujian unit yang tidak memiliki dependensi dan berjalan dalam milidetik. Anotasi @SmallTest, @MediumTest, dan @LargeTest adalah konvensi yang memudahkan membundel grup pengujian ke dalam kelompok fungsionalitas yang serupa.
Metode setUp() digunakan untuk menyiapkan lingkungan sebelum pengujian, dan menyertakan anotasi @Before. Dalam hal ini, penyiapan membuat instance baru kelas Calculator dan menetapkannya ke variabel anggota mCalculator.
Metode addTwoNumbers() adalah pengujian yang sebenarnya, dan dianotasi dengan @Test. Hanya metode dalam kelas tes yang memiliki anotasi @Test yang dianggap pengujian bagi runner pengujian. Perhatikan bahwa metode pengujian konvensi tidak termasuk kata “test”.
Baris pertama addTwoNumbers() memanggil metode add() dari kelas Calculator. Anda hanya bisa menguji metode yang bersifat publik atau dilindungi paket. Dalam hal ini Calculator adalah kelas publik dengan metode publik, jadi semuanya berjalan baik.
Baris kedua adalah pernyataan untuk pengujian. Pernyataan adalah ekspresi yang harus mengevaluasi dan menghasilkan benar untuk lulus pengujian. Dalam hal ini, pernyataannya adalah bahwa hasil yang Anda dapatkan dari metode penambahan (1 + 1) cocok dengan nomor 2 yang diberikan. Anda akan mempelajari selengkapnya tentang cara membuat pernyataan nanti dalam praktik ini.
1.2 Menjalankan pengujian dalam Android Studio
Dalam tugas ini Anda akan menjalankan pengujian unit dalam folder pengujian dan melihat keluaran untuk pengujian yang berhasil dan gagal.
Dalam tampilan proyek, klik kanan kelas CalculatorTest dan pilih Run ‘CalculatorTest’.
Proyek membangun, jika perlu, dan tampilan pengujian muncul di bagian bawah layar. Di bagian atas layar, tarik turun (untuk konfigurasi eksekusi yang tersedia) juga berubah menjadi CalculatorTest.
Tugas 2. Menambahkan lebih banyak pengujian unit ke CalculatorTest
Unduh dan ekstrak folder proyek SimpleCalc project folder.
Mulai Android Studio dan pilih File > Open.
Buka folder untuk menemukan SimpleCalc, pilih file folder, dan klik OK.
1.2 Menjelajahi Layout
Buka res/layout/activity_main.xml.
Pratinjau layout dalam Layout Editor.
Periksa kode layout, desain, dan catat hal-hal berikut ini:
Layout berisi dua EditTexts untuk input, empat tampilan Tombol untuk penghitungan, dan satu TextViews untuk menampilkan hasilnya.
Setiap tombol penghitungan memiliki handler onClick-nya sendiri (onAdd, OnSub, dan sebagainya.)
TextView untuk hasil tidak memiliki teks di dalamnya secara default.
Tampilan EditText memiliki properti android:inputType dan nilai "numberDecimal". Properti ini menunjukkan bahwa EditText hanya menerima angka sebagai input. Keyboard yang muncul pada layar juga hanya akan berisi angka. Anda akan mengetahui selengkapnya tentang tipe input untuk EditText dalam praktik berikutnya.
1.3 Jelajahi kode aplikasi
Perluas folder aplikasi/java folder dalam tampilan proyek Android. Selain kelas MainActivity, proyek ini juga menyertakan kelas Kalkulator utilitas.
Buka Kalkulator (java/com.example.android.simplecalc/Calculator.java). Periksa kodenya. bisa melakukan observasi berikut:
Operasi yang dapat dilakukan ditentukan oleh enum Operator.
Semua metode operasi bersifat publik.
Buka MainActivity (java/com.example.android.simplecalc/MainActivity). Periksa kodenya. Observasi apa yang bisa Anda lakukan tentang kode dan aktivitas? Pikirkan jawabannya dan konfirmasi hal-hal berikut:
Semua handler onClick memanggil metode compute() privat, dengan nama operasi sebagai salah satu nilai dari enumerasi Calculator.Operator.
Metode compute() memanggil metode privat getOperand() (yang bergantian memanggil getOperandText()) untuk mengambil nilai angka dari EditTexts.
Metode compute() menggunakan switch pada nama operand untuk memanggil metode yang tepat dalam kelas Calculator.
Metode penghitungan dalam kinerja kelas Calculator melakukan aritmetika yang sebenarnya dan mengembalikan nilai.
Bagian terakhir metode compute() memperbarui TextView dengan hasil penghitungan,
Jalankan aplikasi. Coba hal-hal berikut ini:
Masukkan integer dan nilai titik-mengambang untuk penghitungan.
Masukkan nilai titik-mengambang dengan pecahan desimal besar (misalnya, 1.6753456)
Bagi angka dengan nol.
Biarkan salah satu atau kedua tampilan EditText kosong, dan coba penghitungan apa pun.
Periksa pelacakan tumpukan dalam Android Studio saat aplikasi melaporkan kesalahan.
Jika pelacakan tumpukan tidak terlihat, klik tombol Android Monitor pada tombol Android Studio, lalu klik logcat.
Jika satu atau kedua tampilan EditText dalam SimpleCalc kosong, aplikasi melaporkan “Kesalahan” dan log sistem menampilkan status tumpukan eksekusi saat aplikasi menghasilkan kesalahan. Pelacakan tumpukan biasanya menyediakan informasi penting tentang mengapa kesalahan terjadi
Buat intent baru dengan Intent.ACTION_VIEW sebagai tindakan dan URI sebagai data:
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
Gunakan resolveActivity() dan pengelola paket Android untuk menemukan aktivitas yang dapat menangani intent implisit. Periksa untuk memastikan permintaan berhasil diatasi.
if (intent.resolveActivity(getPackageManager()) != null) {
}
Permintaan yang cocok dengan tindakan intent dan data dengan intent Anda ini memfilter aplikasi yang dipasang pada perangkat untuk memastikan paling tidak ada satu aktivitas yang bisa menangani permintaan Anda.
Dalam pernyataan if, panggil startActivity() untuk mengirimkan intent.
startActivity(intent);
Tambahkan blok else untuk mencetak pesan log jika intent tidak bisa diatasi.
Membuat metode baru bernama openLocation untuk digunakan sebagai metode onClick untuk tombol Open Location. Gunakan tanda tangan metode yang sama sebagai openWebsite().
Dapatkan nilai string EditText mLocationEditText.
String loc = mLocationEditText.getText().toString();
Parse string itu ke dalam objek Uri dengan kueri penelusuran geo:
Uri addressUri = Uri.parse("geo:0,0?q=" + loc);
Buat intent baru dengan Intent.ACTION_VIEW sebagai tindakan dan loc sebagai datanya.
Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);
Pecahkan intent dan periksa untuk memastikan intent berhasil diatasi. Jika demikian, startActivity(), jika tidak catat log pesan kesalahan.
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Log.d("ImplicitIntents", "Can't handle this intent!");
}
Tugas 4. Mengimplementasikan bagikan teks ini
4.1 Mengimplementasikan metode shareText
Buka MainActivity.java.
Tambahkan variabel privat di bagian atas kelas untuk menampung objek EditText untuk URI situs web.
private EditText mShareTextEditText;
Dalam metode onCreate(), gunakan findViewByID() untuk mendapatkan referensi tentang instance EditText dan menetapkannya ke variabel privat tersebut:
Membuat metode baru bernama shareThis() untuk digunakan sebagai metode onClick untuk tombol This Text. Gunakan tanda tangan metode yang sama sebagai openWebsite().
Dapatkan nilai string EditText mShareTextEditText.
Panggil ShareCompat.IntentBuilder dengan metode ini:
ShareCompat.IntentBuilder
.from(this)
.setType(mimeType)
.setChooserTitle("Share this text with: ")
.setText(txt)
.startChooser();
Panggilan ke hareCompat.IntentBuilder ini menggunakan metode berikut:
</tr> </table> Format ini, dengan semua metode setter builder dirangkai dalam satu pernyataan, adalah cara shorthand mudah untuk membuat dan meluncurkan intent. Anda bisa menambahkan metode tambahan apa pun ke daftar ini.
Metode
Keterangan
from()
Aktivitas yang meluncurkan intent berbagi (ini).
setType()
Tipe MIME item yang akan dibagikan.
setChooserTitle()
Judul yang muncul pada pemilih aplikasi sistem.
setText()
Teks sebenarnya yang akan dibagikan
startChooser()
Tunjukkan pemilih aplikasi sistem dan kirimkan intent.
Tugas 5. Menerima Intent Implisit
5.1 Membuat Proyek & Layout
Mulai Android Studio dan buat proyek Android Studio baru.
Panggil “Penerima Intent Implisit” aplikasi Anda.
Pilih Empty Activity untuk template proyek.
Terima nama aktivitas default (MainActivity). Klik Berikutnya.
Ubah TextView (“Hello World”) yang sudah ada dengan atribut berikut:
Atribut
Nilai
android:id
“@+id/text_uri_message”
android:layout_width
wrap_content
android:layout_height
wrap_content
android:textSize
“18sp”
android:textStyle
“bold”
Hapus atribut android:text. Tidak ada teks dalam TextView ini secara default, Anda akan menambahkan URI dari intent dalam onCreate().
5.2 Memodifikasi Manifes Android untuk menambahkan filter intent
Buka manifests/AndroidManifest.xml.
Perhatikan bahwa aktivitas utama telah memiliki filter intent ini:
Filter intent ini, yang merupakan bagian dari manifes proyek default, menunjukkan bahwa aktivitas ini adalah titik masuk utama untuk aplikasi Anda (filter ini memiliki tindakan intent “android.intent.action.MAIN”), dan bahwa aktivitas ini seharusnya muncul sebagai item level teratas dalam peluncur (kategorinya adalah "android.intent.category.LAUNCHER")
Baris ini mendefinisikan filter intent untuk aktivitas tersebut, jenis intent yang dapat ditangani aktivitas. Filter intent mendeklarasikan elemen berikut:
Jenis Filter
Nilai
Kecocokan
tindakan
“android.intent.action.VIEW”
Semua intent dengan tindakan tampilan.
kategori
“android.intent.category.DEFAULT”
Semua intent implisit. Kategori ini harus disertakan agar aktivitas Anda menerima intent implisit apa pun.
kategori
“android.intent.category.BROWSABLE”
Permintaan untuk tautan yang dapat dijelajahi dari laman web, email, atau sumber lainnya.
URI yang berisi skema http DAN hostname dari developer.android.com.
Catat bahwa filter (https://developer.android.com/guide/topics/manifest/data-element.html) [data] memiliki batasan untuk jenis tautan yang akan diterima dan hostname untuk URI tersebut. Jika Anda memilih agar penerima dapat menerima tautan apa pun, Anda bisa meninggalkan <data> elemen semuanya.
5.3 Memproses Intent
Dalam metode onCreate() untuk aktivitas, Anda memproses intent yang masuk untuk data atau ekstra yang disertakan. Dalam hal ini, intent implisit yang masuk memiliki URI yang disimpan dalam data intent.
Buka MainActivity.java.
Dalam metode onCreate(), dapatkan intent yang datang dan digunakan untuk mengaktifkan aktivitas tersebut:
Intent intent = getIntent();
Dapatkan data intent. Data intent selalu objek URI:
Uri uri = intent.getData();
Periksa untuk memastikan variabel uri tidak null. Jika pemeriksaan lulus, buat string dari objek URI:
Juga di dalam blok if, setel teks TextView itu ke URI:
textView.setText(uri_string);
Jalankan aplikasi penerima.
Menjalankan aplikasi itu sendiri menunjukkan aktivitas kosong tanpa teks. Ini karena aktivitas diaktifkan dari peluncur sistem, dan tidak dengan intent dari aplikasi lain.
Jalankan aplikasi ImplicitIntents, dan klik Open Website dengan URI default.
Pemilih aplikasi muncul menanyakan apakah Anda ingin menggunakan browser default atau aplikasi ImplicitIntentsReceiver. Pilih “Just Once” untuk aplikasi penerima. Aplikasi ImplicitIntentsReceiver terbuka dan pesan menunjukkan URI dari permintaan yang asli.
Tap tombol kembali dan masukkan URI yang berbeda. Klik Open Website.
Aplikasi penerima memiliki filter intent yang hanya cocok dengan protokol URI yang sama persis (http) and host (developer.android.com). URI lainnya terbuka pada browser web default.
Di bagian atas kelas, tambahkan konstanta untuk variabel LOG_TAG:
private static final String LOG_TAG =
SecondActivity.class.getSimpleName();
Tambahkan callback siklus hidup dan pernyataan log ke aktivitas kedua. (Anda juga bisa menyalin dan menempel metode callback dari MainActivity)
Tambahkan pernyataan log ke metode returnReply(), tepat sebelum metode finish():
Log.d(LOG_TAG, "End SecondActivity");
1.4 Amati log saat aplikasi berjalan
Jalankan aplikasi Anda.
Klik Android Monitor di bawah Android Studio untuk membuka Android Monitor.
Pilih tab logcat.
Ketik “Activity” dalam kotak pencarian Android Monitor.
Logcat Android bisa menjadi sangat panjang dan berantakan. Karena variabel LOG_TAG di setiap kelas berisi kata MainActivity atau SecondActivity, kata kunci ini memungkinkan Anda memfilter log hanya untuk hal-hal yang Anda minati.
Tugas 2. Menyimpan dan memulihkan status instance aktivitas.
2.1 Simpan status instance aktivitas dengan onSaveInstanceState()
Tambahkan implementasi skeleton onSaveInstanceState() ke aktivitas, atau gunakan Code > Override Methods untuk menyisipkan pengganti kerangka.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
Periksa untuk melihat apakah header saat ini terlihat, dan jika demikian letakkan status visibilitas ke dalam bundel status dengan metode putBoolean() dan kunci “reply_visible”.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
Dalam pemeriksaan yang sama, tambahkan teks balasan ke dalam bundel.
Jalankan aplikasi. Coba putar perangkat atau emulator untuk memastikan bahwa pesan balasan (jika ada) tetap ada di layar setelah aktivitas dibuat ulang.
Buka res/layout/activity_main.xml. Pada Layout Editor, klik tab Design di bagian bawah layar dan Hapus TextView yang berbunyi “Hello World.”
Tambahkan Tombol ke layout dalam posisi apa pun.
Beralih ke XML Editor (klik tab Text) dan modifikasi atribut ini di dalam Tombol:
Atribut
Nilai
android:id
“@+id/button_main”
android:layout_width
wrap_content
android:layout_height
wrap_content
android:layout_alignParentRight
“true”
android:layout_alignParentBottom
“true”
android:layout_alignParentEnd
“true”
android:text
“Send”
android:onClick
“launchSecondActivity”
Letakkan kursor pada kata"Send". Tekan Alt-Enter, dan pilih Extract string resources. Setel nama Sumber Daya ke button_main dan klik OK.
hasil penggantian nama send tdi di string.xml
1.3 Mendefinisikan tindakan tombol
Dalam Editor XML, letakkan kursor pada kata"launchSecondActivity".
Tekan Alt-Enter (Option-Enter di Mac) dan pilih Create ‘launchSecondActivity(View)’ dalam ‘MainActivity.
File MainActivity.java terbuka, dan Android Studio membuat metode kerangka untuk handler onClick.
Dalam launchSecondActivity, tambahkan pernyataan log yang bernama “Button Clicked!”
Log.d(LOG_TAG, "Button clicked!");
LOG_TAG akan terlihat berwarna merah. Definisi untuk variabel tersebut akan ditambahkan dalam langkah selanjutnya.
Tempatkan kursor pada kata “Log” dan tekan Alt-Enter (Option-Enter di Mac). Android Studio menambahkan pernyataan impor untuk android.util.Log.
Di bagian atas kelas, tambahkan konstanta untuk variabel LOG_TAG:
private static final String LOG_TAG =
MainActivity.class.getSimpleName();
Konstanta ini menggunakan nama kelas itu sendiri sebagai tag-nya.
Jalankan aplikasi Anda. Saat mengeklik tombol “Send”, Anda akan melihat pesan “Button Clicked!” di Android Monitor (logcat). Jika ada terlalu banyak keluaran di monitor, ketik MainActivity di dalam kotak pencarian dan log hanya akan menunjukkan baris yang cocok dengan tag tersebut.
Tugas 2. Membuat dan meluncurkan aktivitas kedua
Klik folder app untuk proyek Anda dan pilih File > New > Activity > Empty Activity.
Namakan aktivitas baru “SecondActivity.” Pastikan Generate Layout File dicentang, dan nama layout akan diisi dengan activity_second.
Klik Finish. Android Studio menambahkan layout aktivitas baru (activity_second) dan file Java baru (SecondActivity) ke proyek Anda untuk aktivitas baru tersebut. Ini juga akan memperbarui manifes Android untuk menyertakan aktivitas baru.
2.2 Memodifikasi manifes Android
Buka manifests/AndroidManifest.xml.
Temukan elemen <activity> yang dibuat Android Studio untuk aktivitas kedua.
Atribut label menambahkan judul aktivitas ke bilah tindakan.
Atribut parentActivityName menandakan bahwa aktivitas utama adalah induk aktivitas kedua. Hubungan aktivitas induk ini digunakan untuk navigasi “ke atas” di dalam aplikasi Anda. Dengan mendefinisikan atribut ini, bilah tindakan untuk aktivitas kedua akan muncul dengan panah yang menghadap ke kiri untuk memungkinkan pengguna untuk bergerak “ke atas” ke aktivitas utama.
Tempatkan kursor di “Second Activity” dan tekan Alt-Enter (Option-Enter di Mac).
Pilih Extract string resource, namakan sumber daya “activity2_name”, dan klik OK. Android Studio menambahkan sumber daya string untuk label aktivitas.
Tambahkan elemen <meta-data> element inside the <activity> di dalam elemen untuk aktivitas kedua. Gunakan atribut ini:
Atribut
Nilai
android:name
“android.support.PARENT_ACTIVITY”
android:value
“com.example.android.twoactivities.MainActivity”
Elemen <meta-data> menyediakan informasi arbitrer tambahan tentang aktivitas sebagai pasangan kunci-nilai. Dalam hal ini, atribut ini mencapai hal yang sama dengan atribut android:parentActivityName, yakni mendefinisikan hubungan antara dua aktivitas untuk tujuan navigasi ke atas. Atribut ini diperlukan untuk versi Android lebih lama. android:parentActivityName hanya tersedia untuk API level 16 dan yang lebih tinggi.
2.3 Mendefinisikan layout untuk aktivitas utama
Buka res/layout/activity_second.xml.
Tambahkan TextView (“Plain Textview” dalam Layout Editor). Berikan atribut berikut pada TextView:
Atribut
Nilai
android:id
“@+id/text_header”
android:layout_width
wrap_content
android:layout_height
wrap_content
android:layout_marginBottom
“@dimen/activity_vertical_margin”
android:text
“Message Received”
android:textAppearance
“?android:attr/textAppearanceMedium”
android:textStyle
“bold”
Nilai textAppearance adalah atribut bertema Android yang mendefinisikan gaya font dasar font kecil, medium, dan besar. Anda akan mempelajari selengkapnya tentang tema pada pelajaran berikutnya.
Ekstrak string “Message Received” ke sumber daya bernama text_header.
Tampilannya
2.4 Menambahkan intent ke aktivitas utama
Buka file Java untuk MainActivity (java/com.example.android.twoactivities/MainActivity).
Buat intent baru dalam metode launchSecondActivity().
Konstruktor intent memerlukan dua argumen untuk intent eksplisit: konteks Aplikasi dan komponen spesifik yang akan menerima intent tersebut. Di sini Anda harus menggunakan this sebagai konteksmya, dan SecondActivity.class sebagai kelas spesifiknya.
Intent intent = new Intent(this, SecondActivity.class);Tempatkan kursor di intent dan tekan Alt-Enter (Option-Enter di Mac) untuk menambahkan impor ke kelas intent.
Panggil metode startActivity() dengan intent baru sebagai argumennya.
startActivity(intent);
Jalankan aplikasi.
Saat mengeklik tombol Send, aktivitas utama mengirim intent dan sistem Android membuka aktivitas kedua. Aktivitas kedua muncul di layar. Untuk kembali ke aktivitas utama, klik tombol Kembali Android di kiri bawah layar, Anda bisa menggunakan panah kiri di atas aktivitas kedua untuk kembali ke aktivitas utama.
Tugas 3. Mengirim data dari aktivitas utama ke aktivitas kedua
3.1 Menambahkan EditText ke layout aktivitas utama
Buka res/layout/activity_main.xml.
Tambahkan tampilan EditText (Plain Text dalam Layout Editor.) Berikan EditText atribut berikut:
Atribut
Nilai
android:id
“@+id/editText_main”
android:layout_width
match_parent
android:layout_height
wrap_content
android:layout_toLeftOf
“@+id/button_main”
android:layout_toStartOf
“@+id/button_main”
android:layout_alignParentBottom
“true”
android:hint
“Enter Your Message Here”
Ekstrak string “Enter Your Message Here” ke sumber daya bernama editText_main.
3.2 Menambahkan string ke ekstra intent aktivitas utama
Setel teks TextView tersebut ke string dari ekstra intent:
textView.setText(message);
Jalankan aplikasi. Saat Anda mengetik pesan dalam aktivitas utama dan mengeklik Send, aktivitas kedua terbuka dan menampilkan pesan tersebut.
Jalankan aplikasi. Saat Anda mengetik pesan dalam aktivitas utama dan mengeklik Send, aktivitas kedua terbuka dan menampilkan pesan tersebut.
Tugas 4. Mengembalikan data ke aktivitas utama
4.1 Menambahkan EditText dan Tombol ke layout aktivitas kedua
Salin EditText dan Tombol dari file layout aktivitas utama dan tempel ke layout kedua.
Dalam file activity_second.xml, modifikasi nilai atribut untuk Tombol dan tampilan EditText. Gunakan nilai ini:
Atribut Lama (Tombol)
Atribut Baru (Tombol)
android:id=”@+id/button_main”
android:id=”@+id/button_second”
android:onClick= “launchSecondActivity”
android:onClick=”returnReply”
android:text= “@string/button_main”
android:text= “@string/button_second”
Atribut Lama (EditText)
Atribut Baru (EditText)
android:id=”@+id/editText_main”
android:id=”@+id/editText_second”
android:layout_toLeftOf= “@+id/button_main”
android:layout_toLeftOf= “@+id/button_second”
android:layout_toStartOf= “@+id/button_main”
android:layout_toStartOf= “@+id/button_second”
android:hint= “@string/editText_main”
android:hint= “@string/editText_second”
Buka res/values/strings.xml dan tambahkan sumber daya String untuk teks tombol dan petunjuknya di EditText:
<string name="button_second">Reply</string>
<string name="editText_second">Enter Your Reply Here</string>
Dalam editor layout XML, letakkan kursor pada "returnReply", tekan Alt-Enter (Option-Enter di Mac) dan pilih Create ‘launchSecondActivity(View)’ dalam ‘SecondActivity’.
Dalam metode returnReply(), dapatkan teks EditText sebagai string:
String reply = mReply.getText().toString();
Membuat intent baru untuk respons tersebut.
Catatan: Jangan gunakan ulang objek intent yang diterima dari permintaan asalnya. Buat intent baru untuk respons tersebut.
Intent replyIntent = new Intent();
Tambahkan string balasan dari EditText ke intent baru sebagai ekstra intent. Karena ekstra adalah pasangan kunci/nilai, di sini kuncinya adalah EXTRA_REPLY dan nilainya adalah balasan:
replyIntent.putExtra(EXTRA_REPLY, reply);
Setel hasilnya ke RESULT_OK untuk menunjukkan bahwa responsnya berhasil. Kode hasil (termasuk RESULT_OK dan RESULT_CANCELLED) didefinisikan oleh kelas Aktivitas.
setResult(RESULT_OK,replyIntent);
Panggil finish() untuk menutup aktivitas dan kembali ke aktivitas utama.
finish();
4.3 Menambahkan TextViews ke layout aktivitas utama untuk menampilkan balasan
Salin dua TextViews untuk tampilan pesan dari file layout aktivitas kedua dan tempel ke layout utama di atas EditText yang ada dan tampilan Tombol.
Modifikasi nilai atribut untuk kedua TextViews baru ini. Gunakan nilai ini:
Atribut Lama (header TextView)
Atribut Baru (header TextView)
android:id=”@+id/text_header”
android:id=”@+id/text_header_reply”
android:text=”@string/text_header”
android:text= “@string/text_header_reply”
Atribut Lama (TextView pesan)
Atribut Baru (TextView pesan)
android:id=”@+id/text_message”
android:id=”@+id/text_message_reply”
android:layout_below= “@+id/text_header”
android:layout_below= “@+id/text_header_reply”
4.4 Mendapatkan balasan dari ekstra intent dan menampilkannya
dalam metode onCreate(), gunakan findViewByID untuk mendapatkan referensi dari layout ke header balasan dan TextView balasan. Tetapkan dua contoh tampilan ke variabel privat:
Dalam metode launchSecondActivity(), modifikasi panggilan ke startActivity() menjadi startActivityForResult(), dan sertakan kunci TEXT_REQUEST sebagai argumen:
startActivityForResult(intent, TEXT_REQUEST);
Buat metode callback onActivityResult() dengan tanda tangan ini:
public void onActivityResult(int requestCode, int resultCode,
Intent data) {}
Dalam onActivityResult(), panggil super.onActivityResult():
Tambahkan kode untuk TEXT_REQUEST (untuk memproses hasil intent yang benar, jika ada beberapa) dan RESULT_CODE (untuk memastikan permintaannya sukses):
if (requestCode == TEXT_REQUEST) {
if (resultCode == RESULT_OK) {
}
}
Di bagian dalam blok if, dapatkan ekstra intent dari intent respons (data). Di sini, kunci untuk ekstra adalah konstanta EXTRA_REPLY dari SecondActivity:
Dalam praktik ini Anda akan membuat proyek Android untuk aplikasi Scrolling Text, menambahkan TextView ke layout untuk judul dan subjudul artikel, dan mengubah elemen TextView “Hello World” yang sudah ada untuk menunjukkan artikel yang panjang. Gambar di bawah ini adalah diagram layout.
sesuaikan terlebih dahulu
Pada folder app > res > layout, buka file activity_main.xml, dan klik tab Text untuk melihat kode XML jika belum dipilih.
Tambahkan elemen TextView di atas TextView “Hello World”. Saat Anda memasukkan <TextView to start a TextView, Android Studio automatically adds the ending />, which is shorthand for </TextView>. Tambahkan atribut-atribut berikut ke TextView
Tambahkan elemen TextView TextView di atas “Hello World” TextView bawah TextView yang Anda buat pada langkah sebelumnya. Tambahkan atribut-atribut berikut ke TextView:
Setelah melakukan refaktorisasi, ubah nilai string name="app_name" dalam file strings.xml (dalam app > res > values) menjadi Hello Constraint (dengan spasi) sebagai nama aplikasi
Periksa untuk memastikan ConstraintLayout tersedia di proyek Anda:
+
Di Android Studio, pilih Tools > Android > SDK Manager.
Di panel kiri, klik Android SDK.
Di panel kanan, klik tab SDK Tools di bagian atas panel.
Luaskan Support Repository dan lihat apakah ConstraintLayout untuk Android dan Solver untuk ConstraintLayout sudah diperiksa.
+
Jika kata “Installed” muncul di kolom status, Anda sudah siap. Klik Cancel.
Jika “Not Installed” atau “Update” muncul:
+
Klik kotak centang di samping ConstraintLayout untuk Android dan Solver untuk ConstraintLayout. Ikon unduh seharusnya muncul di samping setiap kotak centang.
+
Klik salah satu dari yang berikut:
+
Apply untuk mulai memasang komponen dan tetap di SDK Manager untuk membuat perubahan lainnya.
OK untuk memasang komponen.
Setelah memasang komponen (dan membuat perubahan lain jika perlu), klik Finish saat selesai menggunakan SDK Manager.
Android Studio memiliki konverter bawaan untuk membantu Anda mengonversi layout ke ConstraintLayout. Ikuti langkah-langkah berikut:
+
Buka file layout (activity_main.xml) di Android Studio dan klik tab Design di bagian bawah jendela editor.
Di jendela Component Tree, klik kanan LinearLayout lalu pilih Convert layout to ConstraintLayout dari menu konteks.
Konverter menampilkan peringatan dengan dua kotak centang yang sudah dicentang. Jangan menghapus centang, pastikan kedua opsi tetap dicentang:
+
Ratakan Hierarki Layout: Opsi ini menghapus semua layout berlapis pada hierarki. Hasilnya adalah layout tunggal dan rata, yang mungkin lebih efisien untu tujuan ini.
+
Jangan meratakan layout yang direferensikan dari file lain: Jika layout tertentu mendefinisikan sebuah android:id attribute yang direferensikan di kode Java, Anda mungkin tidak ingin meratakannya karena kode mungkin tidak berfungsi lagi. Tetapi, pada HelloConstraint, Anda tidak memiliki android:id attribute untuk layout, hanya untuk tampilan.
Menjelajahi layout editor
Handle pembatas tanpa baris pembatas. Layout editor juga menawarkan baris tombol yang memungkinkan Anda mengonfigurasi tampilan layout:
Garis dan handle pembatas. Pada gambar, pembatas meratakan sisi kiri tampilan show_count ke sisi kiri tombol button_toast.
Handle Patokan. Handle patokan meratakan patokan teks tampilan ke patokan teks tampilan lainnya
Handle Mengubah Ukuran.
Pada gambar di atas:
+
Design, Blueprint, dan Both: Klik ikon Design (ikon pertama) untuk menampilkan pratinjau warna layout. Klik ikon Blueprint (ikon tengah) untuk menunjukkan hanya outline setiap tampilan. Anda bisa melihat tampilan keduanya berdampingan dengan mengeklik ikon ketiga.
Screen orientation: Klik untuk memutar perangkat antara lanskap dan potret.
Device type and size: Pilih tipe perangkat (ponsel/tablet, Android TV, atau Android Wear) dan konfigurasi layar (ukuran dan kepadatan).
API version: Pilih versi Android tempat pratinjau layout.
App theme: Pilih tema UI yang akan diterapkan pada pratinjau.
Language: Pilih bahasa untuk menampilkan string UI Anda. Daftar ini hanya menampilkan bahasa yang tersedia dalam sumber daya string.
Layout Variants: Beralih ke salah satu layout alternatif Anda untuk file ini, atau buat yang baru.
Salin folder proyek HelloToast, ganti namanya menjadi HelloRelative, dan lakukan refaktorisasi. (Lihat Appendix untuk membaca instruksi cara menyalin proyek.) Setelah melakukan refaktorisasi, ubah nilai <string name="app_name"> dalam file strings.xml (dalam app > res > values) menjadi Hello Relative (dengan spasi) sebagai nama aplikasi.
Buka file layout activity_main.xml, dan klik tab Text di bawah panel pengeditan untuk melihat kode XML.
Ubah <LinearLayout at the top to <RelativeLayout so that the statement looks like this:
Gulir ke bawah untuk memastikan bahwa tag akhirannya </LinearLayout> has also changed to </RelativeLayout>; jika belum, ubah secara manual.
Atur ulang tampilan dengan tab Design
Klik tab Design di bagian bawah panel pengeditan.
Seharusnya panel pengeditan sekarang terlihat seperti gambar di bawah, dengan desain layout dan blueprint-nya. Jika hanya melihat desain layout, atau blueprint saja, klik tombol Show Design + Blueprint (#1 dalam gambar di bawah ini).
Klik tab Text di bawah panel pengeditan. Periksa perubahan pada kode XML di panel pengeditan sebagai hasil mengubah LinearLayout ke RelativeLayout. Mulai dengan memeriksa Tombol kedua (button_count):
Klik tab Text di bawah panel pengeditan dan periksa perubahan pada kode XML sebagai akibat dari pemindahan tampilan di layout:
Tampilan show_count sekarang menggunakan atribut berikut untuk memposisikannya ke kanan dan ujung tampilan button_toast:
Di hierarki proyek, cari Gradle Scripts dan luaskan. Ada beberapa file build.gradle. Satu dengan arahan untuk seluruh proyek dan satu untuk setiap modul aplikasi. Modul untuk aplikasi Anda disebut “app”. Pada tampilan Proyek, modul ini diwakili oleh folder app di tingkat atas tampilan Proyek. (Berwarna Kuning), dan Buka build.gradle (Module.app). (Berwarna Biru)
// Add Android-specific build tasks
apply plugin: 'com.android.application'
// Configure Android specific build options.
android {
// Specify the target SDK version for the build.
compileSdkVersion 23
// The version of the build tools to use.
buildToolsVersion "23.0.2"
// Core settings and entries. Overrides manifest settings!
defaultConfig {
applicationId "com.example.hello.helloworld"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
// Controls how app is built and packaged.
buildTypes {
// Another common option is debug, which is not signed by default.
release {
// Code shrinker. Turn this on for production along with
// shrinkResources.
minifyEnabled false
// Use ProGuard, a Java optimizer.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
// This is the part you are most likely to change as you start using
// other libraries.
dependencies {
// Local binary dependency. Include any JAR file inside app/libs.
compile fileTree(dir: 'libs', include: ['*.jar'])
// Configuration for unit tests.
testCompile 'junit:junit:4.12'
// Remote binary dependency. Specify Maven coordinates of the Support
// Library needed. Use the SDK Manager to download and install such
// packages.
compile 'com.android.support:appcompat-v7:23.2.1'
}
Buka aplikasi Hello World di Android studio, dan di folder manifests folder, buka AndroidManifest.xml. Baca file dan pertimbangkan apa yang ditunjukkan oleh setiap kode. Kode di bawah ini dianotasi untuk memberi Anda petunjuk.
<!-- XML version and character encoding -->
<?xml version="1.0" encoding="utf-8"?>
<!-- Required starting tag for the manifest -->
<manifest
<!-- Defines the android namespace. Do not change. -->
xmlns:android="http://schemas.android.com/apk/res/android"
<!-- Unique package name of your app. Do not change once app is
published. -->
package="com.example.hello.helloworld">
<!-- Required application tag -->
<application
<!-- Allow the application to be backed up and restored. –>
android:allowBackup="true"
<!-- Icon for the application as a whole,
and default icon for application components. –>
android:icon="@mipmap/ic_launcher"
<!-- User-readable for the application as a whole,
and default icon for application components. Notice that Android
Studio first shows the actual label "Hello World".
Click on it, and you will see that the code actually refers to a string
resource. Ctrl-click @string/app_name to see where the resource is
specified. This will be covered in a later practical . –>
android:label="@string/app_name"
<!-- Whether the app is willing to support right-to-left layouts.–>
android:supportsRtl="true"
<!-- Default theme for styling all activities. –>
android:theme="@style/AppTheme">
<!-- Declares an activity. One is required.
All activities must be declared,
otherwise the system cannot see and run them. –>
<activity
<!-- Name of the class that implements the activity;
subclass of Activity. –>
android:name=".MainActivity">
<!-- Specifies the intents that this activity can respond to.–>
<intent-filter>
<!-- The action and category together determine what
happens when the activity is launched. –>
<!-- Start activity as the main entry point.
Does not receive data. –>
<action android:name="android.intent.action.MAIN" />
<!-- Start this activity as a top-level activity in
the launcher . –>
<category android:name="android.intent.category.LAUNCHER" />
<!-- Closing tags –>
</intent-filter>
</activity>
</application>
</manifest>
Klik tombol Android Monitor di bawah Android Studio untuk membuka Android Monitor. Level log default adalah Verbose. Di menu tarik-turun, ubah level log ke Debug.
File > Settings > Editor > General >Auto Import
Pilih semua kotak centang dan setel Insert importson paste ke All. Impor yang jelas sekarang ditambahkan secara otomatis ke file Anda. Catat bahwa opsi “add unambiguous imports on the fly” penting bagi beberapa fitur Android seperti NumberFormat. Jika tidak dicentang, NumberFormat menampilkan kesalahan. Klik ‘Apply’ lalu klik tombol ‘Ok’.
Dalam metode onCreate, tambahkan pernyataan log berikut:
Log.d("MainActivity", "Hello World");
Jika Android Monitor belum dibuka, klik tab Android Monitor di bawah Android Studio untuk membukanya. (Lihat tangkapan layar.)
Pastikan level Log di logcat Android Monitor disetel ke Debug atau Verbose (default).
Di Android Studio, pilih Run > Run app atau klik ikon Run di bilah alat, Di jendela Select Deployment Target, di bawah Available Emulators, pilih Yang di tentukan dan klik OK.
Di Android Studio, pilih Tools > Android > AVD Manager atau klik ikon AVD Manager dan lalu Klik +Create Virtual Devicem
Pilih perangkat keras Nexus 5 dan klik Next.
memilih select a system image lalu klik next
Pada layar System Image, pilih gambar sistem dan klik Next. Verifikasi konfigurasi Anda dan klik Finish. (Jika jendela AVD Manager Your Android Devices tetap terbuka, Anda bisa melanjutkan dan menutupnya.)
Melohat isi Folder manifests. Folder ini berisi AndroidManifest.xml. File ini menjelaskan semua komponen aplikasi Android Anda dan dibaca oleh sistem waktu proses Android saat program dijalankan.
com.example.hello.helloworld : Semua file untuk paket ada di folder yang bernama sama dengan paket tersebut. Untuk aplikasi Hello World, ada satu paket dan paket berisi MainActivity.java
com.example.hello.helloworld(androidTest): Folder ini untuk pengujian berinstrumen Anda, dan memulai dengan file pengujian kerangka.
com.example.hello.helloworld(test): Folder ini untuk pengujian unit dan memulai dengan file pengujian unit kerangka yang secara otomatis dibuat.
folder res. Folder ini berisi semua sumber daya untuk aplikasi Anda, termasuk gambar, file layout, string, ikon, dan penataan gaya. Folder ini berisi subfolder berikut (yang di Block):
–drawable. Simpan semua gambar aplikasi Anda di folder ini.
–layout. Setiap aktivitas memiliki paling tidak satu file layout yang menjelaskan UI di XML. Untuk Hello World, folder ini berisi activity_main.xml.
–mipmap. Simpan ikon peluncur Anda di folder ini. Ada subfolder untuk setiap kepadatan layar yang didukung.
–values. Sebagai ganti melakukan hardcode nilai-nilai seperti string, dimensi, dan warna di file XML dan Java, praktik terbaiknya adalah mendefinisikannya menurut file nilai. Ini membuatnya lebih mudah diubah dan konsisten di seluruh aplikasi Anda.
subfolder values dalam folder res. Folder ini berisi subfolder berikut:
colors.xml. Tunjukkan warna default untuk tema pilihan Anda, dan Anda bisa menambahkan warna sendiri atau mengubahnya berdasarkan persyaratan aplikasi Anda.
dimens.xml. Simpan ukuran tampilan dan objek untuk resolusi yang berbeda.
strings.xml. Buat sumber daya untuk semua string Anda. Ini memudahkan penerjemahan string ke bahasa lain.
styles.xml. Semua gaya untuk aplikasi dan tema Anda ada di sini. Gaya membantu memberikan aplikasi Anda tampilan yang konsisten untuk semua elemen UI.
Hafshah binti Sirin menceritakan, “Bila suatu saat Muhammad (bin Sirin) menemui ibunya, dia tidak pernah banyak berbicara dan mengumbar omongan yang tidak perlu, demi mengormati ibu.”
Shalat malam adalah ibadah yang penuh keutamaan, bahkan sebuah tradisi orang shalih. Berbakti kepada seorang ibu, ternyata melebihi nilai ibadah tersebut. Lebih-lebih bila atas permintaan sang ibu.
Ibu adalah sosok wanita istimewa bagi seseorang. Seorang lelaki tak akan lahir ke bumi kalau tidak ada seorang wanita bernama ibu. Tanpa jengah oleh tuduhan ngawur kaum feminis yang menganggap Islam bersikap diskriminatif terhadap wanita, Islam sudah menekankan untuk menghormati dan memuliakan kaum wanita. Bagaimana berbakti kepada Ibu? dengan cara menjadi orang yang penurut. pada zaman sahabat nabi, ada salah satu sahabat nabi berkata kepad nabi, “ya nabi, kepada siapakah saya berbakti di dunia ini,” nabi pun menjawab “kepada Ibu”. dan sahabat nabi menanyakan pertanyaan yang sama “ya nabi, kepada siapakah saya berbakti di dunia ini,” dan nabi pun menjawab nya tetap “ibu” sampai ketigakali pertanyaan tersebut di jawab oleh nabi “ibu”, dan sahabat tersebut bertanya kepada nabi ke empat kalinya , dan nabi pun menjawab dengan jawaban “Ayah”.
Oleh karena itulah kita sebagai manusia harus menghormati ibu, sebab ibulah yang telah melahirkan kita dengan susah payah, dan menaruhkan nyawa mereka.
Allah mencintai Amalan orang yang berbakti kepada orangtua, berbakti kepada orangtualah yang amat penting, karena doa yang dikabulkan oleh Allah yaitu Doa orangtua selain doa orang yang terkena bencana.
keutamaan puasa yaitu banyak sekali baik secara untuk mendapatkan pahala,medis,pisikologis.
puasa sebagai prisai yang bisa melindungi kita dari api neraka bahkan menjauhkan kita sejauh 70 tahun perjalanan.
dari Abu Said Al-khudri bahwa Rasulallah bersabda,” Tidaklah seorang hamda berpuasa sehari dalam jihad di jalan, kecuali Allah akan menjauhkan wajahnya dari api neraka sejauh 70 tahun.” (HR. jamaah kecuali Abu daud).
Puasa mengumpulkan ketiga jenis kesabaran: sabar dalam menjalankan perintah, sabar dalam menjauhi larangannya, sabar terhadap takdir yang menyusahkan seperti lapar dan haus.
dan puasa ini melindungi dari segala bentuk kemaksiatan dan bentuk kemungkaran.
orang yang menjalani puasa akan dimasuki kesurga dari pintu Ar-Rayyan, pintu yang di kenal dengan ar-rayyan, pintu surga tersebut apabila orang orang yang berpuasa sudah masuk pada hari kiyamat, maka di tutuplah pintu surga Ar-rayyan.
Maka sudah sepantasnya bagi orang muslim untuk bersegera mengamalkan amalan ini dan hendaknya dia menanggung beban kesulitan yang sedikit itu (pembatal puasa), gunanya mendapatkan pahala yang besar atau kebahagiaan yang besar ketika ia berbuka dan ketika ia berjumpa dengan Rabbnya pada hari kiamat.
Shalat Tahajud yaitu Shalat sunnah yang sangat menguntungkan bagi yang menjalankannya, shalat tahajud yang bagusnya itu jam 2 pagi. Allah menyebut orang yang shalat tahajud sebagai orang muslim, dan Allah memasukan orang yang menjalankan Shalay tahajud kegolongan orang yang beriman. Allah bersaksi. ” Siapa yang melakukan Shalat Tahajud, dia lah orang-orang yang beriman“. di situlah Aallah membedakan orang yang melakukan Shalat Tahajud dengan orang yang tidak melakukan Shalat tahajud.
Abdullah bin Amr adalah salah satu senior sahabat nabi, Beliau telah takdiri oleh Allah SWT menjadi orang yang sangat rajin beribadah, tidak ada seorang pun yang bisa mengalahkan ibadah beliau kepada Allah, baikpun Shalat, dan ibadah lainnya seperti berpuasa.
Beliau berkata kepada Rasulallah ” Ya rasul, Ijinkan lah saya menggunakan sekuat tenaga saya untuk beribadah kepada Allah SWT?”. Nabi Muhammad saw pun bersabda ” Jika ngkau melakukan semua itu, Badanmu akan lemah, Matamu akansakit, karena semalaman ngkau tidak tidur. Sesunggunya badanmu mempunyai hak, Keluargamu pun mempunyai hak, dan para tamumu mempunyai hak juga atas dirimu…!.”
Abdullah bin Amr lah orang yang di bilang sangat tekun beribadah kepada Allah SWT, Sehingga beliau meminta beribadah sebanyak banyaknya, Tetapi Nabi saw memberi peringatan atau teguran kepadanya.
Haji itu di lakukan oleh umat islam bagi yang mampu, dan wajib bagi yang mampu. keutamaan ibadah haji seperti menjadi tamu Allah yang terhormat, yang paling utama mendapat pahala jihad.
Rasulullah bersabda.”Jihad yang afdhal adalah haji mabrur.” (HR.Bukhari dariAisyah ra). Yang melakukan ibadah haji mendapatkan ampunan dosa, sehingga bersih seperti bayi bar lahir, dan yang paling keistimewaan ibadah haji mendapatkan pahaa syurga. Rasulallah bersabda “Haji yang mabrur lah tiada balasannya selain syurga.” (HR.Bukhari dan Muslim dari Abu hurairah)
Zakat yaitu kewajiban yang ditunaikan setip muslim, Salahsatunya ya itu zakat fitrah,Zakat maal.
Zakat Fitrah itu wajib di bayar oleh setiap muslim, bagi siapa saja, baikpun tua atau muda, baik ekonomi rendah ataupun ekonomi tinggi. bentuk zakat fitra seperti makanan pokok, seperti beras. di bayar pada bulan ramadhan sebelum shalat ied
Zakat maal yaitu wajib di bayaroleh setiap muslim yang memiliki harta, atau tajir, dengan jumlah yang tertentu. dan jenis zakat ini seperti sapi, kambing dan ayam .
salman sahabat nabi yang berasal dari Persia, salman ketika meninggalkan kampung halamannya bertemu Nabi Muhammad di kota madina.
Salman bernama lengkap Salman Al-fahrrasi adalah maban bin budzkhasyah bin mousilan bin bahbudzan bin fairuz bin sahrk al-fahani. Dia di kenal dengan nama salman al-farisi.
salman sebelum memeluk agama islam memeluk agama nasrani,Salman menemui Nabi Muhammad atas saran pendeta, bahwa pada zaman itu lah nabi di utus.
suatu hari, salman melihat ciri kenabian di pundak Nabi Muhammad, salman pergi ke tempat pemakaman, di situ ada Nabi Muhammad dan para sahabatnya. Salman melihat Nabi Muhammad baju nya kotor dan nabi Muhammad melepas bajunya, dan salman melihat Cap kenabian di pundak nabi dan salman langsung memeluk Nabi dan di situlah salman Memeluk Agama Islam.
Sholat Duha
solat duha itu sedekah, “barang siapa yang mengerjakan sholat duha niscaya akan diampuni dosa-dosanya,dan juga di perlancar rizkynya”. Menurut rasul ,Allah akan memperlancar Rizy orang yang melakukan sholat duha.
(sholat itu bisa mengganti olahraga). Sholat duha juga bisa menghilangkan setres dan membuat badan kita fres.
Barang siapa yang melakukan sholat Jum’at, diantara jumat sekarang dan jumat berikutnya akan di hindari dari dosa, apabila tidak sedang berbuat dosa besar”,dan barang siapa yang datang kesempatan pertama seolah dia berkurban dengan Unta, dan kedua,ketiga,keempat dengan kambing,ayam dan telur.” Apabila orang yang duduk diam dan mendengarkan kotbah jum’at, seolah dia berpuasa selama satu tahun.
Ancaman yang meninggalkan sholat jumatakan emndapatkan dosa besar, dan akan menjadi orang yang tergolong orang yang lalai, dan juga orang yang meninggalkan sholat jumat selama tigakali berturut turut, itulah termasuk golongan orang yang munafik.