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

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

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

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();
</account>
3 ответа

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

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

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

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

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


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

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

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

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

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


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);
 }
}

licensed under cc by-sa 3.0 with attribution.