简体   繁体   English

初始加载Fragment时,将数据从Activity传递到Fragment

[英]Pass Data to Fragment from Activity, when intially loaded with Fragment

So my issue is basically my MainActivity is initially loaded with a Fragment, which we will call MyFragment. 所以我的问题基本上是我的MainActivity最初加载有一个Fragment,我们将其称为MyFragment。

I am loading JSON, from online and wanting to pass into my MyFragment. 我正在从网上加载JSON,并希望传递到MyFragment中。

The problem is arising when setContentView is called in the MainActivity, it is calling onCreateView in MyFragment, which contains getArguments.getSerializable("myTag") . 在MainActivity中调用setContentView时会出现问题,它在MyFragment中调用onCreateView,其中包含getArguments.getSerializable(“ myTag”) The key isn't passed because I haven't loaded the JSON yet. 该密钥未传递,因为我尚未加载JSON。

Can you help me resolve this issue? 您能帮我解决这个问题吗?

Here is my code: 这是我的代码:

In my MyFragment: 在我的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 (assume I loaded my JSON already): 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: 编辑:

Basically, my issue is that I want to load the MainActivity fully, before even starting to load the Fragment. 基本上,我的问题是我想在甚至开始加载Fragment之前完全加载MainActivity。 Not sure how to do that. 不知道该怎么做。

EDIT 2: 编辑2:

I fixed the problem here is my code: (Changed the variable names) 我解决的问题是我的代码:(更改了变量名)

MainActivity.java MainActivity.java

public TagsFragment passInfoToTagsFramgent(){
    Bundle bundle = new Bundle();
    bundle.putSerializable("tags", tagsList);
    TagsFragment frag = new TagsFragment();
    frag.setArguments(bundle);
    return frag;
}

in OnPostExecute of MainActvity.java: 在MainActvity.java的OnPostExecute中:

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

loadJSON is from online source, so I assume it is an AsyncTask. loadJSON来自在线资源,因此我假设它是一个AsyncTask。

I usually do this as a lamda expression (kotlin): 我通常将其作为lamda表达式(kotlin)来执行:

loadJSON({passTagsToFragment()})

loadJSON should take a lamda expression as parameter: loadJSON应该使用lamda表达式作为参数:

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

and in the AsyncTask::onPostExecute, you should call the callback: 在AsyncTask :: onPostExecute中,您应该调用回调:

callback.invoke()

or just 要不就

callback()

Then you made sure the fragment is opened when the JSON is loaded and passed to fragment. 然后,确保在加载JSON并将其传递给片段时打开该片段。

OK let me try to make it in Java. 好,让我尝试用Java制作它。

In your AsyncTask which loads JSON, you will need an interface eg, 在加载JSON的AsyncTask中,您需要一个接口,例如,

public interface JSONLoadCallback {
    void loaded();
}

And the its constructor takes the interface as parameter: 并且其构造函数将接口作为参数:

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

And your Activity implements JSONLoadCallback: 并且您的Activity实现了JSONLoadCallback:

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

And should pass itself to the AsyncTask: 并且应该将自身传递给AsyncTask:

JSONLoader(this).executeOnExecutor();

This way, the loaded() function is fired when JSON load is finished. 这样,当JSON加载完成时,将触发loaded()函数。

You see, Java codes are very verbal, Kotlin almost removed the necessity of Java interface. 您会看到,Java代码非常语言化,Kotlin几乎消除了Java接口的必要性。

You should call your passTagsToFragment() method in post execute method of your asynctask when all json data gets loaded. 加载所有json数据后,应在asynctask的 post execute方法中调用passTagsToFragment()方法。

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM