2013-01-21 34 views
11

tôi cần để truyền dữ liệu giữa từ 5 fragments một Activity, những một dữ liệu fragments gửi sau khác khi tôi đạt 5'th fragment sau đó tôi cần phải lưu trữ tất cả 5 fragments dữ liệu như thế nào chúng ta có thể làm được điều này . bất kỳ ý tưởng nào là tuyệt vời. enter image description hereĐi qua dữ liệu giữa mảnh vỡ để Hoạt động

Trả lời

32

đèo dữ liệu từ mỗi đoạn để hoạt động, khi hoạt động được tất cả dữ liệu sau đó xử lý nó. Bạn có thể chuyển dữ liệu bằng giao diện.

Fragment:

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; 
    } 
} 

Hoạt động:

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); 
    } 
} 
+0

Hey Kalyanganov Alexey bạn có thể elobarate tôi làm thế nào để truyền dữ liệu sử dụng giao diện nếu đó là với một ví dụ đơn giản đánh giá cao ... –

+1

Shure. Google có các ví dụ hay http://developer.android.com/training/basics/fragments/communicating.html –

+0

nhưng nếu tôi chỉ có một nút nằm trong đoạn cuối cùng, tôi có thể làm như thế nào? http: // stackoverflow.com/questions/32953477/pass-data-to-fragment – Hoo

5

Bạn phải quay lại thông tin về hoạt động của phân đoạn. Và thông tin văn Hoạt động của bạn để mảnh vỡ của nó:

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

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

Đây là một ví dụ cơ bản

9

Các liên kết sau đây giải thích thiết kế để giao tiếp giữa các mảnh vỡ.

Communicating with Other Fragments

Để cho phép một Fragment để giao tiếp lên đến Hoạt động của nó, bạn có thể định nghĩa một giao diện trong lớp Fragment và thực hiện nó trong hoạt động. Fragment chụp thực hiện giao diện trong phương thức vòng đời onAttach() của nó và sau đó có thể gọi các phương thức Giao diện để giao tiếp với Hoạt động.

Dưới đây là một ví dụ về Fragment để truyền thông Hoạt động:

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"); 
    } 
} 

... 
} 

Bây giờ đoạn có thể cung cấp các tin nhắn đến các hoạt động bằng cách gọi phương thức() onArticleSelected (hoặc các phương pháp khác trong giao diện) sử dụng các ví dụ mCallback của giao diện OnHeadlineSelectedListener.

Ví dụ: phương thức sau trong đoạn được gọi khi người dùng nhấp vào mục danh sách. Đoạn này sử dụng giao diện gọi lại để chuyển sự kiện đến hoạt động gốc.

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

Thực hiện giao diện

Để nhận callbacks sự kiện từ mảnh, hoạt động mà tổ chức đó phải thực hiện các giao diện được định nghĩa trong lớp mảnh.

Ví dụ: hoạt động sau đây thực hiện giao diện từ ví dụ trên.

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 
} 
} 

Cung cấp một tin nhắn đến một Fragment

Các hoạt động chủ có thể cung cấp các tin nhắn đến một đoạn bằng cách bắt dụ Fragment với findFragmentById(), sau đó trực tiếp gọi các phương thức công cộng của đoạn.Ví dụ: hãy tưởng tượng rằng hoạt động được hiển thị ở trên có thể chứa một đoạn khác được sử dụng để hiển thị mục được chỉ định bởi dữ liệu được trả về trong phương thức gọi lại ở trên. Trong trường hợp này, hoạt động này có thể vượt qua các thông tin nhận được trong phương pháp gọi lại đến đoạn khác mà sẽ hiển thị các mục:

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(); 
    } 
    } 
} 
+0

Tôi đã làm như thế này, khi tôi nhấp vào, iPhone inthat fragment tôi có một số nút và chỉnh sửa văn bản sau đó khi tôi gửi tôi đang đi đến màn hình chính. một lần nữa khi tôi bấm vào phần còn lại của các mục danh sách tôi đang thực hiện các hoạt động tương tự ở cuối khi tôi nhấp vào Tất cả thông tin sau đó tôi cần phải gửi iPhone, BlackBerry, Android, dữ liệu Nokia cho các hoạt động khác nhau. Tôi không biết làm thế nào để làm điều này. (Http://stackoverflow.com/questions/14439941/passing-data-between-fragments-to-activity) –

+0

Bạn có thể giải thích chi tiết hơn về vấn đề bạn đang gặp phải không? Bạn đang cố gắng đạt được điều gì? – Shiva

-1

Có một cách thực sự đơn giản để truyền dữ liệu từ một Fragment để Hoạt động khác mà không phải là của mình chứa một.

1) Trong Fragment: Khi bạn bắt đầu hoạt động, nói onButtonClick, vượt qua các dữ liệu bạn muốn vượt qua như vai phụ trong ý định của bạn, như vậy:

 Intent intent = new Intent(getActivity(), MapsActivity.class); 
    intent.putExtra("data", dataString); 
    startActivity(intent); 

2) Trong Hoạt động tiếp nhận: trong phương pháp onCreate của bạn, tạo ra một Bundle để lấy thông tin thông qua, như vậy:

Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     receivingString = extras.getString("data"); 
    } else { 
     // handle case 
    } 

Hy vọng nó sẽ giúp :)

0

tôi đã thử tất cả các bên trên và nó làm việc cho tôi. Đây là cách tôi làm cho nó hoạt động. Tôi đã sử dụng giao diện làm phương tiện để gửi dữ liệu từ phân đoạn đến hoạt động.

FragmentToActivity.java

public interface FragmentToActivity { 
void communicate(String comm); 

} 

FragmentOne

public class FragmentOne extends Fragment { 

private FragmentToActivity mCallback; 


@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try { 
     mCallback = (FragmentToActivity) context; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(context.toString() 
       + " must implement FragmentToActivity"); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_login, container, 
false); 
sendData("Andrews"); 

return v; 
} 
@Override 
public void onDetach() { 
    mCallback = null; 
    super.onDetach(); 
} 

public void onRefresh() { 
    Toast.makeText(getActivity(), "Fragment : Refresh called.", 
      Toast.LENGTH_SHORT).show(); 
    } 
private void sendData(String comm) 
    { 
    mCallback.communicate(comm); 

    } 

} 


} 

Hoạt động Một

public class Account extends AppCompatActivity implements 
    FragmentToActivity{ 

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

@Override 
public void communicate(String s) { 


    Log.d("received", s); 
     } 


} 
0

Bạn có thể sử dụng Communicator p attern giải thích trong các câu trả lời ở trên. Ngoài ra, bạn có thể sử dụng RxJava2. Để tách và hiệu quả tốt hơn.

1- Tạo xe buýt:

public final class RxBus { 

private static final BehaviorSubject<Object> behaviorSubject 
     = BehaviorSubject.create(); 


public static BehaviorSubject<Object> getSubject() { 
    return behaviorSubject; 
} 

}

2- hoạt động gửi hoặc mảnh

     //the data to be passed 
        MyData data =getMyData(); 
        RxBus.getSubject().onNext(data) ; 

3-các hoạt động thu hoặc mảnh

disposable = RxBus.getSubject(). 
      subscribeWith(new DisposableObserver<Object>() { 


       @Override 
       public void onNext(Object o) { 
        if (o instanceof MyData) { 
        Log.d("tag", (MyData)o.getData(); 
        } 
       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onComplete() { 

       } 
      }); 
    }); 

4-Hủy đăng ký để tránh leacks bộ nhớ:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    disposable.dispose(); 
} 
Các vấn đề liên quan