#java #android
Вопрос:
Поскольку startActivityForResult()
теперь он устарел, вот как я пытаюсь получить результат своего намерения:
public class Stt extends MainActivity { private TextView _dialogText; ActivityResultLauncherlt;Intentgt; activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallbacklt;ActivityResultgt;() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); // do something with data } } }); public Stt(View targetView, Context context) { _dialogText = targetView.findViewById(R.id.dialog_text); ImageView dialogSst = targetView.findViewById(R.id.dialog_sst); dialogSst.setOnClickListener(_view -gt; { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.ACTION_RECOGNIZE_SPEECH, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say something ..."); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); activityResultLauncher.launch(intent); }); } }
Так что, должно быть, что-то не так, activityResultLauncher.launch(intent);
так как я получаю эту ошибку:
java.lang.Исключение NullPointerException: Попытка вызвать виртуальный метод «android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread ()» для ссылки на нулевой объект
Что не так с моим кодом?
Комментарии:
1. Похоже, вы пропускаете большую часть своей деятельности. Где вы настраиваете свой пользовательский интерфейс? Если ответ заключается в том, что где-то вы вызываете
new Stt()
, чтобы создать экземпляр этого класса, это не сработает. Этот код должен использовать реальное действие, с которого начинаетсяstartActivity()
.2. @CommonsWare из MainActivity я показываю диалоговое окно (класс, который расширяется
DialogFragment
), и из этого класса я звонюnew Stt()
. Причина, по которой я создал классStt
, заключается в том, что я буду использовать это намерение в своем диалоговом окне, а также в основной деятельности. Поэтому я не хочу писать один и тот же код дважды.3. «Я буду использовать это намерение в своем диалоге» — я не знаю, практично ли это. Как бы то ни было, ваш нынешний подход не сработает. Возможно, вы могли бы написать
Stt
, чтобы использовать anActivity
в качестве параметра конструктора, и использовать его для всех вещей, для которых вам нужен anActivity
.