我正在尝试将数据从活动发送到片段。 我不会将数据从片段发送到活动。除了在活动中实例化接口侦听器对象之外,我已经正确设置了所有内容。
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中缺少其他任何内容吗?
答案 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