Подождите, пока фрагмент не будет добавлен в пользовательский интерфейс.

В моем приложении я дошел до точки, где в ландшафтном режиме мне нужно прикрепить два фрагмента. Для этого второй фрагмент должен ждать, пока первый фрагмент не будет прикреплен (добавлен) до его добавления. Причиной этого является то, что первый фрагмент должен выполнить функцию, необходимую второму фрагменту. Мне удалось сделать это через поток, но в этом случае он только ждет указанного количества времени, прежде чем присоединить второй фрагмент, и в случае, если первый фрагмент не будет прикреплен в указанное время, приложение будет раздавлено, потому что второе Фрагмент не имеет необходимых данных.

Любые лучшие практики (примеры), а затем код ниже (например, до тех пор, пока не будет прикреплен первый фрагмент, и нет на определенный промежуток времени)? :

getSupportFragmentManager() .beginTransaction() .replace(R.id.mainContent, fragment).commit(); Thread thread = new Thread() { @Override public void run() { try { synchronized (this) { wait(1000); } } catch (InterruptedException e) { } if (isLandscape) { openSecondFragment(mIndex, R.id.rightConent); } } }; thread.start(); 

Очень признателен.

Обработчик должен быть выполнен в первом фрагменте:

 @SuppressLint("HandlerLeak") protected void loadAccountList() { LoadAccountList loadAccountListThread = new LoadAccountList(new Handler() { @SuppressWarnings("unchecked") public void handleMessage(Message msg) { switch (msg.what) { case LOAD_SUCCESSFUL_CODE: items = (ArrayList<Account>) msg.obj; break; case LOAD_FAILED_IOEXCEPTION_CODE: getActivity().showDialog(ERROR_DIALOG); break; default: break; } } }); loadAccountListThread.start(); 

Жизненный цикл фрагментов работает в вашу пользу. Согласно документации, метод onStart () называется «Вызывается, когда фрагмент видим пользователю», поэтому я предлагаю вам сделать что-то подобное в первом классе фрагментов:

 public void onStart() { super.onStart(); ((MainActivity)getActivity()).loadSecondFragment(); } 

И в вашей деятельности:

 public void loadSecondFragment() { if (isLandscape) { openSecondFragment(mIndex, R.id.rightConent); } } 

И вуаля! Попробуйте любой из методов жизненного цикла и посмотрите, какой из них лучше всего подходит для вашей цели.

OnCreateView вызывается при создании фрагмента

 public static class CustomFragment extends SupportMapFragment{ public CustomFragment() {} @Override public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) { return super.onCreateView(arg0, arg1, arg2); } } 

Сначала @SuppressLint("HandlerLeak") является плохим. Если вы не будете осторожны с утечками, вы будете заполнены.

Мое решение (это личное предпочтение)

Мне нравится использовать Отто, чтобы передавать сообщения, все еще имея свободную связь. Он позволяет вам настроить EventBus, для которого разные классы могут просто регистрироваться и получать нужные события. В этом случае вы можете создать вспомогательный класс, который загружает данные и запускает событие, когда он получил данные (или ошибку). Затем вы поймаете это во втором фрагменте и заполните свой список. (В то же время вы можете показать неопределенный прогрессбар или что-то еще)

Таким образом, вам не нужно ждать, пока данные будут получены до загрузки вашего фрагмента.

Документацию можно найти здесь: https://github.com/square/otto

Intereting Posts