2016-12-15 1 views
2

Comment va le flux?Comment obtenir des données du fragment à l'activité parent et le transmettre à l'activité de retour?

Activity 1 -----> Activity 2 (containing/inside) ------> Fragment

WHATI veulent atteindre?

Fragment (sends some data back to Activity 2) ----> Activity 2 (onBackPressed : collects that data & send it back to Activity 1) ---> Activity 1

Comment dois-je obtenir ci-dessus. Je ne veux vraiment pas utiliser de variables/constantes pour mettre en cache les données du fragment. Besoin de connaître une méthode intégrée pour gérer cela?

De plus,

  • Activité 2 charges Fragment à l'intérieur.
  • En onBackPressed, j'utilise setResult activité 2 pour faire passer des données standard en utilisant startActivityForResult de l'activité 1.
  • De plus, si j'écris une méthode à l'intérieur Fragment & appel d'activité 2 en utilisant ensuite en raison de cela à/FRO traiter un écran BLANC apparaît. Donc, vraiment ne veux pas écrire sa propre méthode & besoin de le gérer tout en laissant le fragment.
+0

Quel type de données voulez-vous envoyer? – Reena

+0

Supposons une valeur booléenne – VVB

+0

[Visitez ce lien. C'est pour le fragment mais peut vous aider] (http://stackoverflow.com/questions/40085608/how-to-pass-data-from-one-fragment-to-previous-fragment/40110415?noredirect=1#comment69484483_40110415) –

Répondre

0

Pour transmettre des données Activity 2-Activity 1 vous pouvez utiliser startActivityForResult() à Activity 1 pour commencer Activity 2 et onActivityResult() en Activity 1 pour recevoir ces données.

Pour transmettre des données Fragment-Activity 2, je vous suggère d'utiliser une comme l'interface

interface OnSomeDataListener { 
    void onSomeData(SomeData data); 
} 

Ensuite, mettre en œuvre une méthode setter pour cette interface à un fragment comme

public void setOnSomeDataListener(OnSomeDataListener listener) { 
    this.listener = listener; 
} 

Et puis en Activité, lors de l'instanciation d'un Fragment:

YourFragment fragment = new YourFragment(); 
fragment.setOnSomeDataListener(new OnSomeDataListener() { 
    void onSomeData(SomeData data) { 
     //return the result 
     Intent intent = new Intent(); 
     intent.putExtra("data", data); 
     setResult(RESULT_OK, intent); 
     finish(); 
    } 
} 

Et enfin, dans le fragment, quand vous voulez retourner des données à l'activité:

if(listener != null) { 
    listener.onSomeData(dataToReturn); 
} 
0

i acheived à la suite de façon

Dans setters d'écriture d'activité et getters

public String getFilePath() { 
    return filePath; 
} 
public void setFilePath(String filePath) { 
    this.filePath = filePath; 
} 
public String getFileName() { 
    return fileName; 
} 
public void setFileName(String fileName) { 
    this.fileName = fileName; 
} 

et Fragment

filePath = ((YourActivity) getActivity()).getFilePath(); 
fileName=((YourActivity) getActivity()).getFileName(); 

si vous utilisez le même fragment dans plus De 1 Activité Vous pouvez créer un constructeur de ce fragment et passer contexte et vérifier contexte dont l'activité

public class BookmarkFragment extends Fragment { 


private String filePath; 
private String fileName; 

Context contextCheckClass; 

public BookmarkFragment(Context ctx) { 

    this.contextCheckClass=ctx; 

} 

@SuppressLint("InflateParams") 
    @Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    group= (View)inflater.inflate(R.layout.fragment_bookmark, null); 

    if(contextCheckClass instanceof FirstReaderScreen){ 
    filePath = ((FirstReaderScreen) getActivity()).getFilePath(); 
    fileName=((FirstReaderScreen) getActivity()).getFileName();  
    // ispurchased=((FirstReaderScreen) getActivity()).isIspurchased(); 
    } 
    else if(contextCheckClass instanceof MainReaderScreen){ 
     filePath = ((MainReaderScreen) getActivity()).getFilePath(); 
     fileName=((MainReaderScreen) getActivity()).getFileName(); 
    // ispurchased=((MainReaderScreen) getActivity()).isIspurchased();  
    } 
    return group; 
} 

pour appeler fragment

BookmarkFragment bookmarkFragment=new BookmarkFragment(FirstReaderScreen.this); 
    getSupportFragmentManager() 
    .beginTransaction() 
    .add(R.id.LL_Fragment, bookmarkFragment)//LL_fragment is container 
    .addToBackStack(null) 
    .commit(); 
0

À partir de votre FirstActivity appeler la SecondActivity en utilisant la méthode startActivityForResult()

Intent i = new Intent(this, SecondActivity.class); 
startActivityForResult(i, 1); 

Dans votre secondActivity, définissez les données que vous souhaitez renvoyer à FirstActivity onBackPressed de SecondActivity.

@Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     Intent returnIntent = new Intent(); 
     returnIntent.putExtra("result",result); 
     returnIntent.putExtra("bool",true); 
     setResult(Activity.RESULT_OK,returnIntent); 
     finish(); 
    } 

maintenant dans votre classe FirstActivity écrire le code suivant pour la méthode onActivityResult().

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 1) { 
     if(resultCode == Activity.RESULT_OK){ 
      String result=data.getStringExtra("result"); 
      boolean bool = data.getBooleanExtra("bool"); 

     } 
     if (resultCode == Activity.RESULT_CANCELED) { 
      //Write your code if there's no result 
     } 
    } 
}// 

