#java #android #android-intent #android-activity
#java #Android #android-намерение #android-активность
Вопрос:
У меня есть действие «Результаты», которое выполняет некоторые вычисления, и кнопка для отправки пользователем электронного письма, содержащего эти результаты. Для этого я создал класс с именем «Sender», но startActivity не работает в моем классе Sender. Я знаю, что фактическое намерение работает, потому что я мог бы заставить его работать внутри моего действия с результатами, просто не в классе Sender.
public class Results extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button sendEmail = (Button) findViewById(R.id.resultsEMAIL);
sendEmail.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Sender sender = new Sender();
sender.sendEmail();
}
});
///////
public class Sender{
public void sendEmail(){
Intent sendEmail = new
Intent(Intent.ACTION_SEND_MULTIPLE);
ArrayList<Uri>uris = new ArrayList<Uri>();
uri.add(someUri);
uri.add(otherUri);
sendEmail.setType("message/rfc822");
sendEmail.putExtra(Intent.EXTRA_EMAIL, allEmails);
sendEmail.putExtra(Intent.EXTRA_SUBJECT, "Subject");
sendEmail.putExtra(Intent.EXTRA_TEXT, results);
sendEmail.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
try {
startActivity(Intent.createChooser(sendEmail, "Send")); }
catch
(android.content.ActivityNotFoundException ex)
{ Toast.makeText(context, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); }
}
Я попытался передать контекст из результатов
Results.context.startActivity(Intent.createChooser(SendEmail,"Send"));
И я также пытался
sendEmail.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Независимо от того, что я делаю, я получаю исключение
android.util.Исключение AndroidRuntimeException: для вызова startActivity() из-за пределов контекста действия требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?
Должен ли я просто отказаться от попыток сделать это в отдельном классе?? Я хотел создать класс Sender для очистки результатов.
Комментарии:
1. Небольшая часть этого кода будет скомпилирована. Например,
Sender
не имеетstartActivity()
метода,StartActivity()
в Android SDK нет метода (с большой буквыS
) и т.д. Я предлагаю вам опубликовать фактический код, который вы успешно скомпилировали и запустили, и опубликовать полную трассировку стека Java, связанную с любыми сбоями в этом коде.2. У @CommonsWare — Sender есть startActivity() . Это в try{}. Но вы правы насчет заглавной буквы S. Это была опечатка.
Ответ №1:
Вам необходимо передать контекст действия в метод sendMail().
public class Results extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button sendEmail = (Button) findViewById(R.id.resultsEMAIL);
sendEmail.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Sender sender = new Sender();
sender.sendEmail(Results.this);
}
});
И в вашем методе sendMail() используйте context для запуска activity.
public void sendEmail(Context context){
Intent sendEmail = new Intent(Intent.ACTION_SEND_MULTIPLE);
//set data to intent
context.startActivity(Intent.createChooser(sendEmail, "Send"));
}
Комментарии:
1. Сработало отлично. Очень признателен!