Fragmentが最初にロードされたときに、ActivityからFragmentにデータを渡す

だから私の問題は基本的に私のMainActivityは最初にフラグメントがロードされていることです、私たちはそれをMyFragmentと呼びます。

私はJSONをオンラインからロードしていますが、MyFragmentに渡したいと考えています。

MainActivityでsetContentViewが呼び出されると、問題が発生します。これは、 getArguments.getSerializable( "myTag")を含むMyFragmentでonCreateViewを呼び出しています。まだ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);
}

編集:

基本的に、私の問題は、フラグメントの読み込みを始める前に、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だと思います。

私は通常これをラムダ式(kotlin)として行います。

loadJSON({passTagsToFragment()})

loadJSONはパラメータとしてラムダ式を取ります。

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

AsyncTask :: onPostExecuteでは、コールバックを呼び出す必要があります。

callback.invoke()

あるいは単に

callback()

次に、JSONがロードされてfragmentに渡されたときにフラグメントが開かれるようにしました。

それでは、Javaでそれを作ってみましょう。

JSONをロードするAsyncTaskには、例えば以下のようなインターフェースが必要です。

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コードは非常に口頭であり、KotlinはほとんどJavaインターフェースの必要性を取り除きました。

0
追加された
しかし、ありがとう、あなたのコードを理解しないでください。私はAyncTaskを実行しています、あなたは私のためにそれをJavaに翻訳できますか。
追加された 著者 Dave,

loadJSONはオンラインソースからのものなので、AsyncTaskだと思います。

私は通常これをラムダ式(kotlin)として行います。

loadJSON({passTagsToFragment()})

loadJSONはパラメータとしてラムダ式を取ります。

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

AsyncTask :: onPostExecuteでは、コールバックを呼び出す必要があります。

callback.invoke()

あるいは単に

callback()

次に、JSONがロードされてfragmentに渡されたときにフラグメントが開かれるようにしました。

それでは、Javaでそれを作ってみましょう。

JSONをロードするAsyncTaskには、例えば以下のようなインターフェースが必要です。

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コードは非常に口頭であり、KotlinはほとんどJavaインターフェースの必要性を取り除きました。

0
追加された
しかし、ありがとう、あなたのコードを理解しないでください。私はAyncTaskを実行しています、あなたは私のためにそれをJavaに翻訳できますか。
追加された 著者 Dave,

loadJSONはオンラインソースからのものなので、AsyncTaskだと思います。

私は通常これをラムダ式(kotlin)として行います。

loadJSON({passTagsToFragment()})

loadJSONはパラメータとしてラムダ式を取ります。

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

AsyncTask :: onPostExecuteでは、コールバックを呼び出す必要があります。

callback.invoke()

あるいは単に

callback()

次に、JSONがロードされてfragmentに渡されたときにフラグメントが開かれるようにしました。

それでは、Javaでそれを作ってみましょう。

JSONをロードするAsyncTaskには、例えば以下のようなインターフェースが必要です。

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コードは非常に口頭であり、KotlinはほとんどJavaインターフェースの必要性を取り除きました。

0
追加された
しかし、ありがとう、あなたのコードを理解しないでください。私はAyncTaskを実行しています、あなたは私のためにそれをJavaに翻訳できますか。
追加された 著者 Dave,

すべてのJSONデータが読み込まれたら、asynctaskのpost executeメソッドで passTagsToFragment()メソッドを呼び出す必要があります。

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
追加された
activity_main.xmlのコードとそのjavaクラスを共有してください。
追加された 著者 Diwakar Singh,
同じエラーです。私のXMLでは、フラグメントビューを追加しました。そのため、最初にアプリケーションを起動すると、MainActivity.javaの前にFragment.javaがロードされます。多分これは物事を片付けるのに役立ちます。
追加された 著者 Dave,

すべてのJSONデータが読み込まれたら、asynctaskのpost executeメソッドで passTagsToFragment()メソッドを呼び出す必要があります。

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
追加された
activity_main.xmlのコードとそのjavaクラスを共有してください。
追加された 著者 Diwakar Singh,
同じエラーです。私のXMLでは、フラグメントビューを追加しました。そのため、最初にアプリケーションを起動すると、MainActivity.javaの前にFragment.javaがロードされます。多分これは物事を片付けるのに役立ちます。
追加された 著者 Dave,

私の理解によると、まず。フラグメントでLoadjson()メソッドを呼び出してそれに応じてデータを使用することもできますが、特定のロジックがある場合はasynctaskを使用し、進行状況バーを使用してjsonを取得できます。

0
追加された