//onBackPressed
ArrayList<OnBackPressedListener> mBackPressedListeners;
public void addOnBackPressedListener(OnBackPressedListener listener) {
mBackPressedListeners.add(listener);
}
public void removeOnBackPressedListener(OnBackPressedListener listener) {
mBackPressedListeners.remove(listener);
}
//onHomeUpPressed
public void setOnHomeUpPressed(final OnBackPressedListener listener) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
listener.onBackPressed();
}
});
}
public void resetHomeBtn() {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
}
//
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
boolean doSuperAction = true;
for (OnBackPressedListener listener : mBackPressedListeners)
{
if (!listener.onBackPressed()) {
doSuperAction = false;
}
}
if (doSuperAction) {
super.onBackPressed();
}
}
}
@Override
public boolean onBackPressed() {
closeMultiselect();
return false;
}
void openSelect(boolean selectAll) {
...
MainActivity activ = (MainActivity) this.getActivity();
activ.setOnHomeUpPressed(this);
activ.addOnBackPressedListener(this);
}
void closeMultiselect() {
....
MainActivity activ = (MainActivity) this.getActivity();
activ.resetHomeBtn();
activ.removeOnBackPressedListener(this);
}
1. Правильный: Соблюдать принцип единственной ответственности.
Соответственно, можете вызывать его не в контроллере, а в методе модели afterValidate (он будет вызываться перед сохранением модели и после прохождения всех валидаций).
Другой вариант - использовать готовые решения.
можно вообще всё в один поток сделать. Я делал.