Как обновить текущее меню, чтобы включить или отключить элементы, когда AsyncTask сделан.
В моем случае использования мне нужно было отключить мое меню, пока мой AsyncTask загружал данные, затем после загрузки всехданные, мне нужно было снова включить все меню, чтобы позволить пользователю использовать его.
Это не позволило приложению позволить пользователям нажимать на пункты меню во время загрузки данных.
Во-первых,Я объявляю переменную состояния, если переменная равна 0, отображается меню, если эта переменная равна 1, меню скрыто.
private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.
Затем в моем onCreateOptionsMenu()
я проверяю эту переменную, если она равна 1Я отключаю все свои предметы, если нет, я просто показываю их все
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);
if(mMenuState==1){
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(false);
}
}else{
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(true);
}
}
return super.onCreateOptionsMenu(menu);
}
Теперь, когда моя активность начнется, onCreateOptionsMenu()
будет вызван только один раз, и все мои вещи исчезнут, потому что я настроилсостояние для них в начале.
Затем я создаю AsyncTask, где я устанавливаю эту переменную состояния в 0 в моем onPostExecute()
Этот шаг очень важен!
Когда вы звоните invalidateOptionsMenu();
, это будетunch onCreateOptionsMenu();
Итак, после установки моего состояния в 0, я просто перерисовываю все меню, но на этот раз с моей переменной на 0, что говорит о том, что все меню будет отображаться после того, как весь асинхронный процессГотово, и затем мой пользователь может использовать меню.
public class LoadMyGroups extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration.
}
@Override
protected Void doInBackground(Void... voids) {
//Background work
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu
}
}
Результаты