Фрагменты моего приложения, построенные по структуре 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();
}