Android開発と開発問題の解決

記事の目的



この記事では、Androidの開発と開発全般の問題について説明します。 プログラムの開発は多くの困難な作業であり、多くの時間と労力がかかること、そして問題の解決策を見つけるのに時間がかかることがあることは誰もが知っています。



この記事では、次の問題に対処します。





Android用のカスタムキーボード



私のプログラムでは、電卓で、システムキーボードから数式を入力するのは非常に不便なので、自分でキーボードを作成する必要がありました。 この問題を解決しようとして、私はたくさんのフォーラムに登り、いくつかの異なるソリューションを試しましたが、それらはすべて望ましい結果を与えませんでした。



始めましょう:

  1. Android Studioで新しいプロジェクトを作成します。
  2. いくつかのクラスを作成しましょう
  3. アプリケーションをテストする


9文字のシンプルなキーボードを作成して、これらの文字を削除してみましょう。

プロジェクトにKeyBoardTestという名前を付けましょう







空のアクティビティを選択して開始







完了、新しいプロジェクトを作成しました。 ここで最も基本的なものを扱います。つまり、フォルダにレイアウトファイルを作成します-res / layoutで、それをキーボードと呼びます。ここでは、キーボードの外観があります。



このキーボードを描きましょう:



<?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>
      
      





キーボードが描画されたら、すべてのキーストロークを登録し、必要なものを書き込むクラスを作成できます。 各textviewにはIDがあることに注意してください-これは非常に重要です!



このクラスをKeyBoardListenerと呼びます。



クラスのコンストラクタを作成します。引数としてViewを取ります。つまり、作業中のフィールド、つまり、editTextの場所を取ります。また、キーボードから文字を出力するeditText自体も取ります。



 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); } }
      
      





次に、このコードを詳細に検討します。 ボタンを取得してそれらに入力を割り当てるために、editTextとviewをコンストラクター自体に渡しました。 削除ボタンメソッドは「構文糖」を使用していることに注意してください。言い換えると、これは短縮されたコードエントリです。 誰もがこの設計を知っているわけではないので、私たちはそれに注意を払うべきだと決めました。 これは特に初心者に役立ちます。



この設計はこのように機能します



 int p = () ?  1 :  2; int p = k == 2 ? 7 : 3; //      if (k == 2) p = 7; else p = 3;
      
      





しかし、私たちはこのトピックから離れました。 これで、コンストラクタの準備が整い、ボタンのクリックに応答できるようになった後、クラスを使用できます。 まず、メインアクティビティでこのクラスを呼び出す必要があります



 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); //   ,     super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText = findViewById(R.id.edit); layout = findViewById(R.id.keyBoard); new KeyBoardListener(layout, editText); 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(); } } }); } @Override public void onBackPressed() { layout.setVisibility(View.GONE); //   } }
      
      





この行に注意する価値があります。



 getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
      
      





この行では、システムキーボードをオフにしますが、同時にカーソルを離して、文字間を移動したり、数字や文字などを挿入したりできるようにします。 これがまさに、上記のコードでStringBuilderクラスとinsertメソッドを使用した理由です。

このメソッド全体が個別のクラスとして呼び出されるという事実により、どこにでも追加して、任意のプログラムで使用できます。 したがって、コードの客観性が得られます。



しかし、XMLコードでこれを行う方法、このキーボードの位置をどのように伝えるか、そしてすべてが非常に簡単です



 <?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>
      
      





簡単に操作できるようになったので、キーボードをどこでも、断片的にでも使用できます。



このアプリケーションでは、キーボードは次のようになります







マルチスレッド



マルチスレッド-名前は多くのスレッドがあることを意味します。 そして、多くのスレッド-これは、いくつかの操作を同時に実行することを意味します。 マルチスレッドは、プログラミングにおいてかなり問題のあるトピックです。 C ++で何が、Javaで何が、マルチスレッドを使用する他のどの言語が常に問題を抱えていましたか。 幸いなことに、ほとんどすべての言語には、この問題に対する高度なソリューションがあります。 ただし、現在Android向けに開発中です。そのため、Anroidについて、具体的にはJavaプログラミング言語について説明します。



