11
votes

Fragment Android GetArguments () renvoie null

comme le titre suggère.
J'ai téléchargé fragment code> code d'ici, http: // développeur.android.com/shareebles/training/fragmentbasics.zip .
C'est un exemple de fragment de Développeur officiel Android fort>. http://developer.android.com/training/basics/fragments/ Fragment-ui.html

Ceci est le MainActivity.java code> 'S Oncreate () Code>: P>

--------------------------------------
| MainActivity <-> HeadlinesFragment |
|      |                             |
|      |>> ArticlesFragment          |
--------------------------------------


7 commentaires

J'ai vérifié le code et getarguments () n'est pas null. Si le code ci-dessus est votre code actuel, je ne pense pas qu'il y a mal de mal. Sinon, vérifiez les variables?


@ TESLA1984: Sur quelle partie vous insérez votre code? dans les headlinesfragment.java ou ArméesFRAGMENT.JAVA? Parce que je place le getarguments () dans headlinesfragment.java, je reçois null. Merci.


Parfois, mon éclipse + adt échoue! .. J'ai besoin de nettoyer le projet et le retour ..


@Thamegowda: Merci pour votre contribution. Je le rechargez plusieurs fois, avec le même résultat. Cependant, je n'ai pas essayé avec les autres Version Adt.


J'ai parfois vu que l'utilisation de clés comme "catégorie" dans l'intention des extras ne fonctionnent pas, alors que l'utilisation de clés du format " .Category" fonctionne. Cela ne se produit que sur quelques téléphones et dans quelques scénarios seulement.


J'ai eu le même problème. On dirait que lorsque le fragment est gonflé dans le XML, les getArguments () renvoie NULL. Cependant, lorsque le fragment est appelé à l'intérieur du code d'activité, les getArguments () dans le fragment ne sont pas nuls.


J'ai eu un problème similaire, s'avère que je remplace la méthode des setarguments () et ne définissant pas les arguments


4 Réponses :


0
votes

On dirait que vous insérez une paire de clé et de valeur dans votre paquet. Vous devez probablement faire référence à la valeur clé comme dans getarguments (). GetString (catégorie);

Selon les documents pour PortString: insère une valeur de chaîne dans la mappage de ce faisceau, remplaçant toute valeur existante pour la clé donnée. La clé ou la valeur peut être nulle.

paramètres Touche une chaîne ou null Valeur une chaîne ou null


1 commentaires

String Catégorie = getArguments (). GetString ("catégorie"); vous voulez dire? L'ont essayé. Il montre une erreur et le programme fermera. Vous pouvez aussi lire ce QA. Je prends l'exemple de code Toast à partir de là [fragment getarguments () renvoie null] ( Stackoverflow.com/Questtions/14970790/... )



1
votes

Je l'ai résolu. On dirait que le seul moyen d'envoyer des données de MainActivity.java à headlinesfragment.java provient de rappels (si quelqu'un d'autre connaît d'autres moyens, veuillez contribuer, puis nous avons d'autres moyens à l'extérieur, aidant les autres personnes avec ce type de problème).

Le code principal de est MainActivity.java Fonction Bundle public GetBundle () {} code>, puis définissez la section code> interface code> sur la têtelinesfragment.java et ajouter public Bundle getBundle (); code> et dernier, appelez-le de la têteLinesfragment.java's onecreate code>. P>

Qu'est-ce qui me confondre est fragment.settarguments (getintent (). GetExtras ()); Code> sur MainActivity.java's Oncreate code>. Ils ont mis ce code là-bas et je croyais que cela fonctionnera parce que cela vient de Guide de développeur officiel Android et API STRUT> http://developer.android.com/training/basics/fragments/fragment-ui.html , mais cela n'a pas fonctionné (maintenant je crois que le morceau de le code ne fera rien). Ainsi, quiconque lisait le tutoriel ou l'échantillon à partir de là, prenez-le avec un grain de sel! P>

Codes ci-dessous, alors tout le monde peut le comprendre. p>

MainActivity.java strong>: p> xxx pré>

headlinesfragment.java strong>: p>

    /*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.example.android.fragments;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // The container Activity must implement this interface so the frag can deliver messages
    public interface OnHeadlineSelectedListener {
        /** Called by HeadlinesFragment when a list item is selected */
        public void onArticleSelected(int position);
        public Bundle getBundle();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle bundle = mCallback.getBundle();
        Toast.makeText(getActivity(), "headline fragment " + bundle, Toast.LENGTH_LONG).show();

        // We need to use a different list item layout for devices older than Honeycomb
        int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
                android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

        // Create an array adapter for the list view, using the Ipsum headlines array
        setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));

    }

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

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onStart() {
        super.onStart();

        // When in two-pane layout, set the listview to highlight the selected list item
        // (We do this during onStart because at the point the listview is available.)
        if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    }

    @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 = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Notify the parent activity of selected item
        mCallback.onArticleSelected(position);

        // Set the item as checked to be highlighted when in two-pane layout
        getListView().setItemChecked(position, true);
    }
}


2 commentaires

La méthode getarguments () ne sera pas null si vous définissez les arguments. et je ne vous suggère pas d'utiliser le rappel pour obtenir le Bundle .


@ TESLA1984: Veuillez lire ma question. Et le code. L'argument a été défini. Avez-vous essayé d'exécuter le code? Avec votre SETARGUMuments () et GetArguments () ? Au début, je pense que c'est comme ça, avec des getarguments (), mais j'avais tort. Oh, et si vous avez la solution qui fonctionne, veuillez le poster ci-dessous. Je vais accepter votre réponse si le code fonctionne et n'utilise pas de rappel.



10
votes

@Tonny

J'ai téléchargé le fragmentbasics.zip. Je ne change que le nom de l'argument. Voici le code et la photo de résultat.

MainAlactivité xxx

HeadLinesFragition xxx

Voici le résultat

Entrez la description de l'image ici


1 commentaires

Oui, on dirait que cela fonctionne lors de l'utilisation de la résolution <600px. S'il vous plaît essayez-le lorsque vous utilisez Nexus 7 Avd. Cause Bien sûr, nous voulons le même résultat lors de l'utilisation de la tablette ou du téléphone (> 600px et <600px). Merci



3
votes

J'ai eu le même problème, mais j'ai résolu :)

Mon problème était que j'avais le dans la disposition XML de l'activité. Par conséquent, l'Oncreate () du fragment a été appelé avant les appels en code Java, ne fixant donc pas les arguments.

J'ai supprimé le de ma présentation XML et que cela fonctionnait!


0 commentaires