我已经阅读了几个地方(here,here或here)关于如何做到这一点并且我试图遵循它们,但是我错过了一些我不确定的东西。我想将数据从FragmentAlarm发送到FragmentHome。下面的代码是我对此的尝试。我试图搞砸了一下。
1)为什么我没有得到任何输出?
2)我还需要通过MainActivity才能在两个片段之间进行通信吗?我试图使用与FragmentStatePagerAdapter结合的公共静态方法来“避免”使用MainActivity。但我不确定这是否可能。
提前致谢
FragmentAlarm
public class FragmentAlarm extends Fragment implements SeekBar.OnSeekBarChangeListener{
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public FragmentAlarm() { // Required empty public constructor}
public static FragmentAlarm newInstance(String param1, String param2) {
FragmentAlarm fragment = new FragmentAlarm();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
//put any extra arguments that you may want to supply to this fragment
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.tab_alarm,container,false);
FragmentAlarm.newInstance(ARG_PARAM1,"test from alarm");
FragmentHome.newInstance(ARG_PARAM1,"test from alarm");
return v;
}
@Override
public void onStart() {
super.onStart();
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
System.out.println("mParam1 " + mParam1);
System.out.println("mParam2 " + mParam2);
}
}
}
FragmentHome
public class FragmentHome extends Fragment implements ValuesLoadedListener, SwipeRefreshLayout.OnRefreshListener {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public FragmentHome() {// Required empty public constructor }
// TODO: Rename and change types and number of parameters
public static FragmentHome newInstance(String param1, String param2) {
FragmentHome fragment = new FragmentHome();
Bundle args = new Bundle();
//put any extra arguments that you may want to supply to this fragment
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onStart() {
super.onStart();
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
System.out.println("mParam1 " + mParam1);
System.out.println("mParam2 " + mParam2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.tab_home,container,false);
FragmentAlarm.newInstance(ARG_PARAM1,"test from home");
FragmentHome.newInstance(ARG_PARAM1,"test from home");
...
return v;
}
PagerAdapter
public class MyViewPagerAdapter extends FragmentStatePagerAdapter {
private Context context;
int icons[] = {R.drawable.ic_home,
R.drawable.ic_graph,
R.drawable.ic_bell_mid,
R.drawable.ic_settings};
public MyViewPagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public Fragment getItem(int position) {
if(position == 0) // if the position is 0 we are returning the First tab
{
return new FragmentHome();
}
else if (position == 1)
{
return new FragmentTrend();
}
else if (position == 2)
{
return new FragmentAlarm();
}
else
{
return new FragmentSetting();
}
}
@Override
public int getCount() {
return 4;
}
public Drawable getIcon(int position)
{
return context.getResources().getDrawable(icons[position]);
}
}
答案 0 :(得分:0)
我在片段之间进行通信的两种方式。
1)如果我知道要调用哪些片段方法/数据,我会得到片段实例并调用它。您可以通过fragmentManager' s apis via tag获取实例。
2)如果多个片段可以响应我的方法/数据调用,我使用BroadcastReceivers。通过这种方式,在您希望收听的每个片段中注册BR来自一个/多个片段。并从特定片段发送广播。
如果需要,请询问更多细节?
答案 1 :(得分:0)
首先,我想说,我认为两个片段直接沟通可能不是一个好主意。使用Fragments的部分原因是它们可以是可重复使用的部分。但是他们中的两个紧密耦合就意味着它们不能独立使用。
假设两个片段同时在屏幕上(由同一个父Activity托管),标准模式是为两个片段创建接口,为Activity创建一个片段,并让片段通过Activity进行通信
也就是说,使用消息总线也是可能的。
看看Square的Otto或greenrobot的EventBus。
使用消息总线的优点是,就像使用接口通过Activity进行通信一样,总线将使片段不必彼此了解。他们都知道总线,但通过一些仔细的规划,你可以为总线创建一个接口,然后将实际的消息总线(Otto或EventBus)包装在一个实现该接口的类中。
使用消息总线比使用BroadcastReceiver容易得多,并且因为它不依赖于Android sdk或库,所以您可以轻松地模拟/测试它。