2017-05-16 3 views
0

J'essaie d'envoyer des données d'une activité à une autre via l'intention. Envoi Chaîne ou entier fonctionne parfaitement bien. Mais quand j'ajoute Parecelable objet dans la même intention, il retourne toujours null pour Strings, Entiers et objet. Voici mon code pour définir les données à l'intention.Passing Object renvoie null dans l'intention d'activité

Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("SomeText", "sometext"); 
intent.putExtra("itemId", itemId); 
intent.putExtra("someuser",user); 

startActivity(intent); 

Et dans d'autres activités que je reçois des valeurs comme:

String som = getIntent().getStringExtra("SomeText"); 
int itemird = getIntent().getIntExtra("itemId", 0); 
User user = getIntent().getParcelableExtra("someuser"); 

J'ai aussi essayé différentes autres solutions que this et this et this

Quelqu'un peut-il ici me suggérer ce que mon erreur est ou une meilleure solution?

C'est donc ma classe Parcelable

public class User implements Parcelable{ 
    private int mData; 
    private String username; 
    private String imagePath; 
    private String userId; 

    public String getUserId() { 
     return userId; 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setImagePath(String imagePath) { 
     this.imagePath = imagePath; 
    } 

    public String getImagePath() { 
     return imagePath; 

    } 

    public User() { 

    } 

    public User(String username, String userId) { 
     this.username = username; 
     this.userId = userId; 
    } 
    public User(String username) { 
     this.username = username; 
    } 
    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 

    } 

    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 
     public User createFromParcel(Parcel in) { 
      return new User(in); 
     } 

     public User[] newArray(int size) { 
      return new User[size]; 
     } 
    }; 

    private User(Parcel in) { 
     mData = in.readInt(); 
    } 

} 
+0

Vous pouvez rendre votre objet Java personnalisé implémentable Serializable et utiliser putExtra. Si cela n'a pas fonctionné, collez les journaux d'erreurs. –

+0

C'est probablement un problème avec l'implémentation des méthodes d'interface parcelable dans votre classe User. Pouvez-vous poster ces méthodes ici? – aravindsagar

+0

vous devez conserver toutes les propriétés dans 'writeToParcel' et les lire toutes dans le constructeur' User (Parcel in) 'voir ce lien pour améliorer ma moyenne http://stackoverflow.com/questions/21250339/how-to-pass- arraylistcustomeobject-from-one-activity-to-another/21250450 # 21250450 –

Répondre

0

Lire attentivement this réponse Jeremy Logan. Vous devez:

1) implémenter Parcelable pour votre classe User;

2) cast de classe pour votre classe User comme User user = (User) getIntent().getParcelableExtra("someuser") et intent.putExtra("someuser", (Parcelable)user).

+0

Mon objet Utilisateur est un objet Parcelable. –

+0

Vérifiez donc la méthode 'public static final Parcelable.Creator'. –

0

objet passe comme cette structure

Bundle b = new Bundle(); 
b.putParcelable("someuser",user); 
Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("SomeText", "sometext"); 
intent.putExtra("itemId", itemId); 
intent.putExtra(b); 
startActivity(intent); 

alors reçu comme celui-ci

Bundle b = getIntent().getExtras(); 
if(b != null) { 
User user = b.getParcelable("someuser"); 
} 
0

Créer une classe Parcelable

public class User implements Parcelable{ 

     String name; 


     @Override 
     public int describeContents() { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     /** 
     * Storing the User data to Parcel object 
     **/ 
     @Override 
     public void writeToParcel(Parcel dest, int flags) { 
      dest.writeString(name); 


     } 

     /** 
     * A constructor that initializes the User object 
     **/ 
     public User(String uName){ 
      this.name = uName; 

     } 

     /** 
     * Retrieving User data from Parcel object 
     * This constructor is invoked by the method createFromParcel(Parcel source) of 
     * the object CREATOR 
     **/ 
     private Student(Parcel in){ 
      this.mSName = in.readString(); 

     } 

     public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 

      @Override 
      public User createFromParcel(Parcel source) { 
       return new User(source); 
      } 

      @Override 
      public User[] newArray(int size) { 
       return new User[size]; 
      } 
     }; 
    } 

public class MainActivity extends Activity { 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

     mBtnOk.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        // Creating an instance of Student class with user input data 
        User userObj= new User ("Name"); 

        // Creating an intent to open the activity 
        Intent intent = new Intent(MainActivity.this, NextActivity.class); 

