2 votes

getIntent.getExtras() ne retourne pas null mais n'a pas de valeurs.

La question est simple, je ne suis pas vraiment novice sur Android mais je n'arrive pas à retrouver les extras passés via une intention de l'activité A à l'activité B.

Voir l'activité A : il s'agit en fait d'un ListFragment, qui implémente onListItemClick() pour lancer une autre activité via une intention.

@Override 
public void onListItemClick(ListView l, View v, int position, long id) {
    Log.i("FragmentList", "Item clicked: " + id); 
    Intent i = new Intent(getActivity(), ExpandedTweetView.class);
    twitter4j.Status status = adapter.getItem(position);

    Bundle extras = new Bundle();
    extras.putString(KEY_TEXT, status.getText());
    extras.putString(KEY_HANDLE, status.getUser().getScreenName());
    extras.putString(KEY_NAME, status.getUser().getName());
    extras.putString(KEY_TIMESTAMPS, status.getCreatedAt().toString());
    extras.putLong(KEY_RETWEETS, status.getRetweetCount());

    i.putExtra(KEY_EXTRAS, extras);
    startActivity(i);
}

Cette partie fonctionne tout simplement, je l'ai testée en utilisant Log.v(TAG, "status.getText()" pour m'assurer que l'erreur ne provenait pas de l'interface utilisateur. Adaptateur passer un élément vide via getItem().

Voici le code de l'activité B :

public class ExpandedTweetView extends Activity {

TextView text;
TextView name;
TextView handle;
TextView createdAt;
TextView retweets;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.expanded_list_item);

    Bundle extras = getIntent().getExtras();

    ActionBar actionBar = getActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);

    text = (TextView) findViewById(R.id.h_content);
    name = (TextView) findViewById(R.id.h_name);
    handle = (TextView) findViewById(R.id.h_handle);
    createdAt = (TextView) findViewById(R.id.h_timestamp);
    retweets = (TextView) findViewById(R.id.h_retweet_count);

    if(extras != null) {
        text.setText(extras.getString(TimelineFragment.KEY_TEXT));
        name.setText(extras.getString(TimelineFragment.KEY_NAME));
        handle.setText(extras.getString(TimelineFragment.KEY_HANDLE));
        createdAt.setText(extras.getString(TimelineFragment.KEY_TIMESTAMPS));
        retweets.setText(String.valueOf(extras.getLong(TimelineFragment.KEY_RETWEETS)));
    }
}

Comme vous pouvez le voir, je crois que j'utilise le bon code pour obtenir les extras, l'utilisation du même code sur d'autres applications a fonctionné. Je ne sais pas pourquoi, lorsque l'ExpandedTweetView est créé via une intention, TOUTES les textViews sont vides. Voir : https://www.dropbox.com/s/pso6jbyn6rpks9n/empty_activity.png

Ce qui est encore plus étrange, c'est que j'avais d'abord essayé de vérifier si le paquet était nul en appelant ceci :

if (extras == null) {
Log.v(TAG, "Extras are empty :(");
}

Mais cette ligne n'a jamais été exécutée, ce qui signifie que le paquet n'est pas nul. J'ai également pensé que les clés utilisées pour récupérer les chaînes individuelles du paquet n'étaient peut-être pas les mêmes ; cependant, afin de remédier à cela, j'ai décidé de créer des constantes qui pourraient être utilisées des deux côtés. Comme vous pouvez le voir sur le code, la clé pour définir l'extra et la clé pour récupérer l'extra sont les mêmes.

Une idée de ce qui se passe ?

2voto

Sandy09 Points 1397
Bundle extras = getIntent().getExtras();
        if (extras != null) {
            extras = extras.getBundle("KEY_EXTRAS");
            String status = extras.getString("KEY_TEXT");
        }

1voto

saum22 Points 534

Essayez d'ajouter la variable supplémentaire à l'intention plutôt qu'à Bundle. Ex :

 i.putExtra(KEY_1, a);
 i.putExtra(KEY_2, b);
 i.putExtra(KEY_3, c); 

Ensuite, récupérez-le dans une autre activité de l'intention Ex :

  getIntent().getStringExtra(KEY_1) ;

1voto

Charan Points 752

Dans l'activité A :

    Intent i = new Intent(MainActivity.this, AnotherActivity.class);
    Bundle b = new Bundle();
    b.putString("thisc", "my name");
    i.putExtra("bundle", b);
    startActivity(i);

Dans l'activité B :

**Bundle bun = getIntent().getBundleExtra("bundle") ;

si (bun.containsKey("thisc")) {

Log.i("TAG", bun.getString("thisc"));

} else {

Log.i("TAG", "no thisc");

}**

Vérifiez la première ligne de code dans l'activité B, c'est le principale différence en fait !

0voto

Parag Ghetiya Points 166
//put value
    Intent inatent = new Intent(this,text.class);
    inatent_logo.putExtra("message","hello");
    startActivity(inatent);

//get vale
    String msg  = getIntent().getStringExtra("message").toString();

0voto

chintan khetiya Points 5941

Il est difficile de maintenir l'intention à l'ensemble et l'ensemble à l'intention si le nombre de données que vous voulez partager d'une activité à l'autre.

utiliser tout simplement l'Intent avec PuExtra() avec un argument différent.

vous pouvez passer un certain nombre de données dans l'intention comme :

Côté de l'expéditeur :

Créez votre intention.

Intent My_Intent = new Intent(FromClass.this,ToClass.class);

Ajoutez votre valeur que vous voulez partager avec d'autres activités.

My_Intent.putExtra("VAR_A",a_value);
My_Intent.putExtra("VAR_B",b_value);
My_Intent.putExtra("VAR_C",c_value);

Appelez votre intention.

StartActivity(My_Intent);

Côté récepteur :

Intent My_Intent = getIntent(); 
First_Value=My_Intent.getStringExtra("VAR_A");
Sec_Value=My_Intent.getStringExtra("VAR_B");
Thred_Value=My_Intent.getStringExtra("VAR_C");

Je pense qu'il est facile pour vous de manipuler vos données d'une activité à l'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X