Objetivo do artigo
Este artigo discutirá os problemas de desenvolvimento e desenvolvimento do Android em geral. Todos sabemos que desenvolver um programa é muito trabalhoso, exige muito tempo e esforço e, às vezes, leva muito tempo para encontrar uma solução para um problema, porque algumas soluções da Internet nem sempre funcionam.
Este artigo abordará os seguintes problemas:
- Teclado personalizado para Android
- Multithreading
- Integração de publicidade no programa
Teclado personalizado para Android
No meu programa, na minha calculadora, tive que criar meu próprio teclado, porque inserir fórmulas matemáticas no teclado do sistema é extremamente desconfortável. Tentando resolver esse problema, subi em vários fóruns, tentei várias soluções diferentes, mas todas não deram o resultado desejado.
Vamos começar:- Crie um novo projeto no android studio.
- Vamos criar algumas classes
- Testando o aplicativo
Vamos criar um teclado simples de 9 caracteres com a capacidade de excluir esses caracteres.
Vamos nomear nosso projeto como KeyBoardTest

Escolha uma atividade vazia e comece

Feito, criamos nosso novo projeto. Agora vamos tratar do mais básico, a saber, criar um arquivo de layout na pasta - res / layout e chamá-lo de teclado, aqui teremos a aparência do teclado.
Vamos desenhar este teclado:
<?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>
Depois que o teclado é desenhado, podemos criar uma classe que registra todas as nossas teclas e escreve o que precisamos. Observe que cada visualização de texto tem um ID - isso é muito importante!
Chame essa classe KeyBoardListener.
Escrevemos o construtor de nossa classe, leva View como argumento - o campo em que estamos trabalhando, em outras palavras, a localização do nosso editText, e também o próprio editText, no qual imprimiremos caracteres do teclado.
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); } }
Agora considere esse código em detalhes. Passamos editText e visualizamos o próprio construtor para pegar os botões e atribuir entrada. Deve-se notar que o método do botão excluir usa "açúcar sintático", ou seja, é uma entrada de código abreviada. Nem todo mundo conhece esse design, então decidi que deveríamos prestar atenção nele. Isso pode ser especialmente útil para iniciantes.
Esse design funciona dessa maneira
int p = () ? 1 : 2; int p = k == 2 ? 7 : 3;
Mas nos afastamos do tópico. Agora, depois que nosso construtor estiver pronto, e podemos responder aos cliques no botão, podemos usar nossa classe. Primeiro precisamos chamar essa classe em nossa atividade principal
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);
Vale a pena prestar atenção a esta linha.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Nesta linha, desligamos o teclado do sistema, mas, ao mesmo tempo, deixamos o cursor para que possamos mover entre caracteres e inserir números / letras, etc. É precisamente por isso que usamos a classe
StringBuilder e o método
insert no código acima.
Devido ao fato de todo esse método ser chamado como uma classe separada, podemos adicioná-lo em qualquer lugar e usá-lo em qualquer programa. Assim, a objetividade do código é obtida.
Mas não mostrei como fazer isso no código xml, como nos dizer a localização deste teclado e tudo é muito simples
<?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>
Agora, com manipulações fáceis, podemos usar nossos teclados em qualquer lugar, mesmo em fragmentos.
Em nossa aplicação, o teclado se parece com isso

