Một cách tôi biết là qua hoạt động.Chúng tôi có thể gửi dữ liệu từ phân đoạn đến hoạt động và hoạt động tới phân đoạn Có cách nào khác không.Làm cách nào để chuyển dữ liệu từ một đoạn này sang một đoạn mã android khác
Trả lời
Trích dẫn từ các tài liệu
Thông thường bạn sẽ muốn một Fragment để giao tiếp với nhau, ví dụ như thay đổi nội dung dựa trên một sự kiện người dùng. Tất cả giao tiếp Fragment-to-Fragment được thực hiện thông qua Hoạt động liên quan. Hai mảnh vỡ không bao giờ nên giao tiếp trực tiếp.
Tôi đề nghị bạn làm theo các phương pháp trong các tài liệu và tôi đã không cố gắng nào khác thay thế
Đối với thêm thông tin và ví dụ chekc các tài liệu trong link bên dưới
http://developer.android.com/training/basics/fragments/communicating.html
nếu tôi đang sử dụng' setRetainInstance (true) 'thì sao? hiện nó vẫn cần phải vượt qua hoạt động đầu tiên? – Zyoo
có. kiểm tra tài liệu http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance (boolean) – Raghunandan
Để vượt qua dữ liệu từ một đoạn đến một đoạn khác Bundle
sẽ giúp ích.
LifeShapeDetailsFragment fragment = new LifeShapeDetailsFragment(); // object of next fragment
Bundle bundle = new Bundle();
bundle.putInt("position", id);
fragment.setArguments(bundle);
Sau đó push/call next Fragments.
và mã để Fragment tiếp theo:
Bundle bundle = this.getArguments();
int myInt = bundle.getInt("position", 0);
Theo tài liệu nhà phát triển Android gốc, phương pháp này là sai. Chúng ta nên sử dụng hoạt động để giao tiếp giữa hai mảnh. Đây là liên kết: http://developer.android.com/intl/vi/training/basics/fragments/communicating.html – salih
Cho phép các mảnh để giao tiếp với nhau bằng cách sử dụng các hoạt động như trung gian của họ là một thực hành tốt nhất phổ biến khi sử dụng mảnh vỡ. Truy cập http://developer.android.com/guide/components/fragments.html để biết thêm chi tiết về mẫu quan trọng này. Bất cứ khi nào bạn cần tương tác với một phân đoạn khác, bạn phải luôn sử dụng phương thức trong hoạt động của phân đoạn thay vì trực tiếp truy cập vào đoạn mã khác . Lần duy nhất có ý nghĩa khi truy cập một đoạn từ phân đoạn khác là khi bạn biết rằng bạn sẽ không cần sử dụng lại đoạn của mình trong hoạt động khác. Bạn hầu như luôn luôn nên viết các đoạn giả định rằng bạn sẽ sử dụng lại chúng thay vì mã hóa chúng với nhau.
Có hai phương pháp tôi muốn xem xét khả thi:
Một .Communicate với hoạt động sở hữu của bạn và tin nhắn mong muốn những mảnh còn lại qua đó hoạt động sở hữu, chi tiết về có thể tìm thấy int ông chính thức tài liệu android đây :
http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
Trích:
Trong một số trường hợp, bạn có thể cần một đoạn để chia sẻ các sự kiện với hoạt động . Một cách tốt để làm điều đó là xác định giao diện gọi lại bên trong đoạn và yêu cầu hoạt động của máy chủ thực hiện nó. Khi hoạt động nhận được gọi lại thông qua giao diện, nó có thể chia sẻ thông tin với các đoạn khác trong bố cục nếu cần.
Giao diện truyền thông có thể trông giống như thế này:
public interface IActionListener{
//You can also add parameters to pass along etc
public void doSomething();
}
Đoạn sẽ giống như thế này:
public class MyFragment extends Fragment{
private WeakReference<IActionListener> actionCallback;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
actionCallback = new WeakReference<IActionListener>((IActionListener) activity);
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement IActionListener.");
}
}
}
Tôi đang sử dụng một WeakReference ở đây nhưng đó là thực sự tùy thuộc vào bạn. Bây giờ bạn có thể sử dụng actionCallback để giao tiếp với hoạt động sở hữu và gọi các phương thức được định nghĩa trong IActionListener.
Các Hoạt động sở hữu sẽ trông như thế này:
public class MyActivity extends ActionBarActivity implements IActionListener {
public void doSomething(){ //Here you can forward information to other fragments }
}
B. Bây giờ, đối với phương thức thứ hai thứ hai - bạn có thể có các mảnh trực tiếp giao tiếp với nhau bằng cách sử dụng giao diện - theo cách này bạn không phải biết chính xác lớp của đoạn bạn đang nói đến, đảm bảo khớp nối lỏng lẻo.
Thiết lập như sau: Bạn có hai đoạn (hoặc nhiều hơn) và một hoạt động (để bắt đầu đoạn thứ hai). Chúng ta có một giao diện cho phép Fragment 2 gửi phản hồi đến Fragment 1 khi nó đã hoàn thành nhiệm vụ của nó. Vì lợi ích của sự đơn giản chúng ta chỉ cần tái sử dụng giao diện I quy định tại A.
Đây là Fragment của chúng tôi 1:
public class FragmentOne extends Fragment implements IActionListener {
public void doSomething() {//The response from Fragment 2 will be processed here}
}
Sử dụng phương pháp mô tả trong A. Fragment 1 hỏi nó sở hữu Hoạt động để bắt đầu Fragment 2. Tuy nhiên, Activity sẽ chuyển qua Fragment 1 như một đối số cho Fragment 2, vì vậy Fragment 2 sau đó có thể truy cập gián tiếp Fragment 1 và gửi trả lời. Hãy nhìn vào cách thức Hoạt động giỏi thể thao Fragment 2:
public class MyActivity extends ActionBarActivity {
// The number is pretty random, we just need a request code to identify our request later
public final int REQUEST_CODE = 10;
//We use this to identify a fragment by tag
public final String FRAGMENT_TAG = "MyFragmentTag";
@Override
public void onStartFragmentTwo() {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
// The requesting fragment (you must have originally added Fragment 1 using
//this Tag !)
Fragment requester = manager.findFragmentByTag(FRAGMENT_TAG);
// Prepare the target fragment
Fragment target = new FragmentTwo();
//Here we set the Fragment 1 as the target fragment of Fragment 2's
//communication endeavors
target.getSelf().setTargetFragment(requester, REQUEST_CODE);
// Hide the requesting fragment, so we can go fullscreen on the target
transaction.hide(requester);
transaction.add(R.id.fragment_container, target.getSelf(), FRAGMENT_TAG);
transaction.addToBackStack(null);
transaction.commit();
}
}
Gợi ý: Tôi đang sử dụng Hỗ trợ-Framework, vì vậy nếu bạn phát triển chỉ cho> Android 3.0 bạn chỉ có thể sử dụng FragmentActivity thay vì ActionBarActivity.
Bây giờ FragmentTwo đã được bắt đầu, chúng ta hãy nhìn vào cách FragmentTwo sẽ giao tiếp với FragmentOne:
public class FragmentTwo extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(savedInstanceState != null){
// Restore our target fragment that we previously saved in onSaveInstanceState
setTargetFragment(getActivity().getSupportFragmentManager().getFragment(savedInstanceState, TAG),
MyActivity.REQUEST_CODE);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Retain our callback fragment, the TAG is just a key by which we later access the fragment
getActivity().getSupportFragmentManager().putFragment(outState, TAG, getTargetFragment());
}
public void onSave(){
//This gets called, when the fragment has done all its work and is ready to send the reply to Fragment 1
IActionListener callback = (IActionListener) getTargetFragment();
callback.doSomething();
}
}
Bây giờ thi hành doSomething() trong Fragment 1 sẽ được gọi.
Tôi nghĩ rằng có lỗi mã trong trích đoạn mã đầu tiên của bạn. Bạn gọi WeakReference của bạn là "ActionListener" tại một thời điểm và "ActionCallback" ở một điểm khác. Bạn có thể vui lòng kiểm tra điều này? –
@ParthShah oh cảm ơn! Viết điều này ra khỏi đầu của tôi và không kiểm tra lại tên biến - cảm ơn bạn một lần nữa, tôi đã sửa nó – AgentKnopf
Tuy nhiên, câu trả lời là tuyệt vời với rất nhiều ví dụ tuyệt vời! Lam tôt lăm! –
Dưới đây là giải pháp,
Thực hiện theo các bước dưới đây:
1 tạo giao diện như thế
2.implements hoạt động của bạn sử dụng giao diện này
for.e.g
public class OrderDetail extends ActionBarActivity implements TitleChangeListener
3 .in hoạt động này tạo trên onUpdateTitle()
public void onUpdateTitle(String title)
{
//here orderCompletedDetail is the object second fragment name ,In which fragement I want send data.
orderCompletedDetail.setTitle(title);
}
4.Bây giờ, trong phân đoạn viết một số mã.
public class OrderPendingDetail extends Fragment
{
private View rootView;
private Context context;
private OrderDetail orderDetail;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
rootView = inflater.inflate(R.layout.order_pending_detail, container, false);
context = rootView.getContext();
//here OrderDetail is the name of ActionBarActivity
orderDetail = (OrderDetail) context;
//here pass some text to second Fragment using button ClickListener
but_updateOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
// here call to Activity onUpdateTitle()
orderDetail.onUpdateTitle("bridal");
}
});
return rootView;
}
}
5.write một số mã trong thứ hai Fragment setTitle()
public void setTitle(String title)
{
TextView orderCompeted_name=(TextView)rootView.findViewById(R.id.textView_orderCompeted_name);
orderCompeted_name.setText(title);
//here you see the "bridal" value for TextView
}
Trong giải pháp này khi bạn click vào nút của Fragment một thời gian đó nó cho thấy giá trị trong Fragment thứ hai. Tôi hy vọng nó sẽ hữu ích cho bạn .. !!
- 1. Làm cách nào để chuyển một số dữ liệu sang một Phân đoạn khác?
- 2. Làm cách nào để di chuyển từ một đoạn này sang phân đoạn khác khi nhấp vào một ImageView trong Android?
- 3. Cách chuyển dữ liệu từ hoạt động sang phân đoạn
- 4. Cách chuyển dữ liệu từ một đoạn đến hộp thoạiFragment
- 5. Có cách nào để nhúng một đoạn mã vào đoạn mã khác không?
- 6. Làm cách nào để di chuyển thư mục 'Đoạn mã của tôi' của Visual Studio sang một ổ đĩa khác?
- 7. trượt một đoạn trên đoạn khác trong Android
- 8. Chuyển một đoạn mã Lisp sang Clojure (PAIP)
- 9. Chuyển từ đoạn bản đồ sang phân đoạn khác và quay lại
- 10. di chuyển đoạn Android sang một vùng chứa khác Không thể thay đổi ID vùng chứa của đoạn
- 11. Làm cách nào để chuyển dữ liệu từ hoạt động này sang hoạt động khác?
- 12. Làm cách nào để gửi dữ liệu từ một hoạt động đến phân đoạn gốc?
- 13. Cách chuyển dữ liệu giữa hoạt động sang phân đoạn bằng ý định trong Android
- 14. Android thay thế đoạn hiện tại bằng một đoạn khác
- 15. Cách di chuyển dữ liệu và cài đặt từ cơ sở dữ liệu này sang cơ sở dữ liệu khác?
- 16. Làm cách nào để tôi có thể sử dụng lại một phân đoạn đoạn Android trên các phần khác nhau?
- 17. 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
- 18. Chuyển dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác
- 19. Linux để thêm dữ liệu từ một tệp này sang một tệp khác
- 20. Làm thế nào để thay thế phân đoạn thành một đoạn khác trong TabLayout và ViewPager
- 21. Android: Truyền dữ liệu từ phân đoạn con đến đoạn mẹ
- 22. Làm cách nào để sao chép dữ liệu từ một HDFS sang HDFS khác?
- 23. Chuyển tràn từ một div này sang một div khác
- 24. Làm cách nào để sao chép dữ liệu nhị phân từ luồng này sang luồng khác?
- 25. Làm cách nào để chuyển giá trị tiến trình từ chuỗi này sang hoạt động khác?
- 26. Làm cách nào để chuyển ngữ cảnh từ hoạt động này sang hoạt động khác?
- 27. Cách chuyển hướng cuộc gọi từ một số này sang số khác trong android
- 28. Cách chuyển một số dữ liệu từ máy chủ sang thiết bị android
- 29. Làm cách nào để chuyển một giá trị từ dữ liệu Vue sang href?
- 30. Đoạn mã trong studio android
sử dụng giao diện liên lạc với hoạt động lưu trữ sau đó chuyển dữ liệu từ đoạn hoạt động – Raghunandan
^không, đừng làm vậy .. xem điều này .. [http://stackoverflow.com/questions/13733304/ callback-to-a-fragment-from-a-dialogfragment] (http://stackoverflow.com/questions/13733304/callback-to-a-fragment-from-a-dialogfragment) – Zyoo
@Zyoo tại sao vậy ?? – Raghunandan