我一直在尝试从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;
}
}
答案 0 :(得分:1)
不要尝试使用静态字段在活动和片段之间交换信息。它们具有生命周期,如果用户旋转屏幕或将应用程序发送到后台并且进程被破坏,则您的静态变量值将不再可用。这是在片段之间共享信息的方式:
FragmentB fragmentB = new FragmentB();
Bundle args = new Bundle();
args.putInt("position", position);
fragmentB.setArguments(args);
// Do your FragmentTransaction here.
@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。这是网上最容易理解和最好的一个。
答案 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;
}
}