#java #android #onclick #onclicklistener #android-alertdialog
#java #Android #onclick #onclicklistener #android-alertdialog
Вопрос:
Итак, я делаю приложение, которое я пытаюсь использовать AlertDialog для записи переменной на ПЛК. Я хочу сделать так, чтобы каждый раз, когда вы нажимаете кнопку, значение переменной увеличивается на 1. Это почти работает, кроме того, что выполняется только один раз. Поэтому, когда я нажимаю кнопку ускорения, она увеличивается, но если я нажму ее снова, она больше не увеличивается. Если я затем нажму кнопку уменьшения скорости, это уменьшит значение на 1 (как и предполагалось), но опять же, оно не будет выполняться снова, если я снова нажму кнопку. Я очень новичок в этом типе программирования. Любая помощь будет оценена по достоинству!
public void ShowPopUpMenus(View v) {
final AlertDialog.Builder sayWindows = new AlertDialog.Builder(WritesActivity.this);
sayWindows.setPositiveButton("Speed Up", null);
sayWindows.setNegativeButton("Close", null);
sayWindows.setNeutralButton("speed Down", null);
//sayWindows.setAdapter(listWords, null);
//sayWindows.setView(saySomething);
sayWindows.setTitle(" Machine Speed"); //Title!
final AlertDialog mAlertDialog = sayWindows.create();
mAlertDialog.setMessage(" " sMachineSpeedTemp); //Center Text, Probably not the correct way to do this. :)
mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
//while (bDummy== false) {
Button button_Speed_Up = mAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
button_Speed_Up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
MlpiConnection device = m_app.getDevice();
device.connect("192.168.0.5");
if (device.isConnected()) {
sMachineSpeedTemp = (device.logic().readVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb"));
iMachineSpeedTemp = Integer.parseInt(sMachineSpeedTemp);
iMachineSpeedTemp ;
device.logic().writeVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb", sMachineSpeedTemp);
sMachineSpeedTemp = iMachineSpeedTemp.toString();
mAlertDialog.setMessage("" sMachineSpeedTemp);
}
else
{
mAlertDialog.setMessage("bad connection");
}
}
catch (Exception e) {
Context c = v.getContext();
Toast.makeText(c, e "Connection Error UP", Toast.LENGTH_LONG).show();
}
}
});
Button button_Speed_Down = mAlertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
button_Speed_Down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
MlpiConnection device = m_app.getDevice();
device.connect("192.168.0.5");
if (device.isConnected()) {
sMachineSpeedTemp = (device.logic().readVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb"));
iMachineSpeedTemp = Integer.parseInt(sMachineSpeedTemp);
iMachineSpeedTemp--;
device.logic().writeVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb", sMachineSpeedTemp);
sMachineSpeedTemp = iMachineSpeedTemp.toString();
mAlertDialog.setMessage(sMachineSpeedTemp);
mAlertDialog.setMessage("" sMachineSpeedTemp);
}
else
{
mAlertDialog.setMessage("bad connection");
}
} catch (Exception e) {
Context c = v.getContext();
Toast.makeText(c, e "Connection Error Down", Toast.LENGTH_LONG).show();
}
}
});
}
});
mAlertDialog.show();
}
Ответ №1:
Я думаю, что вы выполняете приведенный ниже код каждый раз, когда нажимаете на кнопку. Эта строка iMachineSpeedTemp = Integer.parseInt(sMachineSpeedTemp);
переопределит значение iMachineSpeedTemp
и увеличит его один раз, чтобы вы продолжали получать одно и то же значение.`
if (device.isConnected()) {
sMachineSpeedTemp = device.logic().readVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb"));
iMachineSpeedTemp = Integer.parseInt(sMachineSpeedTemp);
iMachineSpeedTemp ;
device.logic().writeVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb", sMachineSpeedTemp);
sMachineSpeedTemp = iMachineSpeedTemp.toString();
mAlertDialog.setMessage("" sMachineSpeedTemp);
}
Возможным решением является логический флаг
public class MyClass{
private int iMachineSpeedTemp;
private boolean isConnected = false;
}
Затем вы можете проверить isConnected
, верно ли это
if (device.isConnected()) {
if(isConnected){
iMachineSpeedTemp
}else{
sMachineSpeedTemp = device.logic().readVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb"));
iMachineSpeedTemp = Integer.parseInt(sMachineSpeedTemp);
iMachineSpeedTemp ;
isConnected = true;
}
device.logic().writeVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb", sMachineSpeedTemp);
sMachineSpeedTemp = iMachineSpeedTemp.toString();
mAlertDialog.setMessage("" sMachineSpeedTemp);
}
Комментарии:
1. ОК. Одна из проблем заключается в том, что значение не будет равно 0. Значение считывается с другого устройства, и оно может быть любым. Поэтому мне нужно будет прочитать значение при первом запуске действия, а затем увеличить это значение, которое может быть любым. По крайней мере, это мой текущий план атаки, может быть наоборот, idk…
Ответ №2:
public void onClick(View v) {
try {
MlpiConnection device = m_app.getDevice();
device.connect("192.168.0.5");
if (device.isConnected()) {
sMachineSpeedTemp = device.logic().readVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb");
iMachineSpeedTemp = Integer.parseInt(sMachineSpeedTemp);
iMachineSpeedTemp ;
sMachineSpeedTemp = Integer.toString(iMachineSpeedTemp);
device.logic().writeVariableBySymbolAsString("Application.UserVarGlobal.sMachineSpeed_gb", sMachineSpeedTemp);
mAlertDialog.setMessage(" " sMachineSpeedTemp);
}
}
Комментарии:
1. Это исправило это. Единственное отличие, которое я вижу, если — sMachineSpeedTemp = Integer.toString(iMachineSpeedTemp); против sMachineSpeedTemp = iMachineSpeedTemp.toString(); В любом случае, это работает. Пока… Спасибо за помощь Nolly J