Я хотел бы вызвать метод в действии и передать ему аргумент из обычного класса без активности в android. Насколько я понимаю, я не могу просто использовать следующий код, плюс он не работает:
int mySound = 0;
SoundsActivity soundsActivity = new SoundsActivity();
soundsActivity.playSound(mySound);
Этот код находится в обычном классе MyAdapter.
У меня есть этот класс MyAdapter. Этот класс отвечает за сбор данных, которые используются для создания макета сетки из нескольких «кубиков», каждый из которых имеет свой текст и звук. У меня есть метод в этом классе, который получает определенный идентификатор, который мне нужно передать моей Soundsactivity, чтобы воспроизвести соответствующий звук в действии. Итак, я пытаюсь вызвать метод, который находится в SoundActivity, и передать ему int (ID).
Есть несколько способов сделать это. Я не могу быть конкретным, так как вы действительно не показали никакого кода.
Однако вы не можете делать то, что пытаетесь сделать. Действия не могут быть созданы таким образом (как и все, что расширяет Context), и они не будут делать то, что вы хотите.
Используйте трансляцию.
Для этого потребуется, чтобы у вас был объект Context, переданный в ваш адаптер, что вы можете сделать, просто изменив конструктор и добавив глобальную переменную:
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
Затем вы можете использовать этот контекст для отправки локальной трансляции с вашим собственным действием:
Intent intent = new Intent("my_custom_action");
intent.putExtra("sound_type", 0);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
И получите это действие в своей деятельности, чтобы вызвать свой метод: См. "Получатели, зарегистрированные в контексте"
Когда вы создаете адаптер, передайте ему объект Context. Если вы строите из Activity (надеюсь, SoundsActivity), используйте this:
MyAdapter adapter = new MyAdapter(this);
Воспользуйтесь обратным вызовом.
Delcare интерфейс где-нибудь:
public interface AdapterCallback {
void onRequestPlaySound(int type);
}
Реализуйте этот интерфейс в своей деятельности:
public class SoundsActivity extends Activity implements AdapterCallback {
//...
@Override
public void onRequestPlaySound(int type) {
playSound(type);
}
//...
}
Добавьте интерфейс в качестве параметра в конструктор вашего адаптера:
private AdapterCallback callback;
public MyAdapter(AdapterCallback callback) {
this.callback = callback;
}
А потом используйте callback.onRequestPlaySound(0); откуда угодно.
Когда вы создаете адаптер, передайте в него свой экземпляр SoundsActivity. Это будет работать, только если вы создаете адаптер из SoundsActivity:
MyAdapter adapter = new MyAdapter(this);
Передайте SoundsActivity напрямую.
Это не самый чистый и не рекомендуемый способ, но он будет работать. В вашем адаптере:
private SoundsActivity activity;
public MyAdapter(SoundsActivity activity) {
this.activity = activity;
}
И из SoundsActivity:
MyAdapter adapter = new MyAdapter(this);
Тогда просто позвоните в activity.playSound(0);, где вам нужно.
Я использовал вариант номер 2, и он сработал. Огромное спасибо!!
Activity - владелец LifeCycle. Это в основном означает, что в любой момент это может быть
paused,stoppedили дажеdestroyed, поэтому не рекомендуется хранить его экземпляры и вызывать на них методы. Судя по вашему коду, я считаю, что вам нужно изучитьIntent. Расскажите, пожалуйста, о том, что вы пытаетесь с этим сделать.