2015-10-20 9 views
0

У меня есть два фрагмента. Один для ввода данных и один для отображения их в ListView. Но я не знаю, как отправить данные из фрагмента 1 к Фрагмент 2 ...Обмен данными между двумя фрагментами одной активности

Я знаю, что я могу получить данные от моего MainActivity фрагменту 1 с кодом:

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

Но как Я отправляю строку из Fragment 2 в свою активность?

UPDATE: Я не совсем уверен, если я делаю это право ... Я Harlo Холмс Tutorial (размещены ниже) и не Ive получил этот фрагмент кода

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

interface является наиболее распространенным способом, связанным с размещением Activity. Ссылка 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 или стороннюю библиотеку.