Android-Entwicklung und Lösung von Entwicklungsproblemen

Zweck des Artikels


In diesem Artikel werden die Probleme der Android-Entwicklung und der Entwicklung im Allgemeinen erläutert. Wir alle wissen, dass die Entwicklung eines Programms eine Menge schwieriger Arbeit ist, die viel Zeit und Mühe kostet, und manchmal viel Zeit, um eine Lösung für ein Problem zu finden, da einige Lösungen aus dem Internet nicht immer funktionieren.

Dieser Artikel behandelt die folgenden Probleme:

  • Benutzerdefinierte Tastatur für Android
  • Multithreading
  • Integration von Werbung in das Programm

Benutzerdefinierte Tastatur für Android


In meinem Programm musste ich in meinem Taschenrechner meine eigene Tastatur erstellen, da die Eingabe mathematischer Formeln über die Systemtastatur äußerst unangenehm ist. Um dieses Problem zu lösen, bin ich in eine Reihe von Foren geklettert und habe verschiedene Lösungen ausprobiert, aber nicht alle haben das gewünschte Ergebnis erzielt.

Fangen wir an:
  1. Erstellen Sie ein neues Projekt in Android Studio.
  2. Lassen Sie uns ein paar Klassen erstellen
  3. Testen der Anwendung

Lassen Sie uns eine einfache Tastatur mit 9 Zeichen erstellen, mit der diese Zeichen gelöscht werden können.
Nennen wir unser Projekt KeyBoardTest



Wählen Sie eine leere Aktivität und starten Sie



Fertig, wir haben unser neues Projekt erstellt. Jetzt werden wir uns mit dem grundlegendsten befassen, nämlich eine Layoutdatei im Ordner - res / layout erstellen und als Tastatur bezeichnen. Hier haben wir das Erscheinungsbild der Tastatur.

Zeichnen wir diese Tastatur:

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

Nachdem unsere Tastatur gezeichnet wurde, können wir eine Klasse erstellen, die alle unsere Tastenanschläge registriert und schreibt, was wir brauchen. Bitte beachten Sie, dass jede Textansicht eine ID hat - das ist sehr wichtig!

Rufen Sie diese Klasse KeyBoardListener auf.

Wir schreiben den Konstruktor unserer Klasse, er verwendet View als Argument - das Feld, in dem wir arbeiten, dh den Speicherort unseres editText, und er akzeptiert auch den editText selbst, in dem wir Zeichen von unserer Tastatur drucken.

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

Betrachten Sie diesen Code nun im Detail. Wir haben editText und view an den Konstruktor selbst übergeben, um die Schaltflächen zu übernehmen und ihnen Eingaben zuzuweisen. Es ist zu beachten, dass die Löschschaltflächenmethode "syntaktischen Zucker" verwendet, dh es handelt sich um eine abgekürzte Codeeingabe. Nicht jeder kennt dieses Design, deshalb habe ich beschlossen, dass wir darauf achten sollten. Dies kann besonders für Anfänger nützlich sein.

Dieser Entwurf funktioniert so

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

Aber wir haben uns vom Thema entfernt. Nachdem unser Konstruktor fertig ist und wir auf Schaltflächenklicks reagieren können, können wir unsere Klasse verwenden. Zuerst müssen wir diese Klasse in unserer Hauptaktivität aufrufen

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

Es lohnt sich, auf diese Linie zu achten.

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

In dieser Zeile schalten wir die Systemtastatur aus, lassen aber gleichzeitig den Cursor, damit wir zwischen Zeichen wechseln und Zahlen / Buchstaben usw. einfügen können. Genau aus diesem Grund haben wir im obigen Code die StringBuilder- Klasse und die Einfügemethode verwendet.
Aufgrund der Tatsache, dass diese gesamte Methode als separate Klasse aufgerufen wird, können wir sie überall hinzufügen und in beliebigen Programmen verwenden. Somit wird die Objektivität des Codes erhalten.

Aber ich habe Ihnen nicht gezeigt, wie man das in XML-Code macht, wie man uns die Position dieser Tastatur sagt und alles ist sehr einfach

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

Mit einfachen Manipulationen können wir unsere Tastaturen jetzt überall verwenden, auch in Fragmenten.

In unserer Anwendung sieht die Tastatur so aus



Multithreading


Multithreading - der Name impliziert, dass es viele Threads gibt. Viele Threads - dies bedeutet, dass mehrere Vorgänge gleichzeitig ausgeführt werden. Multithreading ist ein ziemlich problematisches Thema in der Programmierung. Was in C ++, was in Java, welche anderen Sprachen mit Multithreading hatten immer Probleme. Glücklicherweise haben fast alle Sprachen eine umfassende Lösung für dieses Problem. Wir entwickeln derzeit für Android, daher werden wir über Anroid und insbesondere über die Programmiersprache Java sprechen.

In Java YP gibt es so etwas wie Thread - es ist praktisch zum Zeichnen, da das Bild häufig sofort neu gezeichnet wird. Es gibt viele Artikel zu diesem Thema, einschließlich zu Habré, daher werde ich diese Option nicht in Betracht ziehen. Ich interessiere mich für den sogenannten „Einschlaf-Stream“, einen Stream, der auf seinen Aufruf wartet, um eine bestimmte Aufgabe zu lösen. Dies ist der Fall, wenn Sie einen Thread aufgerufen haben, der funktioniert hat und eingeschlafen ist, ohne Geräteressourcen zu verschwenden, während Sie auf eine neue Aufgabe warten.

