我一直在开发一个android应用程序,在其中我想利用一些以前编写的Java代码,这些代码完全编写为可以自己使用自己的main方法运行。
当我从MainActivity.java的onCreate方法调用main方法时,它仍然可以正常运行。但是,我不希望与控制台连接,而是要main()方法与EditText,Button和android的视图进行交互。 MainActivity和Java代码在单独的类中。
我想要的基本上是停止执行程序,直到我在EditText中输入条目,然后在按下按钮然后取入我在EditText中输入的字符串时恢复执行。就像在BufferdReader中,当我们调用reader.readLine()方法时,执行会一直停止,直到按enter键,然后接受在按enter键之前输入的所有内容。
对promptString()
进行三个函数调用:
case TdApi.AuthorizationStateWaitPhoneNumber.CONSTRUCTOR: {
String phoneNumber = promptString("Please enter phone number: ");
client.send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler());
break;
}
case TdApi.AuthorizationStateWaitCode.CONSTRUCTOR: {
String code = promptString("Please enter authentication code: ");
client.send(new TdApi.CheckAuthenticationCode(code, "", ""), new AuthorizationRequestHandler());
break;
}
case TdApi.AuthorizationStateWaitPassword.CONSTRUCTOR: {
String password = promptString("Please enter password: ");
client.send(new TdApi.CheckAuthenticationPassword(password), new AuthorizationRequestHandler());
break;
}
每个调用都返回一个字符串,然后将其发送给API调用。如果使用缓冲读取器,则代码将停止执行,直到有人输入字符串并按Enter,然后输入正确的值(根据用户),然后由promptString()
返回,然后发送给API调用。
我想在android中复制此缓冲的读取器类型的功能,当调用promptString()
时,程序将等到用户输入编辑文本并按下按钮后promptString()
返回字符串然后继续执行。
现在发生的事情是执行继续进行,而没有给用户输入编辑文本的机会,因此错误(空字符串)值被发送到API调用,从而导致错误。
promptString()
代码,负责获取输入并返回输入的字符串(未修改):
private static String promptString(String prompt) {
System.out.print(prompt);
currentPrompt = prompt;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = "";
try {
str = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
currentPrompt = null;
return str;
}
我知道我的要求非常传统和愚蠢,但是我需要这样做,因为我面临一些截止日期,而且我没有时间完全理解API调用。
如果您不清楚该问题,请评论您要详细说明的部分。
我愿意接受不完全属于我的解决方案,但会完成我所寻找的工作,并帮助我让程序等到用户在编辑文本中输入字符串为止。
我正在使用the telegram api的java example。
请帮助。
答案 0 :(得分:0)
Android是事件驱动的,您可以将promptString
的行为替换为以下内容:当然,promptString
必须具有Android上下文,在Activity中具有抵抗力或可以访问Activity上下文
private void promptString(String prompt, callback) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(prompt);
// Set up the input
final EditText input = new EditText(this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
builder.setView(input);
// Set up the buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
callback.setValue(input.getText().toString());
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
您可以按原样使用Java代码,但是您必须修改一些代码并调出Android请求输入,同时移交一个回调处理程序,当输入完成后,该回调处理程序将回调/发送回输入使用价值。
看一下Java代码中的onAuthorizationStateUpdated()
方法,每个switch情况都必须调用此方法并提供与此相同的回调。
因此,每个切换用例都有其自己的回调,也可以使用相同的回调,您可以通过AlertDialog
的响应再次切换用例,当然,您需要为此使用一些标识符,也许更容易使用其他回调处理程序
case TdApi.AuthorizationStateWaitPhoneNumber.CONSTRUCTOR: {
String phoneNumber = yourAndroidContextActivity.promptString
("Please enter phone number: ", callback);
break;
}
代码:
client.send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler());
必须进入回调,您希望它能对您有所帮助