使用接口侦听器将数据从活动发送到片段

时间:2017-10-05 00:48:10

标签: android android-fragments

我正在尝试将数据从活动发送到片段。 我不会将数据从片段发送到活动。除了在活动中实例化接口侦听器对象之外,我已经正确设置了所有内容。

public class Activity extends AppCompatActivity {

  private FragmentInterface fragmentInterfaceListener;

  @Override 
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // This line below is actually in a button onClick()
    fragmentInterfaceListener.sendDataMethod(dataToSend);

  }

  public interface FragmentInterface {
    void sendDataMethod(SampleData sampleData);
    }
  }

然后在片段中,我有:

public static class CustomFragment extends Fragment implements Activity.FragmentInterface {

  @Override
  public void sendDataMethod(final SampleData sampleData) {

  }    
}

当我在按钮onClick()中放入日志行时,单击按钮时会出现日志行。不,我不打算将sampleData放在片段包中。是的,我需要通过接口发送数据。那么如何在Activity中正确实例化fragmentInterfaceListener对象呢?我在Activity或CustomFragment中缺少其他任何内容吗?

3 个答案:

答案 0 :(得分:6)

这里缺少的是注册部分。

片段必须向活动监听器注册自己,以便在事件发生时发送数据。为此,在活动中创建一个方法

private void setOnDataListener(FragmentInterface interface){
    fragmentInterfaceListener=interface;
}

在你的片段的oncreate中,像这样设置听众

((YOUR_ACTIVITY_NAME)getActivity()).setOnDataListener(this);

答案 1 :(得分:2)

您不需要在片段中使用侦听器,因为您可以直接从其主机活动与片段进行通信。

正如@ lq-gioan所说,您可以在Fragment中创建一个公共方法,然后从您的活动中调用它。因此,创建一个公共方法来设置数据,如下所示:

public static class CustomFragment extends Fragment {

  // public method to be accessed by host activity.
  public void sendDataMethod(final SampleData sampleData) {

  }    
}

然后您可以在主持人活动中调用该方法:

CustomFragment fragment = (CustomFragment)getSupportFragmentManager()
                           .findFragmentById(R.id.fragment_id);

// or use find by tag if you adding the fragment by tag
// CustomFragment fragment = (CustomFragment)getSupportFragmentManager()
//                           .findFragmentByTag("FragmentTag");

// now you can call it
fragment.sendDataMethod(yourSampleData);

答案 2 :(得分:1)

为了将数据从Activity发送到Fragment,我们不需要接口。

您可以直接在Fragment中调用方法,也可以在Bundle

中作为setArguments传递
     ArticleFragment articleFrag = (ArticleFragment)
            getSupportFragmentManager().findFragmentById(R.id.article_fragment);

    if (articleFrag != null) {
        // If article frag is available, we're in two-pane layout...

        // Call a method in the ArticleFragment to update its content
        articleFrag.updateArticleView(position);
    } else {
        // Otherwise, we're in the one-pane layout and must swap frags...

        // Create fragment and give it an argument for the selected article
        ArticleFragment newFragment = new ArticleFragment();
        Bundle args = new Bundle();
        args.putInt(ArticleFragment.ARG_POSITION, position);
        newFragment.setArguments(args);

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack so the user can navigate back
        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

您可以参考https://developer.android.com/training/basics/fragments/communicating.html