Java 当初始加载片段时,将数据从活动传递给片段

Java 当初始加载片段时,将数据从活动传递给片段,java,android,android-fragments,Java,Android,Android Fragments,所以我的问题是,我的MainActivity最初加载了一个片段,我们称之为MyFragment 我正在从在线加载JSON,并希望将其传递到我的MyFragment中 在MainActivity中调用setContentView时会出现问题,它在MyFragment中调用onCreateView,其中包含getArguments.getSerializable(“myTag”)。密钥没有传递,因为我还没有加载JSON 你能帮我解决这个问题吗 这是我的密码: 在我的MyFragment中: @Ove

所以我的问题是,我的MainActivity最初加载了一个片段,我们称之为MyFragment

我正在从在线加载JSON,并希望将其传递到我的MyFragment中

在MainActivity中调用setContentView时会出现问题,它在MyFragment中调用onCreateView,其中包含getArguments.getSerializable(“myTag”)。密钥没有传递,因为我还没有加载JSON

你能帮我解决这个问题吗

这是我的密码:

在我的MyFragment中:

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

基本上,我的问题是我想在开始加载片段之前完全加载MainActivity。我不知道该怎么做

编辑2:

我修复了我的代码中的问题:(更改了变量名)

MainActivity.java

public TagsFragment passInfoToTagsFramgent(){
    Bundle bundle = new Bundle();
    bundle.putSerializable("tags", tagsList);
    TagsFragment frag = new TagsFragment();
    frag.setArguments(bundle);
    return frag;
}
在MainActivity.java的OnPostExecute中:

Fragment tagFragment = passInfoToTagsFramgent();
                FragmentTransaction transaction  = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.fragment_container, tagFragment);
                transaction.commit();

loadJSON来自在线源代码,所以我假设它是一个异步任务

我通常用lamda表达式(kotlin)来表示:

loadJSON应采用lamda表达式作为参数:

loadJSON(private val callback:()->Unit )
class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}
在AsyncTask::onPostExecute中,您应该调用回调:

callback.invoke()
或者只是

callback()
然后确保在加载JSON并将其传递给片段时打开片段

好的,让我试着用Java实现它

在加载JSON的AsyncTask中,您需要一个接口,例如

public interface JSONLoadCallback {
    void loaded();
}
its构造函数以接口为参数:

loadJSON(private val callback:()->Unit )
class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}
并应将其自身传递给AsyncTask:

JSONLoader(this).executeOnExecutor();
这样,当JSON加载完成时,将触发loaded()函数


你看,Java代码是非常口头的,Kotlin几乎消除了Java接口的必要性。

当加载所有json数据时,你应该在asynctask的post-execute方法中调用你的passTagsToFragment()方法

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }

根据我的理解,您也可以在片段上调用Loadjson()方法并相应地使用数据,但如果您有一些特定的逻辑,您可以使用asynctask,在带有进度条的json检索上,您可以设置任何MyFragment回调并相应地更新您的片段。

在onActivityCreated()中调用它 method@SavaDimitrijević遇到了相同的错误。您可以调用API从片段中的服务器获取JSON,也可以使用阻止进度对话框,直到从服务器检索到JSON,然后使用数据加载片段。谢谢,但是,我不理解您的代码。我正在运行AyncTask,你能帮我把它翻译成Java吗?同样的错误。在XML中,我添加了一个片段视图。因此,当我第一次启动应用程序时,它会在MainActivity.java之前加载Fragment.java。也许这有助于澄清问题。你能分享activity_main.xml及其java类的代码吗
 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }