Transmiteți date către fragmentare din activitate, atunci când sunt încărcate inițial cu Fragment

Deci problema mea este în principiu MainActivity meu este inițial încărcat cu un Fragment, pe care o vom numi MyFragment.

Sunt încărcare JSON, de la online și care doresc să treacă în meu MyFragment.

Problema apare atunci când setContentView este apelat în MainActivity, apelând onCreateView în MyFragment, care conține getArguments.getSerializable ("myTag") . Cheia nu este trecută deoarece nu am încărcat încă JSON-ul.

Puteți să mă ajuți să rezolv această problemă?

Aici este codul meu:

În 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 (presupun ca am incarcat deja JSON-ul meu):

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

EDITAȚI | ×:

Practic, problema mea este că vreau să încărc complet MainActivity, înainte de a începe chiar să încarc Fragmentul. Nu sunteți sigur cum să faceți asta.

0
puteți fie să apelați API pentru a prelua JSON de pe serverul din fragment, fie puteți utiliza un dialog de blocare a progresului până când JSON este preluat de pe server și apoi încărcați fragmentul folosind datele.
adăugat autor Alvin Varghese, sursa
puteți fie să apelați API pentru a prelua JSON de pe serverul din fragment, fie puteți utiliza un dialog de blocare a progresului până când JSON este preluat de pe server și apoi încărcați fragmentul folosind datele.
adăugat autor Alvin Varghese, sursa
puteți fie să apelați API pentru a prelua JSON de pe serverul din fragment, fie puteți utiliza un dialog de blocare a progresului până când JSON este preluat de pe server și apoi încărcați fragmentul folosind datele.
adăugat autor Alvin Varghese, sursa
apelați-o în interiorul metodeiActivityCreated ()
adăugat autor Sava Dimitrijević, sursa
@ SavaDimitrijević a primit aceeași eroare
adăugat autor Dave, sursa
@ SavaDimitrijević a primit aceeași eroare
adăugat autor Dave, sursa
@ SavaDimitrijević a primit aceeași eroare
adăugat autor Dave, sursa

6 răspunsuri

loadJSON este din sursa online, asa ca presupun ca este un AsyncTask.

De obicei, fac asta ca o expresie lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON ar trebui să ia o expresie lamda ca parametru:

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

și în AsyncTask :: onPostExecute, trebuie să apelați callback-ul:

callback.invoke()

sau doar

callback()

Apoi ați asigurat că fragmentul este deschis când JSON-ul este încărcat și trimis în fragment.

OK, lasă-mă să încerc să fac asta în Java.

În AsyncTask, care încarcă JSON, veți avea nevoie de o interfață,

public interface JSONLoadCallback {
    void loaded();
}

Și constructorul său ia interfața ca parametru:

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

Activitatea dvs. implementează JSONLoadCallback:

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

Și ar trebui să treacă la AsyncTask:

JSONLoader(this).executeOnExecutor();

În acest fel, funcția încărcată() este declanșată când sarcina JSON este terminată.

Vedeți, codurile Java sunt foarte verbale, Kotlin a eliminat aproape necesitatea interfeței Java.

0
adăugat
Mulțumesc, totuși, nu înțeleg codul. Am rula AyncTask, o poți traduce în Java pentru mine.
adăugat autor Dave, sursa

loadJSON este din sursa online, asa ca presupun ca este un AsyncTask.

De obicei, fac asta ca o expresie lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON ar trebui să ia o expresie lamda ca parametru:

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

și în AsyncTask :: onPostExecute, trebuie să apelați callback-ul:

callback.invoke()

sau doar

callback()

Apoi ați asigurat că fragmentul este deschis când JSON-ul este încărcat și trimis în fragment.

OK, lasă-mă să încerc să fac asta în Java.

În AsyncTask, care încarcă JSON, veți avea nevoie de o interfață,

public interface JSONLoadCallback {
    void loaded();
}

Și constructorul său ia interfața ca parametru:

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

Activitatea dvs. implementează JSONLoadCallback:

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

Și ar trebui să treacă la AsyncTask:

JSONLoader(this).executeOnExecutor();

În acest fel, funcția încărcată() este declanșată când sarcina JSON este terminată.

Vedeți, codurile Java sunt foarte verbale, Kotlin a eliminat aproape necesitatea interfeței Java.

0
adăugat
Mulțumesc, totuși, nu înțeleg codul. Am rula AyncTask, o poți traduce în Java pentru mine.
adăugat autor Dave, sursa

loadJSON este din sursa online, asa ca presupun ca este un AsyncTask.

De obicei, fac asta ca o expresie lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON ar trebui să ia o expresie lamda ca parametru:

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

și în AsyncTask :: onPostExecute, trebuie să apelați callback-ul:

callback.invoke()

sau doar

callback()

Apoi ați asigurat că fragmentul este deschis când JSON-ul este încărcat și trimis în fragment.

OK, lasă-mă să încerc să fac asta în Java.

În AsyncTask, care încarcă JSON, veți avea nevoie de o interfață,

public interface JSONLoadCallback {
    void loaded();
}

Și constructorul său ia interfața ca parametru:

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

Activitatea dvs. implementează JSONLoadCallback:

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

Și ar trebui să treacă la AsyncTask:

JSONLoader(this).executeOnExecutor();

În acest fel, funcția încărcată() este declanșată când sarcina JSON este terminată.

Vedeți, codurile Java sunt foarte verbale, Kotlin a eliminat aproape necesitatea interfeței Java.

0
adăugat
Mulțumesc, totuși, nu înțeleg codul. Am rula AyncTask, o poți traduce în Java pentru mine.
adăugat autor Dave, sursa

Ar trebui să apelați metoda passTagsToFragment() în metoda post executată a asynctask-ului când toate datele json se încarcă.

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
adăugat
v-ați putea partaja codul activity_main.xml și clasa sa de java
adăugat autor Diwakar Singh, sursa
Aceeași eroare. În XML-ul meu, am adăugat o vedere fragmentară. Deci, când pornesc pentru prima dată cererea mea, se încarcă Fragment.java înaintea MainActivity.java. Poate că acest lucru va ajuta la clarificarea lucrurilor.
adăugat autor Dave, sursa

Ar trebui să apelați metoda passTagsToFragment() în metoda post executată a asynctask-ului când toate datele json se încarcă.

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
adăugat
v-ați putea partaja codul activity_main.xml și clasa sa de java
adăugat autor Diwakar Singh, sursa
Aceeași eroare. În XML-ul meu, am adăugat o vedere fragmentară. Deci, când pornesc pentru prima dată cererea mea, se încarcă Fragment.java înaintea MainActivity.java. Poate că acest lucru va ajuta la clarificarea lucrurilor.
adăugat autor Dave, sursa

După cum înțeleg, mai întâi. Puteți să apelați metoda Loadjson() și să utilizați datele în mod corespunzător, dar dacă aveți o anumită logică, puteți utiliza asynctask și pe returul json cu bara de progres puteți seta orice apel MyFragment înapoi și actualiza fragmentul în consecință.

0
adăugat
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md