Comment passer des Arguments à Fragment de l'Activité
J'ai une activité qui instancie et remplit un Fragment par l'intermédiaire d'un adoptant classe. Je veux transmettre des valeurs ou des objets de ce Fragment adoptant la classe afin que je puisse dicter la mise en page etc.
J'ai essayé en passant faisceaux à l'aide de la setArgument méthode, mais mon code bombes et ne savez pas pourquoi. Si je comprends bien, je peux recueillir le bundle de la méthode onCreate de l'adoptant classe. Je vois les arguments sont correctement réglés immédiatement après le code commenté, mais hélas, il se bloque et je ne comprends pas pourquoi. Si je supprime le bundle code il ne crash. 🙁
Ci-dessous mon code, quelqu'un sait où je devrais mettre le paquet code, commenté?
public class LoginScreen extends ActionBarActivity {
private final String ARG_SELECTED_LAYOUT_ID = "selectedLayoutId";
private final int DEFAULT_LAYOUT = R.layout.layout_list;
private int mSelectedLayoutId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
mSelectedLayoutId = DEFAULT_LAYOUT;
if (savedInstanceState != null) {
mSelectedLayoutId = savedInstanceState.getInt(ARG_SELECTED_LAYOUT_ID);
}
addLayoutTab(
actionBar, R.layout.layout_list, R.drawable.ic_list, "list");
addLayoutTab(
actionBar, R.layout.layout_grid, R.drawable.ic_grid, "grid");
addLayoutTab(
actionBar, R.layout.layout_staggered_grid, R.drawable.ic_staggered, "staggered");
addLayoutTab(
actionBar, R.layout.layout_spannable_grid, R.drawable.ic_spannable, "spannable");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARG_SELECTED_LAYOUT_ID, mSelectedLayoutId);
}
private void addLayoutTab(ActionBar actionBar, int layoutId, int iconId, String tag) {
ActionBar.Tab tab = actionBar.newTab()
.setText("")
.setIcon(iconId)
.setTabListener(new TabListener(layoutId, tag));
actionBar.addTab(tab, layoutId == mSelectedLayoutId);
}
public class TabListener implements ActionBar.TabListener {
private LayoutFragment mFragment;
private final int mLayoutId;
private final String mTag;
public TabListener(int layoutId, String tag) {
mLayoutId = layoutId;
mTag = tag;
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag);
if (mFragment == null) {
mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId);
ft.add(R.id.content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
/*
Bundle bundle = new Bundle();
bundle.putInt("noTiles", 4);
mFragment.setArguments(bundle);
*/
mSelectedLayoutId = mFragment.getLayoutId();
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
}
}
Logcat
03-03 11:56:53.675 32507-32507/weebuns.predictionking E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: weebuns.predictionking, PID: 32507
java.lang.RuntimeException: Unable to start activity ComponentInfo{weebuns.predictionking/weebuns.predictionking.LoginScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference
Ajouté le logcat 🙂
envoyer bundle lors de la création de l'instance:mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId,YourBundle);
je reçois Causés par: java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle " void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle) " sur un objet null erreur de référence
OriginalL'auteur Fearghal | 2015-03-03
Vous devez vous connecter pour publier un commentaire.
C'est difficile à dire sans voir le logcat, mais sûrement que vous êtes absent à l'appel de la
commit()
méthode sur laFragmentTransaction
. Aussi n'oubliez pas de définir les arguments pour le fragment avant d'appelerft.commit()
.Faire des progrès.....Nouvelle question: Processus: weebuns.predictionking, PID: 19902 java.lang.RuntimeException: Impossible de démarrer l'activité ComponentInfo{weebuns.predictionking/weebuns.predictionking.LoginScreen}: java.lang.IllegalStateException: s'engager déjà appelé. Je ne peux pas voir où il s'est engagé tbh
Donc, il semble que le
commit()
est appelée automatiquement par l'Activité, en effet, étant donné que c'est un parmeter deonTabSelected()
. Essayez le nouveau code que j'ai posté.🙁 retour à la version originale.... ...AndroidRuntime﹕ EXCEPTION FATALE: principaux Processus: weebuns.predictionking, PID: 26186 java.lang.RuntimeException: Impossible de démarrer l'activité ComponentInfo{....LoginScreen}: android.contenu.res.Ressources$NotFoundException: Resource ID #0x0 au com.android.interne.os.ZygoteInit.principale(ZygoteInit.java:694) Causés par: android.contenu.res.Ressources$NotFoundException: Resource ID #0 x 0
Dans ce cas, le problème pourrait être dans le fragment. Que faites-vous de l'argument passé?
OriginalL'auteur Morry
Pour passer des arguments à votre fragment, il est recommandé de créer une méthode statique publique de l'instancier votre fragment comme :
Et ensuite récupérer votre args dans
onCreateView()
méthode comme :Utiliser la méthode statique de l'instancier un nouveau fragment avec vos arguments dans d'autres fragment ou des activités comme :
OriginalL'auteur Bubu
D'Activité vous permet d'envoyer des données à l'intention de:
et du Fragment onCreateView méthode:
OriginalL'auteur Fahim
Dans votre activité
Dans votre Fragment.. dans onCreateView()
OriginalL'auteur Umer
Vous pouvez utiliser Bundle pour transférer des données d'activité à des fragments ou transfre des données à partir de fragment de fragment.
Où vous souhaitez recevoir ce paquet j'.w dans
DisplayDataList
Fragment de classe. Vous devez utilisergetArguments()
méthode.DisplayDataList
Espère que cela va vous aider.
Bundle code avant de remplacer ou d'ajouter de nouveaux fragment et assurez-vous que vous êtes de passage le bundle avec le fragment d'objet de remplacer le code.Essayez cette LayoutFragment mFragment = new LayoutFragment(); Bundle bundle = nouveau Bundle(); bundle.putInt("noTiles", 4); mFragment.setArguments(bundle); if (mFragment == null) { mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId); pi.ajouter(R. id.contenu, mFragment, mTag); } else { ft.attach(mFragment); }
J'obtiens l'erreur suivante: Causée par: java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle " void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle) " sur une référence d'objet nul
OriginalL'auteur Anuj Sharma