【问题标题】:How to communicate between fragments?片段之间如何通信?
【发布时间】:2015-09-02 07:10:46
【问题描述】:

我正在开发一个 Android 应用程序。我有一个要求,例如片段 1 中有一个按钮,当用户单击该按钮时,结果应显示在片段 2 中。加载活动时,两个片段都已附加。这是我的尝试:

在主要活动中:

    public void dsp(String str) {
    secondfragment f2=new secondfragment();
    Bundle bundle = new Bundle();
    bundle.putString("edttext", "From Activity");

    f2.setArguments(bundle);
    }

在第一个片段中:

    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;
}

在第二个片段中:

    @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;
}

【问题讨论】:

标签: android android-fragments android-fragmentactivity


【解决方案1】:

这里有 Android 文档中关于 Communicating Between Fragments 的内容。在这里,您将拥有使两个或多个片段安全通信的所有必要步骤:)

【讨论】:

    【解决方案2】:

    在从 Fragment 到 Fragment 进行通信时,您使用接口将数据传递给 Activity,Activity 进而更新您要更改的 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;
      }
    }
    

    然后在主Activity中实现接口:

    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);
         }
      }
    

    }

    更新

    在您的第二个片段中,我通常使用静态 newInstance(Bundle args) 方法进行初始化,然后使用公共方法从 Activity 与片段进行通信,例如:

     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
          }
    
     }
    

    就是这样,编码愉快!

    【讨论】:

    • 这里有同样的内容,但由 Android 员工 developer.android.com/training/basics/fragments/…987654321@ 解释
    • @AndreuRodrígueziDonaire 对,但一个例子比链接好
    • @inner_class7 我尝试过同样的方法。但我无法在 fragment2 中使用 get 参数方法。
    • @inner_class7 你能详细说明我在fragment2中要做的事情吗?
    • @ramyabr 查看全部答案 上面我已经更新它以准确反映需要做什么。