Tujuan artikel
Artikel ini akan membahas masalah pengembangan dan pengembangan Android secara umum. Kita semua tahu bahwa mengembangkan sebuah program adalah pekerjaan yang sulit, yang membutuhkan banyak waktu dan upaya, dan kadang-kadang dibutuhkan banyak waktu untuk menemukan solusi untuk suatu masalah, karena beberapa solusi dari Internet tidak selalu berhasil.
Artikel ini akan membahas masalah-masalah berikut:
- Keyboard khusus untuk Android
- Multithreading
- Integrasi iklan dalam program
Keyboard khusus untuk Android
Dalam program saya, dalam kalkulator saya, saya harus membuat keyboard sendiri, karena memasukkan rumus matematika dari keyboard sistem sangat tidak nyaman. Mencoba memecahkan masalah ini, saya naik ke banyak forum, mencoba beberapa solusi berbeda, tetapi semuanya tidak memberikan hasil yang diinginkan.
Mari kita mulai:- Buat proyek baru di studio android.
- Mari kita buat beberapa kelas
- Menguji aplikasi
Mari kita membuat papan ketik 9 karakter dengan kemampuan untuk menghapus karakter-karakter ini.
Mari beri nama KeyBoardTest proyek kami

Pilih aktivitas kosong dan mulai

Selesai, kami telah membuat proyek baru kami. Sekarang kita akan berurusan dengan yang paling mendasar, yaitu, membuat file layout di folder - res / layout dan menyebutnya keyboard, di sini kita akan memiliki tampilan keyboard.
Mari menggambar keyboard ini:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_gravity="bottom" android:background="@color/colorBlue" android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <TextView android:id="@+id/one" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/one" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/two" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/two" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/three" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/three" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/four" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/four" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/five" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/five" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <TextView android:id="@+id/six" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/six" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/seven" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/seven" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/eight" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/eight" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/nine" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/nine" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <TextView android:id="@+id/delete" android:textColor="@color/colorWhite" android:gravity="center" android:textSize="30sp" android:text="@string/delete" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> </LinearLayout> </LinearLayout> </FrameLayout>
Setelah keyboard kita ditarik, kita dapat membuat kelas yang akan mendaftarkan semua penekanan tombol kita dan menulis apa yang kita butuhkan. Harap perhatikan bahwa setiap tampilan teks memiliki id - ini sangat penting!
Panggil kelas ini KeyBoardListener.
Kami menulis konstruktor dari kelas kami, dibutuhkan View sebagai argumen - bidang tempat kami bekerja, dengan kata lain, lokasi editText kami, dan juga dibutuhkan editText sendiri, di mana kami akan mencetak karakter dari keyboard kami.
package keyboard.develop.keyboardtest; import android.view.View; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class KeyBoardListener { EditText editText; private StringBuilder finalText = new StringBuilder(); KeyBoardListener(View view, final EditText editText) { this.editText = editText; TextView one = view.findViewById(R.id.one); TextView two = view.findViewById(R.id.two); TextView three = view.findViewById(R.id.three); TextView four = view.findViewById(R.id.four); final TextView five = view.findViewById(R.id.five); TextView six = view.findViewById(R.id.six); TextView seven = view.findViewById(R.id.seven); TextView eight = view.findViewById(R.id.eight); TextView nine = view.findViewById(R.id.nine); TextView delete = view.findViewById(R.id.delete); final LinearLayout layout = view.findViewById(R.id.keyBoard); one.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "1"); setTextSelection(); } }); two.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "2"); setTextSelection(); } }); three.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "3"); setTextSelection(); } }); four.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "4"); setTextSelection(); } }); five.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "5"); setTextSelection(); } }); six.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "6"); setTextSelection(); } }); seven.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "7"); setTextSelection(); } }); eight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "8"); setTextSelection(); } }); nine.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); finalText.insert(selection, "9"); setTextSelection(); } }); delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selection = editText.getSelectionEnd(); if (finalText.length() > 0) { finalText = stringToBuilder(finalText.substring(0, selection - 1 == -1 ? 0 : selection - 1) + finalText.substring(selection)); editText.setText(finalText); } editText.setSelection(selection - 1 <= 0 ? 0 : selection - 1); } }); editText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { layout.setVisibility(View.VISIBLE); } }); } private StringBuilder stringToBuilder(String s) { return new StringBuilder(s); } private void setTextSelection() { int selection = editText.getSelectionEnd(); editText.setText(finalText); editText.setSelection(selection + 1); } }
Sekarang pertimbangkan kode ini secara detail. Kami melewati editText dan melihat ke konstruktor itu sendiri untuk mengambil tombol dan menetapkan input mereka. Perlu dicatat bahwa metode tombol hapus menggunakan "gula sintaksis", dengan kata lain, ini adalah entri kode yang disingkat. Tidak semua orang tahu desain ini, jadi saya memutuskan bahwa kita harus memperhatikannya. Ini bisa sangat berguna bagi pemula.
Desain ini berfungsi seperti ini
int p = () ? 1 : 2; int p = k == 2 ? 7 : 3;
Tapi kami menjauh dari topik. Sekarang, setelah konstruktor kami siap, dan kami dapat menanggapi klik tombol, kami dapat menggunakan kelas kami. Pertama-tama kita perlu memanggil kelas ini dalam aktivitas utama kita
package keyboard.develop.keyboardtest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.view.WindowManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private LinearLayout layout; private ExecutorThread executorThread; @Override protected void onCreate(Bundle savedInstanceState) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Perlu memperhatikan garis ini.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Pada baris ini, kita mematikan keyboard sistem, tetapi pada saat yang sama meninggalkan kursor sehingga kita dapat bergerak di antara karakter dan memasukkan angka / huruf, dll. Inilah sebabnya kami menggunakan kelas
StringBuilder dan metode
penyisipan dalam kode di atas.
Karena kenyataan bahwa seluruh metode ini disebut sebagai kelas yang terpisah, kita dapat menambahkannya di mana saja dan menggunakannya dalam program apa pun. Dengan demikian, obyektivitas kode diperoleh.
Tapi saya tidak menunjukkan kepada Anda bagaimana melakukan ini dalam kode xml, cara memberi tahu kami lokasi keyboard ini, dan semuanya sangat sederhana
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="keyboard.develop.keyboardtest.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:textColor="@color/colorPrimary" android:gravity="center" android:textSize="25sp" android:layout_width="match_parent" android:layout_height="50dp" android:text="Write your text here!"/> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout> <LinearLayout // android:visibility="gone" android:id="@+id/keyBoard" android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_gravity="bottom"> <include layout="@layout/keyboard"/> // , </LinearLayout> </FrameLayout>
Sekarang dengan manipulasi mudah kita dapat menggunakan keyboard kita di mana saja, bahkan dalam fragmen.
Dalam aplikasi kami, keyboard terlihat seperti ini

Multithreading
Multithreading - namanya menyiratkan bahwa ada banyak utas. Dan banyak utas - ini berarti melakukan beberapa operasi secara bersamaan. Multithreading adalah topik yang cukup bermasalah dalam pemrograman. Apa yang ada di C ++, apa yang ada di Java, bahasa lain apa dengan multithreading selalu bermasalah. Untungnya, hampir semua bahasa memiliki solusi tingkat tinggi untuk masalah ini. Namun saat ini kami sedang mengembangkan untuk Android, jadi kami akan berbicara tentang Anroid, dan lebih khusus lagi tentang bahasa pemrograman Java.
Di Java YP ada yang namanya Thread - lebih mudah untuk menggambar, dengan sering menggambar ulang secara instan, ada banyak artikel tentang hal ini, termasuk tentang HabrΓ©, jadi saya tidak akan mempertimbangkan opsi ini. Saya tertarik pada apa yang disebut "aliran jatuh tertidur", aliran yang menunggu panggilannya untuk menyelesaikan tugas tertentu. Ini adalah kasus ketika Anda menelepon utas, utas itu berfungsi dan tertidur, tanpa menghabiskan sumber daya perangkat sambil menunggu tugas baru.
Dan nama yang saya jelaskan di atas adalah kelas dari paket standar java.util.concurrent
ExecutorServiseInti dari kelas ini adalah dapat menggunakan kembali utas yang sama tanpa membuat yang baru. Dan sekarang kita akan mempertimbangkan cara kerjanya, kita tidak akan membuat program baru, tetapi kita akan terus bekerja di kita.
Untuk melakukan ini, buat kelas baru, yang akan disebut ExecutorThread. Kami menimbulkan masalah bahwa kami perlu menambahkan satu ke digit
p sampai
p ini sama dengan angka yang kami perkenalkan dalam 4 derajat. Semuanya dilakukan agar perhitungannya lebih lama. Dan agar seluruh antarmuka tidak membeku, kami akan meletakkan semuanya di utas terpisah.
package keyboard.develop.keyboardtest; import android.widget.TextView; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorThread { private ExecutorService executorService; private Thread thread; private int p = 0; private int pow = 0; private int k = 0; private TextView textView; ExecutorThread(final TextView text) { p = 0; textView = text; thread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < pow; i++) p++; String s = "Result " + k + "^4 = " + String.valueOf(p); textView.setText(s); } }); thread.start(); executorService = Executors.newSingleThreadExecutor(); } void doWork() { executorService.submit(thread); } void setK(int k) { p = 0; this.k = k; pow = (int) Math.pow(k, 4); textView.setText("Please wait. We are calcing!"); } }
Seperti yang dapat kita lihat, pada saat itu, sementara kami belum menghitung, kami melihat entri βMohon tunggu. Kami sedang melahirkan! ", Yang jelas -" Silakan tunggu. Kami menghitung! " Dan setelah kami menghitung, kami akan menampilkan teks ke textView kami, yang kami sampaikan ke konstruktor kelas kami. Agar semuanya berfungsi, kita harus menambahkan textView setelah editText ke activity_main kita, yang kita miliki saat membuat proyek.
<TextView android:gravity="center" android:textColor="@color/colorPrimary" android:textSize="25sp" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="50dp"/>
Dan kita juga perlu menambahkan kode di bawah ini ke kelas utama kita - MainActivity.
executorThread = new ExecutorThread((TextView)findViewById(R.id.textView)); editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} @Override public void afterTextChanged(Editable editable) { if (!editable.toString().equals("")) { executorThread.setK(Integer.parseInt(editText.getText().toString())); executorThread.doWork(); } } });
Perlu dicatat bahwa metode addTextChangeListener bertanggung jawab untuk mengubah teks di editText kami. Seperti yang kita lihat, di dalam metode, kita memanggil fungsi doWork (), yang kemudian mengeksekusi baris-baris ini
executorService.submit(thread);
Saya memeriksa semua hal di atas di ponsel saya, jadi jika Anda melakukan semuanya dengan benar, maka Anda seharusnya tidak memiliki masalah atau kesalahan.
Seperti yang bisa kita lihat, metode ini cukup nyaman dan mudah dimengerti, saya mencoba menggambarkan semuanya sesederhana mungkin, jadi saya harap semuanya jelas bagi Anda, tetapi saya tidak melewatkan apa pun.
Dan sekarang, mari kita beralih ke poin 3 dari artikel kami, yaitu, integrasi periklanan.
Integrasi iklan
Sebenarnya, saya tidak bisa bicara banyak tentang ini, saya hanya bisa memberi saran. Dengan iklan, tidak semuanya begitu mudah dan transparan. Secara pribadi, saya akan menyarankan Anda untuk menggunakan Appodeal, sudah ada di pasaran belum lama ini, tetapi ia bekerja dengan cukup sukses.
Perlu juga dicatat bahwa ada dukungan bahasa Rusia yang sangat baik, yang hampir selalu menjawab pertanyaan Anda atau masalah Anda segera. Ini segera memperjelas seberapa loyal jaringan ini.
Saya ingin mengatakan segera, jika Anda tiba-tiba menggunakannya, pastikan untuk mengatur pembayaran di AdMob dan Appodeal, jika tidak, iklan itu tidak akan dimuat. Karena fakta bahwa saya tidak membuat akun, saya menyia-nyiakan sepanjang hari, dan kemudian mereka memberi tahu saya dalam dukungan: "Apakah saya sudah mengatur akun?" Dan setelah saya melakukan ini, maka sebuah iklan muncul 2 jam kemudian.
Kesimpulan
Karena artikel ini ditujukan untuk programmer pemula, saya ingin mencatat satu hal yang jelas. Jika Anda benar-benar menyukai pemrograman, dan Anda siap untuk menghabiskan berjam-jam memecahkan masalah tertentu, maka pemrograman adalah milik Anda, jika tidak, tidak. Juga, jangan melampaui. Karena solusinya juga terlalu lama, sesuatu yang tidak terlalu rumit dan tidak terlalu sederhana tidak baik. Tetapi ini adalah fakta yang jelas. Bahkan, saya membaca frasa ini di suatu tempat di Internet. Padahal itu benar. Jika Anda memikirkannya, maka sungguh, jika pemrograman, pemrograman serius akan sangat mudah, maka sebagian kecil orang dari jumlah total semua orang tidak akan terlibat di dalamnya.
Saya berharap bahwa artikel saya ternyata bermanfaat bagi seseorang dan benar-benar membantu seseorang, ini membantu saya menghemat waktu, karena saya secara pribadi membunuh keyboard pada keyboard, itu akan tampak seperti hal yang sederhana, 3 hari, dan saya butuh 2 untuk mendapatkan utas dan mencari solusi normal hari ini.