16

fragments5から 1の間でデータを渡す必要がありますActivity。これらは、5fragments番目に到達したときにデータを次々に送信し、5 つのデータfragmentすべてを保存する必要がありfragmentsます。どんなアイデアも素晴らしいです。ここに画像の説明を入力

4

7 に答える 7

56

各フラグメントからアクティビティにデータを渡し、アクティビティがすべてのデータを取得してから処理します。インターフェイスを使用してデータを渡すことができます。

断片:

public class Fragment2 extends Fragment {

  public interface onSomeEventListener {
    public void someEvent(String s);
  }

  onSomeEventListener someEventListener;

  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
        try {
          someEventListener = (onSomeEventListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement onSomeEventListener");
        }
  }

  final String LOG_TAG = "myLogs";

  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment2, null);

    Button button = (Button) v.findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        someEventListener.someEvent("Test text to Fragment1");
      }
    });

    return v;
  }
}

アクティビティ:

public class MainActivity extends Activity implements onSomeEventListener{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Fragment frag2 = new Fragment2();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.add(R.id.fragment2, frag2);
        ft.commit();
    }

  @Override
  public void someEvent(String s) {
      Fragment frag1 = getFragmentManager().findFragmentById(R.id.fragment1);
      ((TextView)frag1.getView().findViewById(R.id.textView)).setText("Text from Fragment 2:" + s);
  }
}
于 2013-01-21T13:49:26.890 に答える
11

次のリンクは、フラグメント間の通信の設計について説明しています。

他のフラグメントとの通信

FragmentがそのActivityまで通信できるようにするには、Fragmentクラスでインターフェースを定義し、それをActivity内に実装できます。フラグメントは、onAttach()ライフサイクルメソッド中にインターフェイスの実装をキャプチャし、アクティビティと通信するためにインターフェイスメソッドを呼び出すことができます。

フラグメントからアクティビティへの通信の例を次に示します。

public class HeadlinesFragment extends ListFragment {

OnHeadlineSelectedListener mCallback;

// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

...
}

これで、フラグメントは、OnHeadlineSelectedListenerインターフェイスのmCallbackインスタンスを使用してonArticleSelected()メソッド(またはインターフェイス内の他のメソッド)を呼び出すことにより、アクティビティにメッセージを配信できます。

たとえば、ユーザーがリストアイテムをクリックすると、フラグメント内の次のメソッドが呼び出されます。フラグメントは、コールバックインターフェイスを使用して、イベントを親アクティビティに配信します。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // Send the event to the host activity
    mCallback.onArticleSelected(position);
}

インターフェイスを実装する

フラグメントからイベントコールバックを受信するには、フラグメントをホストするアクティビティがフラグメントクラスで定義されたインターフェイスを実装する必要があります。

たとえば、次のアクティビティは、上記の例のインターフェイスを実装します。

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
...

public void onArticleSelected(int position) {
    // The user selected the headline of an article from the HeadlinesFragment
    // Do something here to display that article
}
}

フラグメントにメッセージを配信する

ホストアクティビティは、findFragmentById()を使用してFragmentインスタンスをキャプチャし、フラグメントのパブリックメソッドを直接呼び出すことで、メッセージをフラグメントに配信できます。

たとえば、上記のアクティビティに、上記のコールバックメソッドで返されたデータによって指定されたアイテムを表示するために使用される別のフラグメントが含まれている可能性があるとします。この場合、アクティビティは、コールバックメソッドで受信した情報を、アイテムを表示する他のフラグメントに渡すことができます。

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
...

public void onArticleSelected(int position) {
    // The user selected the headline of an article from the HeadlinesFragment
    // Do something here to display that article

    ArticleFragment articleFrag = (ArticleFragment)
            getSupportFragmentManager().findFragmentById(R.id.article_fragment);

    if (articleFrag != null) {
        // If article frag is available, we're in two-pane layout...

        // Call a method in the ArticleFragment to update its content
        articleFrag.updateArticleView(position);
    } else {
        // Otherwise, we're in the one-pane layout and must swap frags...

        // Create fragment and give it an argument for the selected article
        ArticleFragment newFragment = new ArticleFragment();
        Bundle args = new Bundle();
        args.putInt(ArticleFragment.ARG_POSITION, position);
        newFragment.setArguments(args);

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack so the user can navigate back
        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }
   }
 }
于 2013-01-21T14:03:07.810 に答える
5

フラグメントのアクティビティに情報を戻す必要があります。そしてあなたの Activity ディスパッチ情報をそのフラグメントに:

// In fragment A
((ParentActivity)getActivity()).dispatchInformations("test");

// In ParentActivity
public void dispatchInformations(String mesg){
    fragmentB.sendMessage(mesg);
}

これは基本的な例です

于 2013-01-21T13:47:40.120 に答える