Je suis assez nouveau dans l'utilisation de Fragments.
J'essaie juste de créer un exemple d'application simple qui utilise des fragments. Mon scénario est, j'ai deux activités avec un fragment à l'intérieur de chaque activité. Le premier fragment a un edittext et un bouton. Le deuxième fragment a une vue de texte. Lorsque j'entre un nom dans l'edittext et clique sur le bouton, la vue de texte dans le deuxième fragment doit afficher le nom entré dans l'edittext du premier fragment.
J'ai pu envoyer la valeur du premier fragment à son activité, puis de cette activité à la deuxième activité. Maintenant, comment utiliser cette valeur dans le deuxième fragment.
Voici le code Java :::
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Fragment_1 extends Fragment{
OnFragmentChangedListener mCallback;
// Container Activity must implement this interface
public interface OnFragmentChangedListener {
public void onButtonClicked(String name);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnFragmentChangedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);
final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);
btnSayHi_Fragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = edtxtPersonName_Fragment.getText().toString();
FragmentManager fm = getFragmentManager();
Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);
Activity activity = getActivity();
if(activity != null)
{
Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
}
if(f2 != null && f2.isInLayout())
{
f2.setName(name);
}
else
{
mCallback.onButtonClicked(name);
}
}
});
return view;
}
}
MainActivity.Java
package com.example.fragmentexample;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Choreographer.FrameCallback;
import android.view.Menu;
public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onButtonClicked(String name) {
// TODO Auto-generated method stub
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("", name);
startActivity(i);
}
}
SecondActivity.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Bundle b = getIntent().getExtras();
Fragment_2 f2 = new Fragment_2();
f2.setArguments(b);
}
}
Fragment_2.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment_2 extends Fragment{
View view;
TextView txtName;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
view = inflater.inflate(R.layout.fragment_fragment_2, container, false);
// Exception at this line
String name = getArguments().getString("message");
txtName = (TextView) view.findViewById(R.id.txtViewResult);
txtName.setText(name);
return view;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
}
public void setName(String name)
{
txtName.setText("Hi " + name);
}
}
J'obtiens l'exception suivante :::
04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713): at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 21 more
Comment obtenir la valeur du bundle de SecondActivity.java vers Fragment_2.Java?
la source
Réponses:
étape 1 .pour envoyer les données du fragment à l'activité
Étape 2. pour recevoir ces données dans l'activité:
étape 3 . pour envoyer des données d'une activité à une autre activité suivre l'approche normale
étape 4 pour recevoir ces données en activité
Étape 5. À partir de l'activité, vous pouvez envoyer des données à Fragment avec l'intention comme:
et pour recevoir en fragment dans la méthode Fragment onCreateView:
la source
bundle.putString("message", "From Activity");
Comme indiqué sur le site du développeur
la communication entre les fragments doit se faire via l'activité associée.
Ayons les composants suivants:
L'implémentation de FragmentA est:
La mise en œuvre de MainActivity est:
L'implémentation de FragmentB est:
J'espère que cela vous aidera.
la source
// Dans Fragment_1.java
// Dans Fragment_2.java
J'espère que cela vous aidera.
la source
putString
(ouputInt
) est la réponse!Depuis le site Web des développeurs :
Vous pouvez communiquer entre les fragments à l'aide de son activité. Vous pouvez communiquer entre l'activité et le fragment en utilisant cette approche.
Veuillez vérifier également ce lien.
la source
Tout d'abord, toutes les réponses sont correctes, vous pouvez transmettre les données à l'exception des objets personnalisés en utilisant
Intent
. Si vous souhaitez transmettre les objets personnalisés, vous devez implémenterSerialazable
ouParcelable
à votre classe d'objets personnalisés. J'ai trouvé que c'était trop compliqué ...Donc, si votre projet est simple, essayez d'utiliser
DataCache
. Cela fournit un moyen très simple de transmettre des données. Réf: Projet Github CachePot1- Réglez ceci sur Afficher ou Activité ou Fragment qui enverra des données
2- Obtenez des données n'importe où comme ci-dessous
la source
La dernière solution de transmission de données entre fragments peut être mise en œuvre à l'aide de composants architecturaux Android tels que ViewModel et LiveData. Avec cette solution, vous n'avez pas besoin de définir une interface pour la communication et pouvez bénéficier des avantages de l'utilisation de viewmodel comme la survie des données en raison des changements de configuration.
Dans cette solution, les fragments impliqués dans la communication partagent le même objet viewmodel qui est lié à leur cycle de vie d'activité. L'objet de modèle de vue contient un objet livingata. Un fragment définit les données à transmettre sur l'objet livingata et le second fragment observateurs a vécu les changements et a reçu les données.
Voici l'exemple complet http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel
la source
Passer des arguments entre les fragments. C'est assez tard pour répondre à cette question mais cela pourrait aider quelqu'un!
Fragment_1.java
Ensuite, dans votre,
Fragment_2.java
vous pouvez obtenir les paramètres normalement dans votreonActivityCreated
par exemplela source
Je pense qu'un bon moyen de résoudre ce problème est d'utiliser une interface personnalisée.
Disons que vous avez deux fragments (A et B) qui sont à l'intérieur de la même activité et que vous souhaitez envoyer des données de A à B.
Interface:
Activité:
Fragment A:
Fragment B:
la source
La communication entre les fragments est assez compliquée (je trouve le concept d'auditeurs un peu difficile à mettre en œuvre).
Il est courant d'utiliser un "bus d'événements" pour résumer ces communications. Il s'agit d'une bibliothèque tierce qui s'occupe de cette communication pour vous.
«Otto» est celui qui est souvent utilisé pour ce faire, et pourrait valoir la peine d'être consulté: http://square.github.io/otto/
la source
Passer des données d'un fragment à un autre fragment
Du premier fragment
Sur le deuxième fragment
la source
Cette implémentation simple permet de transmettre des données entre les fragments de manière simple. Vous pensez que vous souhaitez transmettre des données de «Frgment1» à «Fragment2»
Dans Fragment1 (définir les données à envoyer)
Dans la méthode Fragment2 onCreateView (obtenir les paramètres)
la source
Voie Kotlin
Utilisez une
SharedViewModel
proposition dans la documentation officielle de ViewModelCommencez par implémenter fragment-ktx pour instancier votre viewmodel plus facilement
Ensuite, il vous suffit de mettre dans le viewmodel les données que vous partagerez avec l'autre fragment
Ensuite, pour terminer, instanciez simplement votre viewModel dans chaque fragment et définissez la valeur de à
selected
partir du fragment dont vous souhaitez définir les donnéesFragment A
Et puis, écoutez simplement cette valeur à votre destination Fragment
Fragment B
Vous pouvez également le faire dans le sens inverse
la source
Solution 100% fonctionnelle: (si vous aidez, n'oubliez pas de voter pour)
Dans votre premier fragment, mettez ce morceau de code:
Dans Second Fragment, faites une méthode comme ci-dessous:
puis définissez une variable au niveau de la classe:
puis faites une autre méthode dans le second fragment pour définir la valeur:
la source
Vous pouvez atteindre votre objectif avec ViewModel et Live Data qui est effacé par Arnav Rao . Maintenant, je mets un exemple pour le clarifier plus nettement.
Tout d'abord, le supposé
ViewModel
est nomméSharedViewModel.java
.Ensuite, le fragment source est l'
MasterFragment.java
endroit d'où nous voulons envoyer une donnée.Et enfin, le fragment de destination est l'
DetailFragment.java
endroit où nous voulons recevoir les données.la source
OK après tant de fouilles ici, j'ai trouvé une solution simple, en fait, vous ne devriez jamais transmettre les données d'un fragment à un fragment, c'est toujours une mauvaise idée, vous pouvez transmettre les données du fragment A à l'activité et obtenir les données de l'activité dans le fragment B.
// dans l'activité principale
// maintenant dans FragmentB
la source
J'ai fait quelque chose de vraiment facile pour les débutants comme moi .. j'ai fait une vue de texte dans mon activity_main.xml et mis
puis j'obtiens cette vue de texte du premier fragment
puis dans le deuxième fragment j'obtiens la valeur
J'espère que ça aide!
la source