1
我有一個Activity
它有一個保存詳細信息按鈕和一個Viewpager
其中包含4個片段。 Fragments
包含用戶詳細信息表單。一旦點擊按鈕,我需要從所有片段中獲取數據並保存細節。如何在活動中點擊保存按鈕時,如何獲取用戶輸入的所有4個片段中的數據?從viewpager片段獲取數據
我有一個Activity
它有一個保存詳細信息按鈕和一個Viewpager
其中包含4個片段。 Fragments
包含用戶詳細信息表單。一旦點擊按鈕,我需要從所有片段中獲取數據並保存細節。如何在活動中點擊保存按鈕時,如何獲取用戶輸入的所有4個片段中的數據?從viewpager片段獲取數據
我剛剛開發了一個具有相同用例的應用程序。另外,我還必須將數據保存在後導航中。我認爲這個問題有點困難,儘管應該是這樣。問題來自ViewPager中並非所有片段都保證存活的事實。它們要麼尚未啓動,要麼在用戶分頁時銷燬。
爲了解決這個問題,我從這個blog post獲得靈感來處理背壓事件。我不得不修改它以允許任何可能運行的碎片,而不僅僅是一個碎片。
public abstract class BackHandledFragment extends Fragment {
protected BackHandlerInterface backHandlerInterface;
public abstract String getTagText();
public abstract boolean onBackPressed();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(!(getActivity() instanceof BackHandlerInterface)) {
throw new ClassCastException("Hosting activity must implement BackHandlerInterface");
} else {
backHandlerInterface = (BackHandlerInterface) getActivity();
}
}
@Override
public void onResume() {
super.onResume();
backHandlerInterface.addRunningFragment(this);
}
@Override
public void onPause() {
super.onPause();
backHandlerInterface.removeRunningFragment(this);
}
public interface BackHandlerInterface {
public void addRunningFragment(BackHandledFragment backHandledFragment);
public void removeRunningFragment(BackHandledFragment backHandledFragment);
}
}
的活度實現接口並跟蹤活性片段:
public class EditActivity implements BackHandledFragment.BackHandlerInterface
{
private List<BackHandledFragment> listActiveFragments = new ArrayList<>
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Notify each active fragment that the back was pressed, this will allow
// them to save any data.
for (BackHandledFragment bf : listActiveFragments) {
bf.onBackPressed();
}
}
@Override
public void addRunningFragment(BackHandledFragment backHandledFragment) {
listActiveFragments.add(backHandledFragment);
}
@Override
public void removeRunningFragment(BackHandledFragment backHandledFragment) {
listActiveFragments.remove(backHandledFragment);
}();
}
每個片段必須延伸BackHandledFragment:
public class DetailNetworkFragment extends BackHandledFragment {
@Override
public void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
saveDataFields();
}
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public String getTagText() {
return TAG;
}
@Override
public boolean onBackPressed() {
saveDataFields();
return false;
}
}
的saveDataFields()不是太有趣。它只是將數據從UI視圖中複製出來並保存回Activity中的一個對象。