2013-10-12 16 views
7

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

+0

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

+0

^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

+0

@Zyoo tại sao vậy ?? – Raghunandan

Trả lời

4

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

+0

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

+0

có. kiểm tra tài liệu http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance (boolean) – Raghunandan

14

Để 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); 
+2

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

0

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.

4

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.

+0

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? –

+0

@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

+0

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! –

2

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 .. !!

Các vấn đề liên quan