8

アクティビティからその中のフラグメントにデータを渡す際に問題が発生します。探し回ったのですが、自分の状況に合った答えが見つかりませんでした。とという名前の2つのフラグメントクラスがCurrentFragment.javaありHistoryFragment.javaます。それらをアクティビティのタブとして初期化します。

    Tab tab = actionBar.newTab()
            .setText(R.string.tab_current)
            .setTabListener(new TaskitTabListener<CurrentFragment>(
                    this, "current", CurrentFragment.class));
    actionBar.addTab(tab);

    tab = actionBar.newTab()
            .setText(R.string.tab_history)
            .setTabListener(new TaskitTabListener<HistoryFragment>(
                    this, "history", HistoryFragment.class));
    actionBar.addTab(tab);

setArgumentsアクティビティとgetArgumentsフラグメントで使用するように言われました。しかし、この状況では、アクティビティでフラグメントオブジェクトを取得するにはどうすればよいですか?getFragmentManager().findFragmentById()フラグメントはプログラムで追加されるため、使用できません。

また、Activityコンテナ内のデータにアクセスするためにフラグメントで使用する可能性があるという投稿がいくつかありますgetActivity()が、私にとってはnullを返し続けます。誰かがその実用的な例を持っていますか?

4

1 に答える 1

8

[編集] あなたの質問によりよく答えるために、回答を更新しました。

を使用してタグでフラグメントを取得することもできますgetFragmentManager().findFragmentByTag("tag")。ただし、タブがまだ表示されていない場合、フラグメントは存在しないことに注意してください。

CurrentFragment curFrag = (CurrentFragment)
    getFragmentManager().findFragmentByTag("current");
if(curFrag == null) {
    // The user hasn't viewed this tab yet
} else {
    // Here's your data is a custom function you wrote to receive data as a fragment
    curFrag.heresYourData(data)
}

フラグメントがアクティビティからデータを取得するようにする場合は、フラグメントによって定義されたインターフェイスをアクティビティに実装させます。フラグメントのonAttach(Activity activity)ライフサイクル関数では、フラグメントを作成したアクティビティにアクセスできるため、そのアクティビティを定義したインターフェイスとしてキャストし、関数呼び出しを行うことができます。これを行うには、次のようにインターフェイスをフラグメントに配置します (多くのフラグメント間で同じインターフェイスを共有する場合は、インターフェイスを独自のファイルにすることもできます)。

public interface DataPullingInterface {
    public String getData();
}

次に、次のようにアクティビティにインターフェイスを実装します。

public class MyActivity extends Activity implements DataPullingInterface {
    // Your activity code here
    public String getData() {
        return "This is my data"
    }
}

最後にonAttach(Activity activity)、CurrentFragment のメソッドで、作成したインターフェイスとして受け取ったアクティビティをキャストして、これらの関数を呼び出すことができるようにします。

private DataPullingInterface mHostInterface;
public void onAttach(Activity activity) {
    super.onAttach(activity);
    if(D) Log.d(TAG, "onAttach");
    try {
        mHostInterface = (DataPullingInterface) activity;
    } catch(ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement DataPullingInterface");
    }
    String myData = mHostInterface.getData();           
}
于 2012-11-29T07:34:05.743 に答える