1

Activity保存ボタン詳細ボタンとViewpagerの4つのフラグメントを含んでいます。 Fragmentsには、ユーザーの詳細フォームが含まれています。 ボタンをクリックすると、すべてのフラグメントからデータを取得し、詳細を保存する必要があります。アクティビティで保存ボタンをクリックしたときに、ユーザーが入力した4つのデータすべてを取得する方法は?ビューページのフラグメントからデータを取得

答えて

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ビューからデータをコピーし、アクティビティ内のオブジェクトに戻します。

関連する問題