Und der Name von dem, was ich oben beschrieben habe, ist eine Klasse aus dem Standardpaket java.util.concurrent ExecutorServise

Das Wesentliche dieser Klasse ist, dass sie denselben Thread wiederverwenden kann, ohne einen neuen zu erstellen. Und jetzt werden wir überlegen, wie es funktioniert, wir werden kein neues Programm erstellen, aber wir werden weiterhin in unserem arbeiten.

Erstellen Sie dazu eine neue Klasse mit dem Namen ExecutorThread. Wir stellen das Problem, dass wir eins zur Ziffer p hinzufügen müssen, bis dieses p gleich der Zahl ist, die wir in 4 Grad eingeführt haben. Alles wird so gemacht, dass die Berechnung länger ist. Und damit die gesamte Benutzeroberfläche nicht einfriert, werden wir alles in einen separaten Thread stellen.

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

Wie wir sehen können, sehen wir in diesem Moment, obwohl wir noch nicht gezählt haben, den Eintrag "Bitte warten. Wir kalibrieren! “, Was klar ist -„ Bitte warten Sie. Wir zählen! " Und nachdem wir gezählt haben, geben wir den Text in unsere Textansicht aus, die wir an den Konstruktor unserer Klasse übergeben haben. Damit alles funktioniert, müssen wir nach unserem editText eine Textansicht zu unserer activity_main hinzufügen, die wir beim Erstellen des Projekts hatten.

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

Außerdem müssen wir den folgenden Code zu unserer Hauptklasse hinzufügen - 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(); } } }); 

Es ist erwähnenswert, dass die Methode addTextChangeListener für die Änderung des Textes in unserem editText verantwortlich ist. Wie wir sehen, rufen wir innerhalb der Methode die Funktion doWork () auf, die diese Zeilen wiederum ausführt

 executorService.submit(thread); 


Ich habe alle oben genannten Punkte auf meinem Telefon überprüft. Wenn Sie also alles richtig gemacht haben, sollten Sie keine Probleme oder Fehler haben.

Wie wir sehen können, ist diese Methode sehr praktisch und leicht zu verstehen. Ich habe versucht, alles so einfach wie möglich zu beschreiben. Ich hoffe, Ihnen ist alles klar, aber ich habe nichts verpasst.

Kommen wir nun zu Punkt 3 unseres Artikels, nämlich der Integration von Werbung.

Anzeigenintegration


Tatsächlich kann ich nicht viel darüber reden, ich kann nur raten. Mit Werbung ist nicht alles so einfach und transparent. Persönlich würde ich Ihnen raten, Appodeal zu verwenden. Es ist noch nicht so lange auf dem Markt, funktioniert aber recht erfolgreich.

Es ist auch erwähnenswert, dass es eine sehr gute Unterstützung in russischer Sprache gibt, die Ihre Frage oder Ihr Problem fast immer sofort beantwortet. Dies macht sofort deutlich, wie loyal dieses Netzwerk ist.

Ich möchte sofort sagen, wenn Sie es plötzlich verwenden, stellen Sie sicher, dass Sie die Zahlung in AdMob und Appodeal einrichten, da sonst die Anzeige einfach nicht geladen wird. Aufgrund der Tatsache, dass ich keine Konten eingerichtet habe, habe ich den ganzen Tag verschwendet, und dann sagten sie mir zur Unterstützung: "Habe ich Konten eingerichtet?" Und nachdem ich das getan hatte, erschien 2 Stunden später eine Anzeige.

Fazit

Da dieser Artikel für Programmieranfänger gedacht ist, möchte ich eine offensichtliche Sache beachten. Wenn Sie wirklich gerne programmieren und bereit sind, Tonnen von Stunden damit zu verbringen, ein bestimmtes Problem zu lösen, liegt das Programmieren bei Ihnen, ansonsten nicht. Gehen Sie auch nicht darüber hinaus. Da die Lösung auch zu lang ist, ist etwas nicht zu kompliziertes und nicht zu einfaches nicht gut. Dies ist jedoch eine offensichtliche Tatsache. Tatsächlich habe ich diesen Satz irgendwo im Internet gelesen. In der Tat ist es wahr. Wenn Sie darüber nachdenken, dann wäre ernsthaftes Programmieren, wenn Programmieren, so einfach wäre, dann wäre ein kleiner Teil der Leute aus der Gesamtzahl aller Leute nicht damit beschäftigt.

Ich hoffe, mein Artikel hat sich für jemanden als nützlich erwiesen und jemandem wirklich geholfen. Es hat mir geholfen, Zeit zu sparen, weil ich persönlich eine so einfache Sache auf der Tastatur getötet habe. Es schien 3 Tage zu dauern, und ich habe 2 Tage gebraucht, um eine normale Lösung zu suchen und zu finden des Tages.

Source: https://habr.com/ru/post/de426223/


All Articles