        // Passing data as a parecelable object to 
        intent.putExtra("user",userObj); 

        // Opening the activity 
        startActivity(intent); 
       } 
      }); 



    } 

    } 





    public class NextActivity extends Activity { 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_next); 

    // Fetching data from a parcelable object passed from MainActivity 
      User user= getIntent().getParcelableExtra("user"); 



    } 

    } 
+0

ont fait la même chose –

+0

@SairaNawaz vérifier votre classe dans votre méthode writeToParcel() dest.writeString (nom); ajoutez cette ligne dans votre code pour le nom et l'identifiant.! –

0

Essayez cette solution avec le changement de votre classe User comme ci-dessous ans il œuvres:

public class User implements Parcelable { 
private int mData; 
private String username; 
private String imagePath; 
private String userId; 

public String getUserId() { 
    return userId; 
} 

public void setUserId(String userId) { 
    this.userId = userId; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public void setImagePath(String imagePath) { 
    this.imagePath = imagePath; 
} 

public String getImagePath() { 
    return imagePath; 

} 

public User() { 
} 

public User(String username, String userId) { 
    this.username = username; 
    this.userId = userId; 
} 
public User(String username) { 
    this.username = username; 
} 
@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    dest.writeInt(mData); 
    dest.writeString(username); 
    dest.writeString(imagePath); 
    dest.writeString(userId); 
} 

private void readFromParcel(Parcel in) { 

    mData  = in .readInt(); 
    username = in .readString(); 
    imagePath = in .readString(); 
    userId = in .readString(); 
} 

public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 
    public User createFromParcel(Parcel in) { 
     return new User(in); 
    } 

    public User[] newArray(int size) { 
     return new User[size]; 
    } 
}; 

    private User(Parcel in) { 
     readFromParcel(in); 
    } 

} 
0

Je pense que vous n'avez pas implémenté votre classe de modèle utilisateur correctement. Vous pouvez essayer cette

public class User implements Parcelable { 

private int mData; 
private String username; 
private String imagePath; 
private String userId; 

public User(String username, String userId) { 
    this.username = username; 
    this.userId = userId; 
} 
public User(String username) { 
    this.username = username; 
} 
public User() {} // empty constructor 

public String getUserId() { 
    return userId; 
} 

public void setUserId(String userId) { 
    this.userId = userId; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public void setImagePath(String imagePath) { 
    this.imagePath = imagePath; 
} 

public String getImagePath() { 
    return imagePath; 

} 

@Override 
public int describeContents() { 
    return 0; 
} 
@Override 
public void writeToParcel(Parcel dest, int flags) { 

    dest.writeInt(mData); 
    dest.writeString(username); 
    dest.writeString(imagePath); 
    dest.writeString(userId); 
} 

private User(Parcel in) { 
    mData  = in.readInt(); 
    username = in.readString(); 
    imagePath = in.readString(); 
    userId = in.readString();. 
} 

public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 
    public User createFromParcel(Parcel in) { 
     return new User(in); 
    } 

    public User[] newArray(int size) { 
     return new User[size]; 
    } 
}; 

}

Puis dans votre activité Splash, vous pouvez le faire.Je suppose que vous avez créé un objet utilisateur à vouloir envoyer à MainActivity

Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("someuser",user); // using the (String name, Parcelable value) overload! 
intent.putExtra("SomeText", "sometext"); 
intent.putExtra("itemId", itemId); 
intent.putExtra(bundle); 

startActivity(intent); 

Vous pouvez ensuite recevoir dans MainActivity comme ce

User user = (User) getIntent().getParcelableExtra("someuser"); 
0

Salut pourquoi vous utilisez parcelable si sérialisable est facile à utiliser et facile à comprendre et à mettre en œuvre

mettre en œuvre sérialisable dans votre classe

public class Place implements Serializable { 
     private int id; 
     private String name; 

     public void setId(int id) { 
      this.id = id; 
     } 

     public int getId() { 
      return id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 

Ensuite, vous pouvez passer cet objet dans l'intention

 Intent intent = new Intent(this, SecondAct.class); 
    intent.putExtra("PLACE", Place); 
    startActivity(); 

dans la deuxième activité que vous pouvez obtenir des données comme celui-ci

Place place= (Place) getIntent().getSerializableExtra("PLACE"); 

parcelable est utilisé quand il y a de grandes données doivent envoyer d'autres sages vous pouvez utiliser sérialisable

Laissez-moi savoir si le travail ne