Passar dados para fragmento de atividade, quando inicialmente carregado com fragmento

Então, meu problema é basicamente meu MainActivity é inicialmente carregado com um fragmento, que vamos chamar MyFragment.

Estou carregando JSON, on-line e querendo passar para o MyFragment.

O problema está surgindo quando setContentView é chamado na MainActivity, ele está chamando onCreateView em MyFragment, que contém getArguments.getSerializable ("myTag") . A chave não foi aprovada porque ainda não carreguei o JSON.

Você pode me ajudar a resolver esse problema?

Aqui está o meu código:

No meu 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 (suponha que já carreguei meu 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);
}

EDITAR:

Basicamente, o meu problema é que eu quero carregar o MainActivity totalmente, antes mesmo de começar a carregar o fragmento. Não tenho certeza de como fazer isso.

0
você pode chamar a API para buscar JSON do servidor no fragmento ou usar um diálogo de progresso de bloqueio até que JSON seja recuperado do servidor e, em seguida, carregar o fragmento usando os dados.
adicionado o autor Alvin Varghese, fonte
você pode chamar a API para buscar JSON do servidor no fragmento ou usar um diálogo de progresso de bloqueio até que JSON seja recuperado do servidor e, em seguida, carregar o fragmento usando os dados.
adicionado o autor Alvin Varghese, fonte
você pode chamar a API para buscar JSON do servidor no fragmento ou usar um diálogo de progresso de bloqueio até que JSON seja recuperado do servidor e, em seguida, carregar o fragmento usando os dados.
adicionado o autor Alvin Varghese, fonte
chame-o dentro do método onActivityCreated ()
adicionado o autor Sava Dimitrijević, fonte
@ SavaDimitrijević tem o mesmo erro
adicionado o autor Dave, fonte
@ SavaDimitrijević tem o mesmo erro
adicionado o autor Dave, fonte
@ SavaDimitrijević tem o mesmo erro
adicionado o autor Dave, fonte

6 Respostas

loadJSON é de fonte online, então eu suponho que é um AsyncTask.

Eu costumo fazer isso como uma expressão lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON deve ter uma expressão lamda como parâmetro:

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

e no AsyncTask :: onPostExecute, você deve chamar o retorno de chamada:

callback.invoke()

ou apenas

callback()

Então você se certificou de que o fragmento é aberto quando o JSON é carregado e passado para o fragmento.

OK, deixe-me tentar fazê-lo em Java.

Na sua AsyncTask que carrega o JSON, você precisará de uma interface, por exemplo,

public interface JSONLoadCallback {
    void loaded();
}

E o seu construtor toma a interface como parâmetro:

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

E sua atividade implementa JSONLoadCallback:

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

E deve se passar para o AsyncTask:

JSONLoader(this).executeOnExecutor();

Dessa forma, a função loaded() é acionada quando o carregamento do JSON é concluído.

Você vê, códigos Java são muito verbais, Kotlin quase removeu a necessidade da interface Java.

0
adicionado
Obrigado, no entanto, não entende o seu código. Eu estou executando o AyncTask, você pode traduzi-lo para Java para mim.
adicionado o autor Dave, fonte

loadJSON é de fonte online, então eu suponho que é um AsyncTask.

Eu costumo fazer isso como uma expressão lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON deve ter uma expressão lamda como parâmetro:

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

e no AsyncTask :: onPostExecute, você deve chamar o retorno de chamada:

callback.invoke()

ou apenas

callback()

Então você se certificou de que o fragmento é aberto quando o JSON é carregado e passado para o fragmento.

OK, deixe-me tentar fazê-lo em Java.

Na sua AsyncTask que carrega o JSON, você precisará de uma interface, por exemplo,

public interface JSONLoadCallback {
    void loaded();
}

E o seu construtor toma a interface como parâmetro:

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

E sua atividade implementa JSONLoadCallback:

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

E deve se passar para o AsyncTask:

JSONLoader(this).executeOnExecutor();

Dessa forma, a função loaded() é acionada quando o carregamento do JSON é concluído.

Você vê, códigos Java são muito verbais, Kotlin quase removeu a necessidade da interface Java.

0
adicionado
Obrigado, no entanto, não entende o seu código. Eu estou executando o AyncTask, você pode traduzi-lo para Java para mim.
adicionado o autor Dave, fonte

loadJSON é de fonte online, então eu suponho que é um AsyncTask.

Eu costumo fazer isso como uma expressão lamda (kotlin):

loadJSON({passTagsToFragment()})

loadJSON deve ter uma expressão lamda como parâmetro:

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

e no AsyncTask :: onPostExecute, você deve chamar o retorno de chamada:

callback.invoke()

ou apenas

callback()

Então você se certificou de que o fragmento é aberto quando o JSON é carregado e passado para o fragmento.

OK, deixe-me tentar fazê-lo em Java.

Na sua AsyncTask que carrega o JSON, você precisará de uma interface, por exemplo,

public interface JSONLoadCallback {
    void loaded();
}

E o seu construtor toma a interface como parâmetro:

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

E sua atividade implementa JSONLoadCallback:

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

E deve se passar para o AsyncTask:

JSONLoader(this).executeOnExecutor();

Dessa forma, a função loaded() é acionada quando o carregamento do JSON é concluído.

Você vê, códigos Java são muito verbais, Kotlin quase removeu a necessidade da interface Java.

0
adicionado
Obrigado, no entanto, não entende o seu código. Eu estou executando o AyncTask, você pode traduzi-lo para Java para mim.
adicionado o autor Dave, fonte

Você deve chamar seu método passTagsToFragment() no método post execute do seu asynctask quando todos os dados do json forem carregados.

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
adicionado
você poderia compartilhar o código de activity_main.xml e sua classe java?
adicionado o autor Diwakar Singh, fonte
Mesmo erro. No meu XML, adicionei uma exibição de fragmento. Então, quando eu inicio o meu aplicativo pela primeira vez, ele carrega o Fragment.java antes do MainActivity.java. Talvez isso ajude a esclarecer as coisas.
adicionado o autor Dave, fonte

Você deve chamar seu método passTagsToFragment() no método post execute do seu asynctask quando todos os dados do json forem carregados.

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
adicionado
você poderia compartilhar o código de activity_main.xml e sua classe java?
adicionado o autor Diwakar Singh, fonte
Mesmo erro. No meu XML, adicionei uma exibição de fragmento. Então, quando eu inicio o meu aplicativo pela primeira vez, ele carrega o Fragment.java antes do MainActivity.java. Talvez isso ajude a esclarecer as coisas.
adicionado o autor Dave, fonte

Conforme meu entendimento, primeiro. Você também pode chamar o método Loadjson() no fragmento e usar os dados de acordo, mas se tiver alguma lógica específica, você pode usar asynctask e na recuperação do json com a barra de progresso você pode definir qualquer chamada MyFragment e atualizar seu fragmento de acordo.

0
adicionado