Développement Android et résolution des problèmes de développement

Objet de l'article


Cet article abordera les problèmes de développement Android et de développement en général. Nous savons tous que développer un programme est un travail très difficile, qui prend beaucoup de temps et d'efforts, et parfois il faut beaucoup de temps pour trouver une solution à un problème, car certaines solutions d'Internet ne fonctionnent pas toujours.

Cet article abordera les problèmes suivants:

  • Clavier personnalisé pour Android
  • Multithreading
  • Intégration de la publicité dans le programme

Clavier personnalisé pour Android


Dans mon programme, dans ma calculatrice, j'ai dû créer mon propre clavier, car il est extrêmement gênant d'entrer des formules mathématiques à partir du clavier du système. En essayant de résoudre ce problème, j'ai escaladé un tas de forums, essayé plusieurs solutions différentes, mais toutes n'ont pas donné le résultat souhaité.

Commençons:
  1. Créez un nouveau projet dans le studio Android.
  2. Créons quelques classes
  3. Test de l'application

Faisons un simple clavier de 9 caractères avec la possibilité de supprimer ces caractères.
Appelons notre projet KeyBoardTest



Choisissez une activité vide et commencez



Terminé, nous avons créé notre nouveau projet. Maintenant, nous allons traiter le plus élémentaire, à savoir créer un fichier de mise en page dans le dossier - res / layout et l'appeler clavier, ici nous aurons l'apparence du clavier.

Dessinons ce clavier:

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

Une fois notre clavier dessiné, nous pouvons créer une classe qui enregistrera toutes nos frappes et écrit ce dont nous avons besoin. Veuillez noter que chaque textview a un identifiant - c'est très important!

Appelez cette classe KeyBoardListener.

Nous écrivons le constructeur de notre classe, il prend View comme argument - le champ dans lequel nous travaillons, en d'autres termes, l'emplacement de notre editText, et il prend également editText lui-même, dans lequel nous imprimerons des caractères à partir de notre clavier.

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

Considérez maintenant ce code en détail. Nous avons passé editText et visualisé au constructeur lui-même afin de prendre les boutons et de leur affecter une entrée. Il convient de noter que la méthode du bouton Supprimer utilise du «sucre syntaxique», en d'autres termes, il s'agit d'une entrée de code abrégée. Tout le monde ne connaît pas cette conception, j'ai donc décidé que nous devions y prêter attention. Cela peut être particulièrement utile pour les débutants.

Cette conception fonctionne de cette façon

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

Mais nous nous sommes éloignés du sujet. Maintenant, une fois que notre constructeur est prêt et que nous pouvons répondre aux clics sur les boutons, nous pouvons utiliser notre classe. Nous devons d'abord appeler cette classe dans notre activité principale

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

Il convient de prêter attention à cette ligne.

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

Dans cette ligne, nous désactivons le clavier système, mais en même temps, laissons le curseur pour pouvoir nous déplacer entre les caractères et insérer des chiffres / lettres, etc. C'est précisément pourquoi nous avons utilisé la classe StringBuilder et la méthode d' insertion dans le code ci-dessus.
Étant donné que toute cette méthode est appelée en tant que classe distincte, nous pouvons l'ajouter n'importe où et l'utiliser dans n'importe quel programme. Ainsi, l'objectivité du code est obtenue.

Mais je ne vous ai pas montré comment faire cela en code xml, comment nous dire l'emplacement de ce clavier, et tout est très simple

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

Maintenant, avec des manipulations faciles, nous pouvons utiliser nos claviers n'importe où, même en fragments.

Dans notre application, le clavier ressemble à ceci



Multithreading


Multithreading - le nom implique qu'il existe de nombreux threads. Un grand nombre de threads - cela signifie effectuer plusieurs opérations en même temps. Le multithreading est un sujet assez problématique en programmation. Quoi en C ++, quoi en Java, quels autres langages avec multithreading ont toujours eu des problèmes. Heureusement, presque toutes les langues ont une solution de haut niveau à ce problème. Mais nous développons actuellement pour Android, nous allons donc parler d'Anroid, et plus spécifiquement du langage de programmation Java.

