【问题标题】:Pass data between 2 fragments in android without using activity?在不使用活动的情况下在android中的2个片段之间传递数据?
【发布时间】:2016-02-19 12:04:17
【问题描述】:

我已经阅读了几个地方(hereherehere)关于如何做到这一点,我试图关注他们,但我错过了一些我不确定是什么的东西。我想将数据从 FragmentAlarm 发送到 FragmentHome。下面的代码是我对此的尝试。我想弄乱一点。

1) 为什么我没有得到任何输出?

2) 我是否还必须通过 MainActivity 才能在 2 个片段之间进行通信?我尝试使用与 FragmentStatePagerAdapter 结合的公共静态方法来“避免”使用 MainActivity。但我不确定这是否可能。

提前致谢

片段警报

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

  }
}

片段主页

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



}

【问题讨论】:

    标签: android android-fragments android-activity fragment send


    【解决方案1】:

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

    假设两个 Fragment 同时在屏幕上(由同一个父 Activity 托管),标准模式是为两个 Fragment 创建一个接口,为 Activity 创建一个接口,并让 Fragment 通过 Activity 进行通信.

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

    看看 Square 的 Otto 或 greenrobot 的 EventBus。

    使用消息总线的优势在于,就像使用接口通过 Activity 进行通信一样,总线可以让 Fragment 不必相互了解。他们都知道总线,但是经过一些仔细的计划,您可以为总线创建一个接口,然后将实际的消息总线(Otto 或 EventBus)包装在一个实现该接口的类中。

    使用消息总线比使用广播接收器容易得多,而且由于它不依赖于 Android sdk 或库,您可以轻松地模拟/测试它。

    【讨论】:

    • 所以基本上我使用的是直接通信?但是为什么我在 system.out.print 上没有得到任何输出? mparam 1 和 2 始终为空。我不明白为什么。 @GreyBeardedGeek
    • system.out 在 Android 上没有任何用处。尝试使用内置的日志记录工具。
    【解决方案2】:

    我在 Fragment 之间进行通信的两种方式。

    1) 如果我知道要调用哪些片段方法/数据,我会获取片段实例并调用它。可以通过fragmentManager的api通过tag获取实例。

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

    如果需要,请询问更多详细信息?

    【讨论】:

    • 是的,我知道这一点。我说是因为我尝试过尝试,但它似乎不起作用。您能否将您所说的内容与与我发布的代码相关的简单示例代码联系起来?我仍然不知道我是否必须使用活动来交流。谢谢 :) @AAnkit
    • 你想要哪个选项的例子?如果您使用的是 BR,那么您必须使用相同的 Intent Action 来发送/接收广播。
    • 我想了解为什么我的输出仍然为空,即使当我尝试通过新实例将文本传递给片段时,请。感谢您的帮助@AAnkit
    • 因为你不应该调用 newInstance。当已经创建了一个实例时,使用已经创建的片段实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多