fragments
5から 1の間でデータを渡す必要がありますActivity
。これらは、5fragments
番目に到達したときにデータを次々に送信し、5 つのデータfragment
すべてを保存する必要がありfragments
ます。どんなアイデアも素晴らしいです。
7 に答える
各フラグメントからアクティビティにデータを渡し、アクティビティがすべてのデータを取得してから処理します。インターフェイスを使用してデータを渡すことができます。
断片:
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);
}
}
次のリンクは、フラグメント間の通信の設計について説明しています。
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();
}
}
}
フラグメントのアクティビティに情報を戻す必要があります。そしてあなたの Activity ディスパッチ情報をそのフラグメントに:
// In fragment A
((ParentActivity)getActivity()).dispatchInformations("test");
// In ParentActivity
public void dispatchInformations(String mesg){
fragmentB.sendMessage(mesg);
}
これは基本的な例です