Как включить / отключить кнопку основной активности из фрагмента mvp или ведущего? - PullRequest
0 голосов
/ 13 июля 2020

Фрагменты моего приложения, построенные по структуре mvp (кроме основного действия) с использованием Dagger и Rx Java.

Кнопка Target помещена в основное действие. Когда я нажимаю на нее, ведущий выполняет некоторые асинхронные c вычисления, а когда очередь пуста, необходимо включить целевую кнопку.

Пытаюсь сделать это через интерфейс обратного вызова, но получаю nullPointerException из-за buttonListener is null . См. Пояснения в комментариях внутри кода фрагментов.

Буду признателен за любые мысли, как исправить этот или любые другие варианты, чтобы заставить эту работу работать.

public class ListFragment extends CustomFragment implements ListContract.Fragment {

    protected static HashMap<String, CustomTextView> viewList = new HashMap<>();

    @BindViews({R.id.arraylist_view_add_first,
            R.id.view_add_mid,
            R.id.view_add_last,
            R.id.view_search,
    })
    List<CustomTextView> butterViewList;

    private Unbinder unbinder;

    private ListContract.Presenter presenter;

    protected ButtonListener buttonListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, container, false);
        unbinder = ButterKnife.bind(this, view);

        presenter = App.getComponent().getListPresenter();

      //here getContext() is not null
        buttonListener = (ButtonListener) getContext();

        return view;
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void calculate(int input) {
        presenter.calculate(input);
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
        viewList.clear();
    }


    public void setButtonEnabled() {

        //right here context lost, so getting nullPointer
        
        buttonListener = (ButtonListener) getContext();
        buttonListener.setButtonEnabled();
    }

}

Presenter

public class ListPresenter implements ListContract.Presenter {

    private ListContract.Fragment fragment;
    private ListContract.Repository repository;

    @Inject
    public ListPresenter() {
        this.repository = App.getComponent().getListRepository();
        this.fragment = App.getComponent().getListFragment();
    }

    @Override
    public void calculate(int inputNumber) {
        isProcessActive = true;
        fragment.showAllProgressBars();

        PublishSubject<BaseUnit> subject = repository.exec(inputNumber);

        subject.observeOn(AndroidSchedulers.mainThread())
                .subscribe(unit -> {
                    fragment.setCellText(unit.getViewId(), unit.getTimeString());
                    if (subject.hasComplete()) {
                        Log.d("COMPLETE", "hasComplete");
                        fragment.setButtonEnabled();
                    }
                }, Throwable::printStackTrace);
    }

}

Активность

public class MainActivity extends AppCompatActivity implements ButtonListener {

    private CustomFragment listFragment = new ListFragment(),
            mapFragment = new MapFragment();

    private final SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
    @BindView(R.id.view_pager)
    ViewPager viewPager;
    @BindView(R.id.tabs)
    TabLayout tabs;

    @BindView(R.id.editText)
    EditText editText;
    @BindView(R.id.submitBtn)
    Button submitBtn;

    CustomFragment currentFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        sectionsPagerAdapter.addFragment(listFragment, getBaseContext().getResources().getString(R.string.tab_lists));
        sectionsPagerAdapter.addFragment(mapFragment, getBaseContext().getResources().getString(R.string.tab_maps));

        viewPager.setAdapter(sectionsPagerAdapter);
        tabs.setupWithViewPager(viewPager);
    }


    @OnClick(R.id.submitBtn)
    void onClick(View v) {

        if (!editText.getText().toString().matches("")) {
            v.setEnabled(false);
            int inputNumber = Integer.parseInt(editText.getText().toString());

            int currentItem = viewPager.getCurrentItem();
            currentFragment = (CustomFragment) sectionsPagerAdapter.instantiateItem(viewPager, currentItem);
            currentFragment.calculate(inputNumber);
        } else {
            showToast();
        }

    }

    @Override
    public void setButtonEnabled() {
        submitBtn.setEnabled(true);
    }

Интерфейс

public interface ButtonListener {
    void setButtonEnabled();
}
...