Передача аргумента из обычного класса в действие

Я хотел бы вызвать метод в действии и передать ему аргумент из обычного класса без активности в android. Насколько я понимаю, я не могу просто использовать следующий код, плюс он не работает:

int mySound = 0;
SoundsActivity soundsActivity = new SoundsActivity();
soundsActivity.playSound(mySound);

Этот код находится в обычном классе MyAdapter.

Activity - владелец LifeCycle. Это в основном означает, что в любой момент это может быть paused, stopped или даже destroyed, поэтому не рекомендуется хранить его экземпляры и вызывать на них методы. Судя по вашему коду, я считаю, что вам нужно изучить Intent. Расскажите, пожалуйста, о том, что вы пытаетесь с этим сделать.

Sakchham 26.09.2018 17:57

У меня есть этот класс MyAdapter. Этот класс отвечает за сбор данных, которые используются для создания макета сетки из нескольких «кубиков», каждый из которых имеет свой текст и звук. У меня есть метод в этом классе, который получает определенный идентификатор, который мне нужно передать моей Soundsactivity, чтобы воспроизвести соответствующий звук в действии. Итак, я пытаюсь вызвать метод, который находится в SoundActivity, и передать ему int (ID).

ethans96 27.09.2018 10:20
0
2
32
1

Ответы 1

Есть несколько способов сделать это. Я не могу быть конкретным, так как вы действительно не показали никакого кода.

Однако вы не можете делать то, что пытаетесь сделать. Действия не могут быть созданы таким образом (как и все, что расширяет Context), и они не будут делать то, что вы хотите.

  1. Используйте трансляцию.

    Для этого потребуется, чтобы у вас был объект 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);
    
  2. Воспользуйтесь обратным вызовом.

    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);
    
  3. Передайте SoundsActivity напрямую.

    Это не самый чистый и не рекомендуемый способ, но он будет работать. В вашем адаптере:

    private SoundsActivity activity;
    
    public MyAdapter(SoundsActivity activity) {
        this.activity = activity;
    }
    

    И из SoundsActivity:

    MyAdapter adapter = new MyAdapter(this);
    

    Тогда просто позвоните в activity.playSound(0);, где вам нужно.

Я использовал вариант номер 2, и он сработал. Огромное спасибо!!

ethans96 27.09.2018 17:51

Другие вопросы по теме