Pour envoyer des données de Fragment à l'activité Deuxièmement, vous pouvez utiliser le rappel d'interface

public interface sendDataListener 
    { 
     void sendData(boolean foo); 
    } 

Mettre en œuvre cet écouteur à la deuxième activité

0

Essayez de le faire:

public class MyFragment extends Fragment{ 
    private MyFragmentCommunicator myFragmentCommunicator; 
    .... 
    myFragmentCommunicator.sendDataToActivity(name, image, isSend); 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     myFragmentCommunicator = (MyFragmentCommunicator)activity; 
    } 
} 

puis déclarez votre interface:

public interface MyFragmentCommunicator{ 
    void sendDataToActivity(String name, String image, boolean isSend); 
} 

puis dans votre activité faire:

public class MyActivity extends AppCompatActivity implements MyFragmentCommunicator{ 

    @Override 
    public void sendDataToActivity(String name, String image, String price) { 
     //Manipulate the data 
    } 

} 

Hope it helps !!!

+0

'onAttach()' est obsolète – rookieDeveloper

+0

onAttach (Activité activité) est obsolète mais il peut utiliser celui avec Contexte –

1

Vous devez démarrer Activity2 avec startActivityForResult comme indiqué ci-dessous;

Intent i = new Intent(this, Activity2.class); 
startActivityForResult(i, requestCode); 

Et Activity2/fragment, vous devez terminer acitivité comme ci-dessous;

Intent returnIntent = new Intent(); 
returnIntent.putExtra("result",result); 
getActivity().setResult(Activity.RESULT_OK,returnIntent); 
getActivity().finish() 

Et obtenir le résultat dans Activity1 comme ci-dessous;

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (this.requestCode == requestCode) { 
     if(resultCode == Activity.RESULT_OK){ 
     //Get result 
     } 
    } 
} 

Espérons que cela aide.

+0

onActivityResult vous avez vérifié la condition if (requestCode == requestCode) Pourquoi faut-il le vérifier? ce sera toujours vrai – Redman

+1

Le premier paramètre est le requestCode dans startActivityForResult (i, requestCode); Donc, ça pourrait être comme ci-dessous; if (this.requestCode == requestCode) Nous vous remercions de votre avertissement. – oyenigun

+0

ok je l'ai eu, je suis content d'avoir demandé ça :) – Redman