PickerMetod, ще один варіант розширення для App Inventor [безкоштовно].
При створенні мобільного додатку в App Inventor , додаток який повинен передавати дані у МК, та співпрацювати з цим мікроконтролером.
Потрібні різні методи , з допомогою яких це можна зробити зручніше.
Взагалі App Inventorв своєму розпорядженні має багато засобів якими можливо вирішити будь яки завдання, методи цих рішень можуть бути як складними, так и надзвичайно простими.
Тому ось мій варіант кількох розширень, здається мені, що вони повинні бути доволі зручні, це начебто для праці з arduino не вистачає саме таких розширень яки зроблені мною на свій розсуд.
Представляю до вашої уваги кілька таких методів розширень, яких немає в стандартному компоненті сповіщення для App Inventor.
Сподіваюся, це вам сподобається та заощадить ваш час!
📦 Назва пакета: sxem.org.pickermetod; та sxem.org.metodnotifier;
🕘Версія: MetodNotifier.java.txt
📅 Дата виходу: 24 березня 2023
👍Велика подяка:
@ТІМАІ2, за його розширення ⚠️AltNotifier(чудова підтримка!!),
@Gordon_Lu, за його розширення ⚠️ DaffyDialog[безкоштовне та з відкритим кодом] вони надихнули мене, на створення цих блоків.
Розширення .aix зібрано: за допомогою Rush Extension Builder, від @Shreyash
📖 Блоки подій, опис:
1) “InfoChoiceDialog”
цей компонент дуже схожий на стандартний компонент “ShowChooseDialog” , він також показує діалогове вікно запитань, які встановлені моб. додатком, і дозволяє позитивні варіанти відповідей або скасування від користувача (відмінність від “ShowChooseDialog”, нам всі три кнопки користувач може зробити свій напис, а також блок має свій флаг “identify“.) .
Викликаються відповідні події від трьох кнопок "Left”,"Right","Cancel"
Подія після вибору кнопки "Left”,"Right", яка повертає флаг-“identify“ та текст кнопки, в блок “InfoChoiceInput”.
Якщо вибір "Cancel", флаг-“identify“ відповіді повертається, в блок “InfoChoiceCanceled”.
2) “DoubleWindowDialog”
Показує подвійне діалогове вікно, де користувач може ввести свої текстові назви.
Відповідності: identify = число(int), message = текст, title = текст, hintUp = текст, hintDown = текст, textUp = текст, textDown = текст, cancelable = boolean
Після запуску та відображення діалогового вікна, коли текстове поле отримає фокус, одразу виникне програмна клавіатура.
Подія після вибору кнопки "ОК”, відповідь повертає число “identify“ та текст “textUp ,textDown ” , в блок “DoubleWindowInput”.
Якщо вибір "Cancel", флаг-“identify“ відповіді повертається, в блок “DoubleWindowCanceled”.
3) “TxtDigitShowDialog”
Діалогове вікно для праці з цифрами та текстом. У цього діалогового вікна, на введення цифр та тексту цікаві розмаїття .
Параметр “identify“- це ідентифікатор для визначення сповіщувача, коли ви хочете показати два діалогові вікна з однаковим розширенням. Параметр “title” призначений для визначення заголовка цього діалогового вікна. “textDefault“- текст за замовчуванням для введення, який користувач спочатку побачить у текстовому полі, коли відкриває діалогове вікно, а підказка підказка цього текстового поля, це“hintText” .
Відповідності: identify = число(int), message = текст, title = текст, textDefault = текст, hintText = текст, hintColor = колір, inputColor = колір, buttonText = текст, cancelButtonText = текст, cancelable = boolean , logic = число(int)
“logic” = 0 Немає типу вмісту. Текст не редагується
"logic” = 1 звичайн. текст.
"logic” = 2 тільки цифри.
"logic" = 3 номер телефону.
"logic” = 4 дата/час.
"logic” = 12 Числове поле пароля
"logic" = 21 адреси електронної пошти.
"logic” = 24 введення часу.
"logic" = 81 текстове поле пароля.
Подія після вибору кнопки "buttonText”, відповідь повертає число “identify“ та текст “hintText-response” , в блок “TxtDigitShowInput”.
Якщо вибір "Cancel",“identify“ відповіді повертається, в блок “TxtDigitShowCanceled”.
4) “NumberPickerDual”
Подвійне діалогове вікно вибору чисел, яке дає змогу користувачеві вибрати числа з попередньо визначеним діапазоном.
Відповідності: identify = число(int), message = текст, title = текст, buttonText = текст, defaultValue0 = число(int), minValue0 = число(int), maxValue0 = число(int),
defaultValue1 = число(int), minValue1 = число(int), maxValue1 = число(int), logic = число(int)
"logic"<=1 перше та друге число без форматування
"logic">=2 перше число - без форматування, друге число - додаємо незначущі нулі після коми, до двох зн.(0.00) та (0.000)3х значного числа.
Подія після вибору кнопки "buttonText”, відповідь повертає числа “identify“ та “number0,number1” , в блок “DualPickerInput”.
До “finalData” поверне текстове значення, у вигляді “0.00” чи “0.000”
Якщо вибір "Cancel",“identify“ відповіді повертається, в блок “DualPickerCanceled”.
5) “NumberPickerTimer”
Відображення одного діалог вікна для встановлення часу таймера, наприклад: щоб таймером щось увімкнути та вимкнути в призначений час, відповідно кінцевий вигляд значення може бути такий “12:55 23:01” . Всі дії робляться в одному вікні, це зручно.
Відповідності: identify = число(int), message = текст, title = текст, buttonText = текст, defaultValue0 = число(int), defaultValue1 = число(int), defaultValue2 = число(int), defaultValue3 = число(int)
Подія після вибору кнопки "buttonText”, відповідь повертає “identify“ та числа “number0,number1,number2,number3” , в блок “TimerPickerInput”.
До “finalData” поверне текстове значення, у вигляді “12:55 23:01”
Якщо вибір "Cancel",відповідь “identify“ повертається, в блок “TimerPickerCanceled”.
6) “NumPickTherm”
Трохи специфічний, але також цікавий варіант. Відображає діалогове вікно для введення значень термостату.
Чому специфічний? тому що кожен може працювати з даними температури як йому заманеться.
Мені до вподоби коли температура цифр у вигляді, 1000 це 0°c , 1253 це +25.3, 847 це -15.3°c, якщо Ви сприймаєте таку математику температури, то цей блок вам також сподобається.
Відповідності: identify = число(int), message = текст, title = текст, buttonText = текст, horizon = boolean, maxUpw = число(int), minDown = число(int), defaultThermo = число(int)
"defaultThermo” = встановимо початкове значення , треба щоб були в форматі "1253" чи "747"
"maxUpw” верхня температура . Встановлювати до плюс температури "123" з "1" попереду (позитивна°)
"minDown” нижня температура. Якщо треба порог негативной температури , пишемо просто число "23" ("1" не додаємо°)
"horizon” = TRUE - HORIZONTAL (замовчування) “horizon” = FALSE- VERTICAL
Подія після вибору кнопки "buttonText”, відповідь повертає в блок “NumPickThermInput”,
“identify“ та інші значення:
"numberSign” = знак "-" чи "+" в форматі 0 чи 1
"number0” = число не оброблено 253
"formatNumber” = в форматі числа 1000+253=1253 чи 1000-253=747
"finalData” = в форматі тексту "+25.3°c"
Якщо вибір "Cancel",відповідь “identify“ повертається, в блок “NumPickThermCanceled”.
7) “NumPickerTime3byt”
Відображає потрійне діалогове вікно для встановлення часу таймера, щоб щось увімкнути та вимкнути в призначений час, зі значенням часу “number2”, відповідно кінцевий вигляд значення може бути такий “09:12 985” . Всі дії робляться в одному вікні.
Відповідності: identify = число(int), message = текст, title = текст, buttonText = текст, defaultValue0 = число(int), defaultValue1 = число(int), minValue2 = число(int), maxValue2 = число(int), defaultValue2 = число(int)
Подія після вибору кнопки "buttonText”, відповідь повертає “identify“ та числа “number0,number1,number2” , в блок “NumPickerTime3bytInput”.
До “finalData” поверне текстове значення, наприклад у вигляді “12:55 4321”
Якщо вибір "Cancel",відповідь “identify“ повертається, в блок “NumPickerTime3bytCanceled”.
8) “SelectPicker”
Відображає діалогове вікно вибору номерів та текста, дає змогу користувачеві вибрати число чи текст з попередньо визначеного діапазону.
Тут також є кілька варіантів .
Відповідності: identify = число(int), arrayString = список-текст, logic = число, message = текст, title = текст, buttonText = текст, defaultValue = число(int), minValue = число(int), maxValue = число(int), sizeStep = число(int)
"logic”=0 вибір чисел з можливістю ""sizeStep"-коефіцієнта"
"logic”=1 додаємо незначущій нуль до двозначних чисел.
"logic”=2 формат значень на екран з десятками, плюс текстові "arrayString”(перші 3 байт), +0.5°С чи 0:0 (0.9)
"logic”=3 формат значень на екран з сотнями, плюс текстові "arrayString”(перші 3 байт), вага 0.05кг чи 0:00 (0.09)
"logic”=4 на екран виводимо текстові "arrayString”, наприклад "Неділя , Понеділок, Вівторок, Середа ,Четвер ,П'ятниця ,Субота" (розмежування тексту - кома).
"logic”=5формат на екран в .НЕХ форматі, плюс текстовий "arrayString”(перший байт), 0хFF чи FF (255)
"logic”>5 звичайний Picker та звичайний вибір чисел , порог "minValue" активне ,
зверніть увагу "minValue" буде вимкнути автоматично, якщо if(logic<=4) minValue=0;
Подія після вибору кнопки "buttonText”, відповідь в блок “SelectPickerInput” повертає числа “identify“ та "number0”.
До “finalData” поверне текстове значення, наприклад:
"logic”=0 “3” враховано ""sizeStep"-коефіцієнт"
"logic”=1 “03”.
"logic”=2 +0.5°С чи 0:0 (0.9)
"logic”=3 вага 0.05кг чи 0:00 (0.09)
"logic”=4"П'ятниця"
"logic”=5 0хFF
"logic”>5 “3” враховується "minValue" низ можливого значення
Якщо вибір "Cancel",число “identify“ відповіді повертається, в блок “SelectPickerCanceled”.
Скрин блоков в проекті “test_MetodNotifier”
Файли
AIX: PickerMetod.aix (24КБ)
AIX: MetodNotifier.aix(30КБ)
AIA: test_MetodNotifier.aia (147КБ)
APK:test_MetodNotifier.apk (3,09МБ)
/** * Credits: @BBL https://youtu.be/w9iJS580CMg * Additions: @Oto, 24-03-2023(Ukraine) package sxem.org.metodnotifier; import android.app.Activity; @SimpleFunction(description = "Показує діалогове вікно запитань, яке встановлює користувач, і дозволяє " AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setPositiveButton(buttonTextLeft, new DialogInterface.OnClickListener() { @SimpleFunction(description = "Показує подвійне діалогове вікно, де користувач може ввести назву" public void DoubleWindowDialog(final int identify, String message, String title, String hintUp, String hintDown, String textUp, String textDown, boolean cancelable) { AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle(title); final EditText inputLogin = new EditText(activity); final EditText inputPass = new EditText(activity); alert.setView(layout); if (cancelable) { /** ######################################################################### AlertDialog.Builder alert = new AlertDialog.Builder(this.context); alert.setView(numberPicker); /** ################################################################ AlertDialog.Builder alert = new AlertDialog.Builder(this.context); alert.setPositiveButton(buttonText, new DialogInterface.OnClickListener() { }
* Optional upgrade, to extend the notifier, with a little variety to change the variables.
* notifier in App Inventor, but based upon the original code.
* Credits: @HalAbelson - MIT who wrote the original notifier code
* Credits: @Shreyash for the Rush extension builder
* Credits: @TIMAI2 available source was the basis of the upgrade
* Credits: @Gordon_Lu available source
*/
import android.app.AlertDialog;
import com.google.appinventor.components.runtime.EventDispatcher;
import com.google.appinventor.components.annotations.SimpleEvent;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.view.View;
import android.content.DialogInterface;
import android.view.inputmethod.InputMethodManager;
import android.content.Context;
import android.widget.NumberPicker;
import android.graphics.Typeface;
public class MetodNotifier extends AndroidNonvisibleComponent {
private final Context context;
private final Activity activity;
public MetodNotifier(ComponentContainer container){
super(container.$form());
activity = container.$context();
this.context = container.$context();
}
/** ######################################################
*
*/
+ " позитивну відповідь або скасування від користувача. Викликається відповідна подія \n "
+ "від трьох кнопок \"Left\",\"Right\",\"Cancel\" \n ")
public void InfoChoiceDialog(final int identify, String message, String title, String buttonTextLeft, String buttonTextRight, String buttonTextCancel) {
InfoChoiceAlert(identify, message, title, buttonTextLeft, buttonTextRight, buttonTextCancel);
}
private void InfoChoiceAlert(final int identify, String message, String title, String buttonTextLeft, String buttonTextRight, String buttonTextCancel) {
alert.setTitle(title);
alert.setMessage(message);
public void onClick(DialogInterface dialog, int whichButton) {
InfoChoiceInput(identify, buttonTextLeft.toString());
}
});
alert.setNeutralButton( buttonTextRight, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
InfoChoiceInput(identify, buttonTextRight.toString());
}
});
alert.setNegativeButton(buttonTextCancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
InfoChoiceCanceled(identify);
//AfterQuestion("Cancel");
}
});
alert.show();
}
@SimpleEvent(
description = "Event raised after the user has responded to ShowQuestionDialog.")
public void InfoChoiceInput(final int identify, String response) {
EventDispatcher.dispatchEvent(this, "InfoChoiceInput", identify, response);
}
@SimpleEvent(
description = "Подія викликана, коли користувач скасував ПоказатиТекстДіалог.")
public void InfoChoiceCanceled(final int identify) {
EventDispatcher.dispatchEvent(this, "InfoChoiceCanceled", identify);
}
/** ##########################################################################
* LOGIN/PASS ENTRY DIALOG , String hintUp, String hintDown
*/
+ "і деталі назви. Користувач також може скасувати")
DoubleWindowTxt( identify, message, title, hintUp, hintDown, textUp, textDown, cancelable);
}
private void DoubleWindowTxt(final int identify, String message, String title, String hintUp, String hintDown, String textUp, String textDown, boolean cancelable) {
alert.setMessage(message);
alert.setCancelable(false);
LinearLayout layout = new LinearLayout(activity);
layout.setOrientation(LinearLayout.VERTICAL);
inputLogin.setHint(hintUp);
inputLogin.setText(textUp);
layout.addView(inputLogin);
inputPass.setHint(hintDown);
inputPass.setText(textDown);
layout.addView(inputPass);
alert.setPositiveButton("OK!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
HideKeyboard((View) layout);
DoubleWindowInput(identify, inputLogin.getText().toString(), inputPass.getText().toString());
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
DoubleWindowCanceled(identify);
HideKeyboard((View) layout);
}
});
}
alert.show();
// Request focus after showing dialog Запитати фокус після показу діалогу
inputLogin.requestFocus();
// Show soft keyboard Показати програмну клавіатуру
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
@SimpleEvent(description = "Подія, що виникає після того, як користувач відповів на ДубльВікнаТекст.")
public void DoubleWindowInput(final int identify, String textUp, String textDown) {
EventDispatcher.dispatchEvent(this, "DoubleWindowInput", identify, textUp, textDown);
}
@SimpleEvent(description = "Event raised when the user canceled ДубльВікнаТекст.")
public void DoubleWindowCanceled(final int identify) {
EventDispatcher.dispatchEvent(this, "DoubleWindowCanceled", identify);
}
*/
@SimpleFunction(description = "Відображає діалогове вікно вибору номерів, яке дає змогу користувачеві вибрати число з попередньо визначеного діапазону.")
public void NumberPickerDialog(final int identify, String message, String title, String buttonText,
int defaultValue, int minValue, int maxValue, boolean cancelable) {
TextNumberPickerDialog(identify, message, title, buttonText, defaultValue, minValue, maxValue, cancelable);
}
private void TextNumberPickerDialog(final int identify, String message, String title, String buttonText,
int defaultValue, int minValue, int maxValue, boolean cancelable) {
final NumberPicker numberPicker = new NumberPicker(this.context);
numberPicker.setMaxValue(maxValue);
numberPicker.setMinValue(minValue);
numberPicker.setValue(defaultValue);
alert.setCancelable(false);
alert.setTitle(title);
alert.setMessage(message);
alert.setPositiveButton(buttonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
NumberPickerInput(identify, numberPicker.getValue());
}
});
if (cancelable) {
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
NumberPickerCanceled(identify);
}
});
}
alert.show();
}
@SimpleEvent(description = "This event is fired when the user has pressed the OK button in a number picker dialog.")
public void NumberPickerInput(int identify, int number) {
EventDispatcher.dispatchEvent(this, "NumberPickerInput", identify, number);
}
@SimpleEvent(description = "This event is fired when the user has pressed the cancel button in a number picker dialog.")
public void NumberPickerCanceled(int identify) {
EventDispatcher.dispatchEvent(this, "NumberPickerCanceled", identify);
}
*
*/
@SimpleFunction(description = "Відображає діалогове вікно для введення тексту. \n "
+ "logic = 0 Немає типу вмісту. Текст не редагується \n "
+ "logic = 1 звичайн. текст. \n "
+ "logic = 2 тільки цифри. \n "
+ "logic = 3 номер телефону. \n "
+ "logic = 4 дата/час. \n "
+ "logic = 12 Числове поле пароля \n "
+ "logic = 21 адреса електронної пошти. \n "
+ "logic = 24 введення часу. \n "
+ "logic = 81 текстове поле пароля. ")
public void TxtDigitShowDialog(final int identify, String message, String title, String textDefault, String hintText,
int hintColor, int inputColor, String buttonText, String cancelButtonText, boolean cancelable, int logic) {
TextTxtDigitShowDialog( identify, message, title, textDefault, hintText, hintColor, inputColor, buttonText, cancelButtonText, cancelable, logic);
}
private void TextTxtDigitShowDialog(final int identify, String message, String title, String textDefault, String hintText,
int hintColor, int inputColor, String buttonText, String cancelButtonText, boolean cancelable, int logic) {
alert.setTitle(title);
alert.setMessage(message);
alert.setCancelable(false);
final EditText edit = new EditText(this.context);
edit.setText(textDefault);
edit.setHintTextColor(hintColor);
edit.setTextColor(inputColor);
edit.setHint(hintText);
edit.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
edit.setInputType(logic);
alert.setView(edit);
@Override
public void onClick(DialogInterface dialog, int which) {
TxtDigitShowInput(identify, edit.getText().toString());
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
}
});
if (cancelable) {
alert.setNegativeButton(cancelButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
TxtDigitShowCanceled(identify);
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
}
});
}
alert.show();
}
@SimpleEvent(description = "This event is fired when the user has pressed the OK button in a text response dialog.")
public void TxtDigitShowInput(final int identify, String response) {
EventDispatcher.dispatchEvent(this, "TxtDigitShowInput", identify, response);
}
@SimpleEvent(description = "This event is fired when the user has pressed the cancel button in a text response dialog.")
public void TxtDigitShowCanceled(final int identify) {
EventDispatcher.dispatchEvent(this, "TxtDigitShowCanceled", identify);
}
/** ##############################################################
* Приховати програмну клавіатуру після того, як користувач введе текст або скасує введення.
*/
public void HideKeyboard(View view) {
if (view != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}