Java YPにはThreadのようなものがあります-描画に便利です。画像を頻繁に瞬時に再描画すると、Habréを含むこの主題に関する記事が多数あるため、このオプションは検討しません。 特定のタスクを解決するための呼び出しを待っているストリーム、いわゆる「眠りに落ちるストリーム」に興味があります。 これは、新しいタスクを待機している間にデバイスリソースを浪費することなく、スレッドを呼び出して動作し、スリープ状態になった場合です。



上記で説明した名前は、標準パッケージjava.util.concurrent ExecutorServiseのクラスです



このクラスの本質は、新しいスレッドを作成せずに同じスレッドを再利用できることです。 そして今、私たちはそれがどのように機能するかを検討し、新しいプログラムを作成するのではなく、私たちのもので働き続けます。



これを行うには、ExecutorThreadと呼ばれる新しいクラスを作成します。 このpが4度で導入した数と等しくなるまで、数字pに 1を追加する必要があるという問題を提起しましょう。 計算が長くなるようにすべてが行われます。 インターフェイス全体がフリーズしないように、これを別のスレッドに配置します。



 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!"); } }
      
      





ご覧のとおり、その時点ではまだ計算されていませんが、「お待ちください。 計算中です!」、これは明らかです-「お待ちください。 数えます!」 そして、カウントした後、テキストをtextViewに出力し、それをクラスのコンストラクターに渡します。 すべてが機能するためには、editTextの後に、プロジェクトを作成したときに持っていたactivity_mainにtextViewを追加する必要があります。



 <TextView android:gravity="center" android:textColor="@color/colorPrimary" android:textSize="25sp" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="50dp"/>
      
      





また、メインクラス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(); } } });
      
      





addTextChangeListenerメソッドは、editTextのテキストを変更することに注意してください。 ご覧のとおり、メソッド内でdoWork()関数を呼び出し、これらの行を実行します



 executorService.submit(thread);
      
      







私は私の電話で上記のすべてをチェックしたので、あなたがすべてを正しくやったなら、問題やエラーはないはずです。



ご覧のとおり、この方法は非常に便利で理解しやすいです。すべてをできるだけシンプルに説明しようとしたので、すべてが明確になっていることを願っていますが、私は何も見逃していません。



それでは、記事のポイント3、つまり広告の統合に進みましょう。



広告統合



実際、これについてはあまり話せませんが、アドバイスしかできません。 広告では、すべてがそれほど簡単で透明ではありません。 個人的には、Appodealを使用することをお勧めします。Appodealはかなり前に市場に出回っていましたが、非常にうまく機能しています。



また、ロシア語の非常に優れたサポートがあり、ほとんどの場合、質問や問題にすぐに回答します。 これにより、このネットワークがどれほど忠実であるかがすぐにわかります。



すぐに使用したい場合は、AdMobとAppodealで支払いを設定してください。そうしないと、広告が読み込まれません。 アカウントを設定しなかったため、1日中無駄になりましたが、「アカウントを設定しましたか?」 そして、これを行った後、2時間後に広告が表示されました。



おわりに


この記事は初心者プログラマを対象としているため、1つの明らかな点に注意したいと思います。 プログラミングが本当に好きで、特定の問題を解決するのに何時間も費やす準備ができているなら、プログラミングはあなたのものです。 また、超えないでください。 解決策も長すぎるため、複雑すぎず、単純すぎないものは良くありません。 しかし、これは明らかな事実です。 実際、私はこのフレーズをインターネットのどこかで読んだ。 実際、それは本当です。 考えてみると、実際、プログラミングなら、真面目なプログラミングはとても簡単だろうし、すべての人の中で少数の人はそれに従事しないだろう。



私の記事が誰かにとって有用であり、本当に助けになり、時間を節約するのに役立つことを願っていますその日の。



All Articles