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. Đi qua dữ liệu giữa mảnh vỡ để Hoạt động
Trả lời
đè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);
}
}
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
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();
}
}
}
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) –
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
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 :)
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);
}
}
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();
}
- 1. Các mảnh vỡ Android Giữ lại dữ liệu
- 2. Android Hai mảnh vỡ trong Hoạt động Same
- 3. động thêm nhiều mảnh vỡ để bố trí hoạt động của tôi
- 4. làm thế nào để chuyển dữ liệu thêm từ một mảnh sang người khác qua hoạt động
- 5. Cách liên lạc giữa hai mảnh vỡ con bên trong một mảnh ghép lồng nhau
- 6. Đi qua các bộ dữ liệu
- 7. Thực hành tốt nhất về mảnh vỡ
- 8. Phân mảnh gói khi gửi dữ liệu qua SSLStream
- 9. Android: Chuyển dữ liệu giữa dịch vụ và hoạt động
- 10. Vị trí mảnh vỡ GLSL
- 11. Chuyển đổi các mảnh vỡ hoặc hoạt động (ví dụ: bố cục) về thay đổi hướng
- 12. tay lái phá vỡ khi đi qua this.item trong Spine.js
- 13. Thử nghiệm các mảnh vỡ Android
- 14. Các mảnh vỡ không hoạt động đúng sau khi thay đổi định hướng
- 15. Android FragmentTab chủ và Những mảnh vỡ bên trong mảnh vỡ
- 16. Các mảnh vỡ chồng lên nhau
- 17. Thực tiễn tốt nhất cho Đi qua dữ liệu giữa trang
- 18. ứng dụng Android dựa trên hoạt động duy nhất, nhiều mảnh vỡ
- 19. Điều hướng mảnh vỡ Android và backstack
- 20. Các mảnh vỡ của ViewPager biến mất
- 21. Một người mới có nên quên đi những mảnh vỡ không?
- 22. Các mảnh vỡ trong các tab Fragment
- 23. Đi qua biến hoạt Javascript để Python
- 24. Làm thế nào để sử dụng mảnh vỡ trong Android
- 25. Đi qua dữ liệu đến và từ một UIWebView Embedded
- 26. Lắp một đường đi qua gốc (0,0) đến dữ liệu
- 27. Flask debug = True không hoạt động khi đi qua uWSGI
- 28. Đi qua tên truy cập và mật khẩu để NET HttpWebRequest qua URI không hoạt động
- 29. Nhận dữ liệu từ hoạt động khác
- 30. Android & RoboGuice - Tiêm chế độ xem trên mảnh vỡ?
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 ... –
Shure. Google có các ví dụ hay http://developer.android.com/training/basics/fragments/communicating.html –
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