如何将值从一个片段转移到另一个片段

时间:2016-08-03 19:46:46

标签: android listview android-fragments

我一直在尝试从viewpager片段中检索一个值,但我似乎无法做到正确。

FragmentA由listview组成,当单击一个项目时,它应该将位置作为int发送到FragmentB,假设将其作为toast显示。其他代码工作正常,但吐司没有显示任何内容。

片段A:

  lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
                //This check whether the song is playing
                if (MusicPlaying.mp.isPlaying()) {
                    post = position;
                    MusicPlaying.mp.stop();
                    start();
                } else {
                    start();
                }

            }

        });

 public void start() {
        ViewPager vp = (ViewPager)getActivity().findViewById(R.id.slide);
        vp.setCurrentItem(vp.getCurrentItem() + 1, true);
    }

public static int rInt(){
        return post;
    }

FragmentB

public class FragmentB extends Fragment{

    int position;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.album, container, false);
        position = ListMusic.rInt();
        Toast.makeText(getActivity(), "" + position, Toast.LENGTH_LONG).show();
        return v;
    }


}

3 个答案:

答案 0 :(得分:1)

不要尝试使用静态字段在活动和片段之间交换信息。它们具有生命周期,如果用户旋转屏幕或将应用程序发送到后台并且进程被破坏,则您的静态变量值将不再可用。这是在片段之间共享信息的方式:

在FragmentA中:

FragmentB fragmentB = new FragmentB();
Bundle args = new Bundle();
args.putInt("position", position);
fragmentB.setArguments(args);
// Do your FragmentTransaction here.

在FragmentB中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.album, container, false);
    position = getArguments().getInt("position", 0);
    Toast.makeText(getActivity(), "" + position, Toast.LENGTH_LONG).show();
    return v;
}

答案 1 :(得分:1)

应尽可能避免两个片段之间的直接通信,但应该在保存两个片段的活动的帮助下完成,在您的情况下,它是视图寻呼机被充气的活动。我想你正在尝试在android中实现一个master-detail布局,其中,如果你在master片段(你的Listview片段A)中做了一些事情,那么它应该将数据传递给detail片段(你的片段B)。 android开发者网站上有一个教程。链接如下:

https://developer.android.com/training/basics/fragments/communicating.html

Slidenerd还有一个非常好的视频解释了InterFragment Communication。这是网上最容易理解和最好的一个。

https://www.youtube.com/watch?v=VyyGP_d0Ia8

答案 2 :(得分:0)

更好的方法是在您的活动中实施一个界面。并在每个片段onAttach函数上,获取接口。这样,您就可以在活动中获得时态数据,并将其放入另一个片段中:

界面:

public interface MyFragmentListener {
        int getSavedInt();
        void saveInt(int a);
    }

您的活动:

public class BaseActivity extends AppCompatActivity implements MyFragmentListener{

private int mInt;

 @Override public int getSavedInt(){return mInt;};

 @Override public void saveInt(int a){this.mInt = a;};

}

你的碎片:

public class BaseFragment extends Fragment{
 private MyFragmentListener mListener;

@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (mListener==null)
            if (context instanceof MyFragmentListener) {
                mListener = (MyFragmentListener) context;
            } else {
                throw new RuntimeException(context.toString() + " must implement MyFragmentListener");
            }
    }


public void saveInt(int a){
if (mListener!=null)mListener.saveInt(a);
}

public int getInt(){
if (mListener!=null)return mListener.getSavedInt();
else return -1;
}


}