Я создаю приложение для Android. В этом фрагменте я пытаюсь вызвать метод verifyKey, который открывает диалоговое окно для ввода ключа, чтобы можно было подтвердить его правильность и разрешить отправку сообщения.
К сожалению, программа не возвращается и не запускается с того места, где был вызван метод verifyKey. После закрытия диалогового окна я не могу найти, где находится программа в коде, поскольку Log.d("After verifyInvalid key", "!!!!!!!!!!!!!!!!!"); не запущен. Я попытался вернуть логическое значение из onClick в verifyKey, но это не позволяет ему из внутреннего класса. Я также получаю E/ViewRootImpl: sendUserActionEvent() mView == null.
Есть ли простой способ вернуть это диалоговое окно или как обеспечить возврат кода при запуске из того места, где было вызвано диалоговое окно.
this.testContact = new Contacts("testCon", "08xxxxxxx", "testkey", true);
// assign on click listener to button
send_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//to send a message first an encryption key must be established
if (testContact.getKeySet()) {
verifyKey();
if (keyChecker(verifyEnteredKey)) {
Log.d("Valid key", "!!!!!!!!!!!!!!!!!");
sendSms(testContact);
} else {
Toast.makeText(getBaseContext(), "Invalid Key",
Toast.LENGTH_LONG).show();
}
Log.d("After verifyInvalid key", "!!!!!!!!!!!!!!!!!");
Log.d("OUTSDIDE KEY CEHCK", "outside");
}
}//on click
});
public boolean keyChecker(String entKey) {
if (entKey.equals(testContact.getKey())) {
Log.d("Valid key", "key confirmed");
return true;
}
Log.d("inValid key", "key un-confirmed");
return false;
}
public void verifyKey() {
verifyEnteredKey = "";
Builder builder = new Builder(SendMessage.this);
builder.setTitle("Cloaked Key");
// I'm using fragment here so I'm using getView() to provide ViewGroup
// but you can provide here any other instance of ViewGroup from your Fragment / Activity
View viewInflated = LayoutInflater.from(SendMessage.this).inflate(R.layout.key_entry_dialog, (ViewGroup) findViewById(android.R.id.content), false);
// Set up the input
final EditText input = viewInflated.findViewById(R.id.input);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
builder.setView(viewInflated);
// Set up the buttons
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
verifyEnteredKey = input.getText().toString();
Log.d("ENTERED KEYY in dialog", verifyEnteredKey);
// if (verifyEnteredKey.equals(testContact.getKey())){
// return true;
// }
// keyChecker(verifyEnteredKey);
Log.d("Before dialog dismiss", verifyEnteredKey);
dialog.dismiss();
Log.d("afteer dialog dismiss", verifyEnteredKey);
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
Log.d("Before builder show", verifyEnteredKey);
builder.show();
Log.d("After builder show", verifyEnteredKey);
}
Спасибо, что сработали, вызвав keyChecker(verifyEnteredKey); из диалога, а затем sendSms (testContact); из метода keyChecker. Моя единственная проблема заключается в том, что я хотел бы повторно использовать этот метод (чтобы ввести ключ для отправки и ввести ключ для просмотра сообщения), и этот способ не позволяет мне это сделать.
Для повторного использования кода вы должны следовать шаблонам проектирования. Или вы можете просто начать с создания класса Utility с универсальным объектом. Покопавшись в этом, вы получите концепцию. Удачи.
Отлично, спасибо, очень помогли.




переместите этот блок кода в onDismissListenerhttps://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html
if (keyChecker(verifyEnteredKey)) {
Log.d("Valid key", "!!!!!!!!!!!!!!!!!");
sendSms(testContact);
} else {
Toast.makeText(getBaseContext(), "Invalid Key",
Toast.LENGTH_LONG).show();
}
по сути, вы пытаетесь прочитать verifyEnteredKey до того, как значение будет присвоено в обратном вызове
Вы не можете вернуться из метода внутри анонимного класса. В этом случае вы должны либо взять поток дальше от метода внутреннего класса. Вы можете вызвать метод из внутреннего класса или использовать обратный вызов. См. Как определить обратные вызовы.