Передача даних до фрагмента з активності, при первинному завантаженні фрагмента

Тому моя проблема полягає в тому, що моя MainActivity спочатку завантажується фрагментом, який ми назвемо MyFragment.

Я завантажую JSON, з онлайн і хочу перейти в мій MyFragment.

Проблема виникає, коли setContentView викликається в MainActivity, він викликає onCreateView в MyFragment, який містить getArguments.getSerializable ("myTag") . Ключ не передається, оскільки я ще не завантажив JSON.

Чи можете ви допомогти мені вирішити цю проблему?

Ось мій код:

У моєму MyFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        if(getArguments() != null) {
            coll = (HashSet) getArguments().getSerializable("myTag");
        }
   //Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_my, container, false);
}

MainActivity (припустимо, що я вже завантажив JSON):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loadJSON();
    passTagsToFragment(); //passes to the fragment
}

public void passTagsToFragment(){
    Bundle bundle = new Bundle();
    bundle.putSerializable("myTags", tagsSet);
    TagsFragment frag = new MyFragment();
    frag.setArguments(bundle);
}

EDIT:

В основному, моя проблема полягає в тому, що я хочу повністю завантажити MainActivity, перш ніж навіть почати завантажувати фрагмент. Не знаю, як це зробити.

0
Ви можете викликати API, щоб отримати JSON з сервера у фрагменті, або ви можете скористатися діалоговим вікном блокування, поки JSON не буде отримано з сервера, а потім завантажте фрагмент за допомогою даних.
додано Автор Alvin Varghese, джерело
Ви можете викликати API, щоб отримати JSON з сервера у фрагменті, або ви можете скористатися діалоговим вікном блокування, поки JSON не буде отримано з сервера, а потім завантажте фрагмент за допомогою даних.
додано Автор Alvin Varghese, джерело
Ви можете викликати API, щоб отримати JSON з сервера у фрагменті, або ви можете скористатися діалоговим вікном блокування, поки JSON не буде отримано з сервера, а потім завантажте фрагмент за допомогою даних.
додано Автор Alvin Varghese, джерело
назвемо його всередині методу onActivityCreated ()
додано Автор Sava Dimitrijević, джерело
@ SavaDimitrijević отримав ту ж помилку
додано Автор Dave, джерело
@ SavaDimitrijević отримав ту ж помилку
додано Автор Dave, джерело
@ SavaDimitrijević отримав ту ж помилку
додано Автор Dave, джерело

6 Відповіді

loadJSON - це джерело в Інтернеті, тому я припускаю, що це AsyncTask.

Зазвичай я роблю це як вираз lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON має приймати значення lamda як параметр:

loadJSON(private val callback:()->Unit )

і в AsyncTask :: onPostExecute, ви повинні викликати зворотний виклик:

callback.invoke()

або просто

callback()

Потім ви переконалися, що фрагмент відкривається, коли JSON завантажується і передається фрагменту.

ОК дозвольте мені спробувати зробити це на Java.

У вашій AsyncTask, яка завантажує JSON, вам знадобиться інтерфейс, наприклад

public interface JSONLoadCallback {
    void loaded();
}

І його конструктор приймає інтерфейс як параметр:

class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}

А Ваша активність реалізує JSONLoadCallback:

@Override
public void loaded() {
    passTagsToFragment();
}

І повинна передаватися AsyncTask:

JSONLoader(this).executeOnExecutor();

Таким чином, функція loaded() запускається при завершенні завантаження JSON.

Бачите, коди Java дуже словесні, Котлін майже зняв необхідність інтерфейсу Java.

0
додано
Однак ви не розумієте свій код. Я використовую AyncTask, чи можете ви перекласти його на Java.
додано Автор Dave, джерело

loadJSON - це джерело в Інтернеті, тому я припускаю, що це AsyncTask.

Зазвичай я роблю це як вираз lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON має приймати значення lamda як параметр:

loadJSON(private val callback:()->Unit )

і в AsyncTask :: onPostExecute, ви повинні викликати зворотний виклик:

callback.invoke()

або просто

callback()

Потім ви переконалися, що фрагмент відкривається, коли JSON завантажується і передається фрагменту.

ОК дозвольте мені спробувати зробити це на Java.

У вашій AsyncTask, яка завантажує JSON, вам знадобиться інтерфейс, наприклад

public interface JSONLoadCallback {
    void loaded();
}

І його конструктор приймає інтерфейс як параметр:

class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}

А Ваша активність реалізує JSONLoadCallback:

@Override
public void loaded() {
    passTagsToFragment();
}

І повинна передаватися AsyncTask:

JSONLoader(this).executeOnExecutor();

Таким чином, функція loaded() запускається при завершенні завантаження JSON.

Бачите, коди Java дуже словесні, Котлін майже зняв необхідність інтерфейсу Java.

0
додано
Однак ви не розумієте свій код. Я використовую AyncTask, чи можете ви перекласти його на Java.
додано Автор Dave, джерело

loadJSON - це джерело в Інтернеті, тому я припускаю, що це AsyncTask.

Зазвичай я роблю це як вираз lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON має приймати значення lamda як параметр:

loadJSON(private val callback:()->Unit )

і в AsyncTask :: onPostExecute, ви повинні викликати зворотний виклик:

callback.invoke()

або просто

callback()

Потім ви переконалися, що фрагмент відкривається, коли JSON завантажується і передається фрагменту.

ОК дозвольте мені спробувати зробити це на Java.

У вашій AsyncTask, яка завантажує JSON, вам знадобиться інтерфейс, наприклад

public interface JSONLoadCallback {
    void loaded();
}

І його конструктор приймає інтерфейс як параметр:

class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}

А Ваша активність реалізує JSONLoadCallback:

@Override
public void loaded() {
    passTagsToFragment();
}

І повинна передаватися AsyncTask:

JSONLoader(this).executeOnExecutor();

Таким чином, функція loaded() запускається при завершенні завантаження JSON.

Бачите, коди Java дуже словесні, Котлін майже зняв необхідність інтерфейсу Java.

0
додано
Однак ви не розумієте свій код. Я використовую AyncTask, чи можете ви перекласти його на Java.
додано Автор Dave, джерело

Слід зателефонувати до методу passTagsToFragment() у методі post execute вашого asynctask, коли завантажуються всі дані json

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
додано
Не могли б ви поділитися кодом activity_main.xml і його клас Java
додано Автор Diwakar Singh, джерело
Така ж помилка. У своєму xml я додав перегляд фрагментів. Тому, коли я вперше запускаю свою програму, вона завантажує Fragment.java перед MainActivity.java. Можливо, це допоможе очистити ситуацію.
додано Автор Dave, джерело

Слід зателефонувати до методу passTagsToFragment() у методі post execute вашого asynctask, коли завантажуються всі дані json

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
додано
Не могли б ви поділитися кодом activity_main.xml і його клас Java
додано Автор Diwakar Singh, джерело
Така ж помилка. У своєму xml я додав перегляд фрагментів. Тому, коли я вперше запускаю свою програму, вона завантажує Fragment.java перед MainActivity.java. Можливо, це допоможе очистити ситуацію.
додано Автор Dave, джерело

По-перше, на моє розуміння. Ви можете викликати Loadjson() метод на фрагмент, а також використовувати дані відповідно, але якщо у вас є певна логіка, ви можете використовувати asynctask і на json вилучення з прогрес-бар ви можете встановити будь-який виклик MyFragment і оновити фрагмент відповідно.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників

android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.