Multithreading
Multithreading - o nome indica que há muitos threads. Muitos threads - isso significa executar várias operações ao mesmo tempo. Multithreading é um tópico bastante problemático na programação. O que em C ++, o que em Java, que outras linguagens com multithreading sempre tiveram problemas. Felizmente, quase todos os idiomas têm uma solução de alto nível para esse problema. Mas atualmente estamos desenvolvendo para Android, então falaremos sobre o Anroid e, mais especificamente, sobre a linguagem de programação Java.
No Java YP, existe algo como Thread - é conveniente desenhar, com redesenhos instantâneos freqüentes da imagem; existem muitos artigos sobre esse assunto, inclusive sobre Habré, por isso não considerarei essa opção. Estou interessado no chamado "fluxo adormecido", um fluxo que aguarda sua chamada para resolver uma tarefa específica. Este é o caso quando você chamou um thread, ele funcionou e adormeceu, sem desperdiçar recursos do dispositivo enquanto aguardava uma nova tarefa.
E o nome do que descrevi acima é uma classe do pacote padrão java.util.concurrent
ExecutorServiseA essência desta classe é que ela pode reutilizar o mesmo encadeamento sem criar um novo. E agora vamos considerar como funciona, não criaremos um novo programa, mas continuaremos trabalhando no nosso.
Para fazer isso, crie uma nova classe, que será chamada de ExecutorThread. Colocamos o problema de que precisamos adicionar um ao dígito
p até que esse
p seja igual ao número que introduzimos em 4 graus. Tudo é feito para que o cálculo seja mais longo. E para que toda a interface não congele, colocaremos tudo em um thread separado.
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!"); } }
Como podemos ver, naquele momento, enquanto ainda não contamos, vemos a entrada "Aguarde. Estamos ligando! ”, O que está claro -“ Aguarde. Nós contamos! E depois que contamos, produziremos o texto em nosso textView, que passamos ao construtor de nossa classe. Para que tudo funcione, precisamos adicionar um textView após nosso editText ao nosso activity_main, que tínhamos ao criar o projeto.
<TextView android:gravity="center" android:textColor="@color/colorPrimary" android:textSize="25sp" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="50dp"/>
E também precisamos adicionar o código abaixo à nossa classe principal - 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(); } } });
Vale ressaltar que o método addTextChangeListener é responsável por alterar o texto em nosso editText. Como vemos, dentro do método, chamamos a função doWork (), que por sua vez executa essas linhas
executorService.submit(thread);
Verifiquei todas as opções acima no meu telefone; portanto, se você fez tudo certo, não deve ter problemas ou erros.
Como podemos ver, esse método é bastante conveniente e fácil de entender, tentei descrever tudo da maneira mais simples possível, por isso espero que tudo esteja claro para você, mas não perdi nada.
E agora, vamos ao ponto 3 do nosso artigo, a integração da publicidade.
Integração de anúncios
Na verdade, não posso falar muito sobre isso, só posso aconselhar. Com a publicidade, nem tudo é tão fácil e transparente. Pessoalmente, eu aconselho você a usar o Appodeal, ele está no mercado há não muito tempo, mas funciona com bastante sucesso.
Também é importante notar que existe um suporte muito bom ao idioma russo, que quase sempre responde à sua pergunta ou ao seu problema imediatamente. Isso imediatamente deixa claro o quão leal é essa rede.
Quero dizer imediatamente que, se você usá-lo de repente, configure o pagamento na AdMob e no Appodeal, caso contrário, o anúncio simplesmente não será carregado. Devido ao fato de eu não ter criado contas, perdi o dia inteiro e eles me disseram: "Eu configurei contas?" E depois que fiz isso, um anúncio apareceu 2 horas depois.
Conclusão
Como este artigo é destinado a programadores iniciantes, quero observar uma coisa óbvia. Se você realmente gosta de programação e está pronto para gastar muitas horas resolvendo um problema específico, a programação é sua, caso contrário não. Além disso, não vá além. Como a solução também é muito longa, algo não muito complicado e não muito simples não é bom. Mas este é um fato óbvio. De fato, li essa frase em algum lugar da Internet. De fato, é verdade. Se você pensar bem, então realmente, se programar, programação séria seria tão fácil, então uma pequena parte do número total de pessoas não estaria ocupada com isso.
Espero que meu artigo tenha sido útil para alguém e realmente tenha ajudado alguém, isso me ajudou a economizar tempo, porque eu pessoalmente matei um teclado em um teclado, pareceria uma coisa tão simples, 3 dias, e levei 2 para obter os tópicos e procurar uma solução normal do dia.