在片段之间发送数据
Send data between fragments
我已经使用本教程学习了如何在片段之间传递数据:
https://www.journaldev.com/14207/android-passing-data-between-fragments
如果我有两个片段,它会完美地工作。但是我的应用程序需要更多 (7) 个片段。这些片段是 tablayout 上的选项卡。当我在彼此相邻的两个选项卡之间来回切换时,这很好。但是,一旦我从 tab0 切换到更远的选项卡 (tab5),发送消息,然后在 tab0 上检查它,EditText 就会恢复其原始值。
当我更改 EditText 的值时,我更改了选项卡标题的值。它会正确更新。 (我从 tab0 转到 tab5,发送消息,tab0 的标题发生变化,因此收到了消息。)但是当我回到 tab0 时,它又变回了它的原始值(还有它的标签标题,但这是正确的工作) .
就像发生了所需的更改,但是当我切换回来时,它又恢复了原始值。跟destroying和savedInstances有关系吗?如何摆脱这个?
在STab.java
中(标签的代码):
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
SD = (SendData) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException("Error in retrieving data. Please try again");
}
}
interface SendData {
void setStructureBonusTileSpinner(int position, int currentTabNumber);
}
protected void setStructureBonusTileSpinner(int position){
spinnerStructureBonusTile.setSelection(position);
}
同样在STab.java
,在onViewCreated方法中:
spinnerStructureBonusTile.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
SD.setStructureBonusTileSpinner(spinnerStructureBonusTile.getSelectedItemPosition(), tabNumber);
}
});
在实现STab.SendData
的MainActivity.java
中:
@Override
public void setStructureBonusTileSpinner(int position, int currentTabNumber) {
for(int i = 0; i < mSectionsPagerAdapter.getCount(); i++){
if(i != currentTabNumber) {
String tag = "android:switcher:" + R.id.container + ":" + i;
STab f = (STab) getSupportFragmentManager().findFragmentByTag(tag);
if(f != null){
f.setStructureBonusTileSpinner(position);
}
}
}
}
如果您将数据从片段 A 传输到片段 B,请执行以下操作。
1.Fragment A -> 基础 Activity -> 片段 B(不推荐)
您可以使用 parent activity 传输数据。
2.Using 捆绑对象。
public static Fragment newInstance(String param1, String param2) {
BlankFragment fragment = new BlankFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
默认情况下,屏幕外页面限制设置为 1,因此您所说的两个相邻片段之外的片段将从适配器重新创建。
如果您不打算执行繁重的任务,只需更改该限制就足够了。
mViewPager.setOffScreenPageLimit(fragmentCount - 1)
PD:作为提示,您的选项卡永远不要超过 3 个,如果您能想到更好的方法而不是这个会更好。
PD2:你还应该post相关代码
我已经使用本教程学习了如何在片段之间传递数据:
https://www.journaldev.com/14207/android-passing-data-between-fragments
如果我有两个片段,它会完美地工作。但是我的应用程序需要更多 (7) 个片段。这些片段是 tablayout 上的选项卡。当我在彼此相邻的两个选项卡之间来回切换时,这很好。但是,一旦我从 tab0 切换到更远的选项卡 (tab5),发送消息,然后在 tab0 上检查它,EditText 就会恢复其原始值。
当我更改 EditText 的值时,我更改了选项卡标题的值。它会正确更新。 (我从 tab0 转到 tab5,发送消息,tab0 的标题发生变化,因此收到了消息。)但是当我回到 tab0 时,它又变回了它的原始值(还有它的标签标题,但这是正确的工作) .
就像发生了所需的更改,但是当我切换回来时,它又恢复了原始值。跟destroying和savedInstances有关系吗?如何摆脱这个?
在STab.java
中(标签的代码):
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
SD = (SendData) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException("Error in retrieving data. Please try again");
}
}
interface SendData {
void setStructureBonusTileSpinner(int position, int currentTabNumber);
}
protected void setStructureBonusTileSpinner(int position){
spinnerStructureBonusTile.setSelection(position);
}
同样在STab.java
,在onViewCreated方法中:
spinnerStructureBonusTile.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
SD.setStructureBonusTileSpinner(spinnerStructureBonusTile.getSelectedItemPosition(), tabNumber);
}
});
在实现STab.SendData
的MainActivity.java
中:
@Override
public void setStructureBonusTileSpinner(int position, int currentTabNumber) {
for(int i = 0; i < mSectionsPagerAdapter.getCount(); i++){
if(i != currentTabNumber) {
String tag = "android:switcher:" + R.id.container + ":" + i;
STab f = (STab) getSupportFragmentManager().findFragmentByTag(tag);
if(f != null){
f.setStructureBonusTileSpinner(position);
}
}
}
}
如果您将数据从片段 A 传输到片段 B,请执行以下操作。
1.Fragment A -> 基础 Activity -> 片段 B(不推荐) 您可以使用 parent activity 传输数据。 2.Using 捆绑对象。
public static Fragment newInstance(String param1, String param2) {
BlankFragment fragment = new BlankFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
默认情况下,屏幕外页面限制设置为 1,因此您所说的两个相邻片段之外的片段将从适配器重新创建。
如果您不打算执行繁重的任务,只需更改该限制就足够了。
mViewPager.setOffScreenPageLimit(fragmentCount - 1)
PD:作为提示,您的选项卡永远不要超过 3 个,如果您能想到更好的方法而不是这个会更好。
PD2:你还应该post相关代码