2015-11-17 66 views
0

我读了几个地方(here,herehere)关于如何做到这一点,我试图跟着他们,但即时通讯失踪的东西,我不知道是什么。我想从FragmentAlarm发送数据到FragmentHome。下面的代码是我对此的尝试。我试图搞砸了一下。在android中的2个片段之间传递数据而不使用活动?

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

两种方式1片段之间进行通信。 1)如果我知道要调用哪些片段的方法/数据,我得到片段实例并调用它。您可以通过标记通过fragmentManager的apis获取实例。

2)如果多个片段可以响应我的方法/数据调用,我使用BroadcastReceivers。通过这种方式,您可以在每个想要侦听的片段中注册BR,从一个/多个片段中调用。并从特定片段发送广播。

如果需要,询问更多细节?

+0

是的,我知道这一点。我说有点因为我尝试了一次尝试,但它似乎并没有工作。你能否把你说的话与我发布的我的代码相关的简单示例代码联系起来?我仍然不知道我是否需要使用活动进行交流。谢谢:) @AAnkit – Celly

+0

你想要哪个选项的例子?如果您使用BR,则必须使用相同的意向操作来发送/接收广播。 – AAnkit

+0

我想知道为什么我的输出仍然为空,即使当我试图通过新实例传递一个文本到片段时,请。感谢您的帮助@AAnkit – Celly

0

首先,我想说,我认为它可能不是一个好主意,两个片段直接进行通信。部分使用Fragments的原因是它们可以成为可重用的部分。但是让它们中的两个紧密结合就意味着它们不能独立使用。

假设两个碎片同时在屏幕上(由同一个父Activity启动),标准模式是为两个碎片创建接口,为Activity创建一个接口,并让碎片通过活动。

也就是说,也可以使用消息总线。

看看Square的Otto或greenrobot的EventBus。

使用消息总线的好处在于,就像使用接口通过Activity进行通信一样,总线会使片段不必知道彼此。他们都具有总线的知识,但是经过一些仔细的规划,您可以为总线创建接口,然后将实际的消息总线(Otto或EventBus)包装在实现该接口的类中。

使用消息总线比使用BroadcastReceiver容易得多,并且由于它不依赖于Android SDK或库,因此可以轻松地对其进行模拟/测试。

+0

所以基本上即时通讯使用直接通讯?但那么为什么我没有在system.out.print上获得任何输出? mparam 1和2始终为空。我不明白为什么。 @GreyBeardedGeek – Celly

+0

system.out在Android上没有任何用处。尝试使用内置的日志记录工具。 – GreyBeardedGeek

相关问题