当前位置: 动力学知识库 > 问答 > 编程问答 >

android - How to communicate between fragments?

问题描述:

I am developing an Android application. I have a requirement like there is a button in fragment 1, when a user clicks that button result should be displayed in fragment 2. While loading the activity both fragments is attached. Here is my try:

In main activity:

 public void dsp(String str) {

secondfragment f2=new secondfragment();

Bundle bundle = new Bundle();

bundle.putString("edttext", "From Activity");

f2.setArguments(bundle);

}

In first fragment:

 public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View v=inflater.inflate(R.layout.fragone, container,false);

Button btn = (Button) v.findViewById(R.id.button1);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v)

{

m.dsp("clicked");

}

});

return v;

}

In second fragment:

 @Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View v=inflater.inflate(R.layout.fragtwo, container,false);

tv= (TextView) v.findViewById(R.id.textView1);

tv.setText(this.getArguments().getString("name"));

return v;

}

网友答案:

When communicating from Fragment to Fragment you use an interface to pass data to the Activity which in turn updates the fragment you want to change.

For Example:

In Fragment 1:

public class FragmentOne extends Fragment{

  public Callback mCallback;

  public interface Callback{
       void onUpdateFragmentTwo(String message);
  }


   @Override
   public void onAttach(Activity activity){
     super.onAttach(activity);
     mCallback = (Callback) activity;
   }

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragone, container,false);
        Button btn = (Button) v.findViewById(R.id.button1); 
        btn.setOnClickListener(new OnClickListener() {           
            @Override
           public void onClick(View v) {
               mCallback.onUpdateFragmentTwo("clicked");
            }     
        });
     return v;
  }
}

then in main Activity implement the interface:

public class MainActivity extends AppCompatActivity implements Callback{

  FragmentTwo fragmentTwo;
  @Override
  public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     // ... Load views or perform logic

     // ... Load Fragment Two into your container
     if(savedInstanceState == null){
         fragmentTwo = FragmentTwo.newInstance(new Bundle()); // use real bundle here
         getSupportFragmentManager()
             .beginTransaction()
             .add(R.id.fragment_holder, fragmentTwo, "Frag2").commit();
     }
  }


  // Interface method
  @Override
  public void onUpdateFragmentTwo(String message){
     // Call activity method with the argument
     if(fragmentTwo != null){
          fragmentTwo.updateFragmentTwo(message);
     }
  }

}

Update

In your second fragment I typically use a static newInstance(Bundle args) method to initialize and then would use a public method to communicate from the Activity to the Fragment for example:

 public class FragmentTwo extends Fragment{

      public static FragmentTwo newInstance(Bundle args){
          FragmentTwo fragment = new FragmentTwo();
          fragment.setArguments(args);
          return fragment;
      }

      //... Class overrides here onCreateView etc..

      // declare this method 
      public void updateFragmentTwo(String updateText){
         // .. do something with update text
      }

 }

Thats it, happy coding!

网友答案:

Here you have what the Android Documentation says about Communicating Between Fragments. Here you'll have all the necessary steps to make two or more fragments communicate securely :)

分享给朋友:
您可能感兴趣的文章:
随机阅读: