最好的方法是使用SharedPreferences
为此,我们需要像这样定义和初始化SharedPreferences
SharedPreferences preferences
public static final String MY_SHARED_PREFERENCES = "MySharedPrefs"
preferences = getSharedPreferences(MY_SHARED_PREFERENCES, Context.MODE_PRIVATE)
为了节省空间,使用以下代码。
SharedPreferences.Editor editor = preferences.edit()
editor.putString("YOUR_TAG_NAME", "value")
editor.commit()
要从第二个片段的SharedPreferences中检索数据,请使用以下代码
public static final String MY_SHARED_PREFERENCES = "MySharedPrefs"
SharedPreferences myPreferences = getSharedPreferences(MY_SHARED_PREFERENCES , MODE_PRIVATE)
String restoredText = myPreferences.getString("YOUR_TAG_NAME", null)
或者
您还可以使用以下方法在片段之间传递数据,但这种方法有点繁琐,并且只在您需要在viewpager内的另一个片段中传输大量数据时才有帮助。
要将数据从第1个片段(假设为FirstFragment)传递到Viewpager内的第2个片段(假设为SecondFragment),请按照以下步骤操作。
步骤1:创建一个接口,其方法签名如下。
public interface ShareIt {
public void passIt(String data);
}
步骤2:SecondFragment需要实现ShareIt接口并重写passIt方法,并且您需要将传递自FirstFragment的数据存储在本地变量中。除此之外,我还会传递Viewpager的实例和Fragment的索引。 Viewpager的实例是findFragmentByTag方法所必需的参数。 因此,您的SecondFragment应如下所示。
public class SecondFragment extends Fragment implements ShareIt {
private NonSwipeableViewPager pager;
private int index;
private String string;
public static SecondFragment newInstance(int index, NonSwipeableViewPager viewPager) {
SecondFragment f = new SecondFragment();
Bundle args = new Bundle();
args.putSerializable("VP", viewPager);
args.putInt("index", index);
f.setArguments(args);
return f;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_second, container, false);
Bundle bundle = getArguments();
pager = (NonSwipeableViewPager) bundle.getSerializable("VP");
index = bundle.getInt("index");
return rootView;
}
@Override
public void passIt(String data) {
string = data;
Toast.makeText(getActivity(), "" + data, Toast.LENGTH_SHORT).show();
}
}
步骤三:现在我们需要在Viewpager中找到SecondFragment,就像这样:
Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + pager.getCurrentItem());
Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + 1);
我们已经获取了SecondFragment的实例,可以通过调用SecondFragment的passIt方法来传递数据,如下所示:
((SecondFragment)dataBoy).passIt("Hello..!!!!");
因此,你的FirstFragment将会像这样。
public class FirstFragment extends Fragment {
private Button btnNext;
private NonSwipeableViewPager pager;
private int index;
public static FirstFragment newInstance(int index, NonSwipeableViewPager viewPager) {
FirstFragment f = new FirstFragment();
Bundle args = new Bundle();
args.putSerializable("VP", viewPager);
args.putInt("index", index);
f.setArguments(args);
return f;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_first, container, false);
Bundle bundle = getArguments();
pager = (NonSwipeableViewPager) bundle.getSerializable("VP");
index = bundle.getInt("index");
btnNext = findViewById(R.id.btnNext);
Fragment frag= getActivity().getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + 1);
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((SecondFragment)frag).passIt("Hello..!!!!");
}
});
return rootView;
}
}