1

我有一個Activity它有一個保存詳細信息按鈕和一個Viewpager其中包含4個片段。 Fragments包含用戶詳細信息表單。一旦點擊按鈕,我需要從所有片段中獲取數據並保存細節。如何在活動中點擊保存按鈕時,如何獲取用戶輸入的所有4個片段中的數據?從viewpager片段獲取數據

回答

1

我剛剛開發了一個具有相同用例的應用程序。另外,我還必須將數據保存在後導航中。我認爲這個問題有點困難,儘管應該是這樣。問題來自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中的一個對象。