2015-10-20 164 views
0

我有兩個片段。一個用於數據輸入,另一個用於在ListView中顯示它們。 但我不知道如何從片段1的數據發送到片段2 ...在一個活動的兩個片段之間共享數據

我知道我可以從我的MainActivity獲取數據到片段1用下面的代碼:

String listElement = getActivity().getIntent().getStringExtra("com.sample.MESSAGE"); 

但是怎麼辦我從Fragment 2發送字符串到我的Activity?

更新:我不是很確定,如果我這樣做是正確的......我用Harlo福爾摩斯教程(貼在下面),而不是香港專業教育學院得到這個片段代碼

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Button; 


    public class AddDataFragment extends Fragment { 

     public interface OnDataPass { 
      public void onDataPass(String data); 
     } 

     Button buttonadd; 
     Button buttondelete; 

     private EditText inputProduct; 

     private TextView listElement; 

     OnDataPass dataPasser; 

     @Override 
     public void onAttach(Context context){ 
      super.onAttach(context); 

      Activity a; 

      if (context instanceof Activity){ 
       a=(Activity) context; 
      } 
      dataPasser = (OnDataPass) context; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container,           Bundle savedInstanceState) { 

      View view = inflater.inflate(R.layout.fragment_add_data, container, false); 
      inputProduct = (EditText) view.findViewById(R.id.editText_product); 
      buttonadd = (Button) view.findViewById(R.id.button_add_addData); 
      buttondelete = (Button) view.findViewById(R.id.button_delete_addData); 

      listElement = (TextView) view.findViewById(R.id.productTest); 

      buttonadd.setEnabled(true); 
      buttondelete.setEnabled(true); 

      buttonadd.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        listElement.setText(getString(R.string.ListElementPlaceholder,       inputProduct.getText())); 
       } 
       public void passData(String listElement){ 
        dataPasser.onDataPass(listElement); 
       } 
      }); 

      return view; 
     } 


} 

其中有一些問題, onAttach方法...這是正確的方法嗎?

+0

使用接口在片段之間進行通信 –

+0

看看http://stackoverflow.com/questions/13700798/basic-communication-between-two-fragments –

+0

你可以使用eventbus。 https://github.com/greenrobot/EventBus – MHossein

回答

0

對於Fragment與其主機Activity進行通信,interface是最常見的方式。 Nandakishore Shetty在評論中的鏈接引用了Android Docs中推薦的方法,這是我使用的方法,非常穩定(下面的編輯示例)。

public class MyFragment extends Fragment { 

    MyFragmentListener mCallback; 

    // Container Activity must implement this interface 
    public interface MyFragmentListener { 
     public void methodToImplemet(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 = (MyFragmentListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement MyFragmentListener"); 
     } 
    } 

    ... 
} 

某處你Fragment裏面,你會再打電話mCallback.methodToImplement(position);

(內部的onClick()即)然後,您Activity內:

public class MainActivity extends Activity implements MyFragmentListener { 
    //... 
    @Override 
    public void methodToImeplement(int position) { 
     Log.e(getClass().getSimpleName(), "position: " + position); 
    } 

這裏有一個link to a sample app顯示片段/活動通信我把共同爲一個類似的SO問題。

其他替代方案包括使用某種EventBus,如LocalBroadcastManager或第三方庫。