Dans Java YP, il existe une chose telle que Thread - c'est pratique pour dessiner, avec un redessin instantané fréquent de l'image, il y a beaucoup d'articles sur ce sujet, y compris sur Habré, donc je ne considérerai pas cette option. Je m'intéresse au soi-disant «flux endormi», un flux qui attend son appel pour résoudre une tâche particulière. C'est le cas lorsque vous avez appelé un thread, il a fonctionné et s'est endormi, sans gaspiller les ressources de l'appareil en attendant une nouvelle tâche.

Et le nom de ce que j'ai décrit ci-dessus est une classe du package standard java.util.concurrent ExecutorServise

L'essence de cette classe est qu'elle peut réutiliser le même thread sans en créer un nouveau. Et maintenant, nous allons examiner comment cela fonctionne, nous ne créerons pas un nouveau programme, mais nous continuerons à travailler dans le nôtre.

Pour ce faire, créez une nouvelle classe, qui s'appellera ExecutorThread. Nous posons le problème que nous devons ajouter un au chiffre p jusqu'à ce que ce p soit égal au nombre que nous avons introduit en 4 degrés. Tout est fait pour que le calcul soit plus long. Et pour que toute l'interface ne se fige pas, nous allons tout mettre dans un thread séparé.

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

Comme nous pouvons le voir, à ce moment-là, alors que nous n’avons pas encore compté, nous voyons l’entrée «Veuillez patienter. Nous calculons! », Ce qui est clair -« Veuillez patienter. Nous comptons! " Et après avoir compté, nous afficherons le texte dans notre textView, que nous avons transmis au constructeur de notre classe. Pour que tout fonctionne, nous devons ajouter un textView après notre editText à notre activity_main, que nous avions lors de la création du projet.

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

Et nous devons également ajouter le code ci-dessous à notre classe principale - 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(); } } }); 

Il convient de noter que la méthode addTextChangeListener est responsable de la modification du texte dans notre editText. Comme nous le voyons, à l'intérieur de la méthode, nous appelons la fonction doWork (), qui à son tour exécute ces lignes

 executorService.submit(thread); 


J'ai vérifié tout ce qui précède sur mon téléphone, donc si vous avez tout fait correctement, vous ne devriez pas avoir de problèmes ou d'erreurs.

Comme nous pouvons le voir, cette méthode est assez pratique et facile à comprendre, j'ai essayé de décrire tout aussi simple que possible, donc j'espère que tout est clair pour vous, mais je n'ai rien manqué.

Et maintenant, passons au point 3 de notre article, à savoir l'intégration de la publicité.

Intégration d'annonces


En fait, je ne peux pas en parler beaucoup, je ne peux que conseiller. Avec la publicité, tout n'est pas si simple et transparent. Personnellement, je vous conseille d'utiliser Appodeal, il est sur le marché il n'y a pas si longtemps, mais il fonctionne assez bien.

Il convient également de noter qu'il existe un très bon support en russe, qui répond presque toujours à votre question ou à votre problème immédiatement. Cela montre immédiatement à quel point ce réseau est fidèle.

Je veux dire tout de suite, si vous l'utilisez soudainement, assurez-vous de configurer le paiement dans AdMob et Appodeal, sinon l'annonce ne se chargera tout simplement pas. Étant donné que je n'ai pas ouvert de compte, j'ai perdu toute la journée, puis ils m'ont dit à l'appui: "Ai-je créé des comptes?" Et après avoir fait cela, une annonce est apparue 2 heures plus tard.

Conclusion

Étant donné que cet article est destiné aux programmeurs débutants, je tiens à noter une chose évidente. Si vous aimez vraiment la programmation et que vous êtes prêt à passer des tonnes d'heures à résoudre un problème particulier, alors la programmation vous appartient, sinon non. N'allez pas plus loin. La solution étant également trop longue, quelque chose de pas trop compliqué et pas trop simple n'est pas bon. Mais c'est un fait évident. En fait, j'ai lu cette phrase quelque part sur Internet. En fait, c'est vrai. Si vous y réfléchissez, alors vraiment, si la programmation, une programmation sérieuse serait si facile, alors une petite partie des personnes du nombre total de toutes les personnes ne serait pas occupée par cela.

J'espère que mon article s'est avéré utile à quelqu'un et a vraiment aidé quelqu'un, cela m'a aidé à gagner du temps, car j'ai personnellement tué une chose si simple sur le clavier, cela semblait 3 jours, et il m'a fallu 2 jours pour rechercher et trouver une solution normale du jour.

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


All Articles