2017-05-16 47 views
0

我試圖通過意圖將數據從活動發送到其他人。發送字符串整數工作完好。但是,當我加入目的相同Parecelable對象時,它總是返回絃樂整數對象。以下是我將數據設置爲意圖的代碼。傳遞對象在活動意圖中返回null

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); 

而在其他活動我得到值:

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

我也嘗試過不同的其他解決方案thisthisthis

這裏任何人都可以給我建議我的錯誤是什麼或者更好的解決方案?

所以這是我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

您可以使自定義Java對象實現Serializable並使用putExtra。如果不起作用,請粘貼錯誤日誌。 –

+0

這可能是您的User類中的parcelable接口方法的實現問題。你可以在這裏發佈這些方法嗎? – aravindsagar

+0

你必須堅持'writeToParcel'中的所有屬性,並在構造函數'User(Parcel in)'中讀取所有屬性'看看這個鏈接,以獲得更好的我的意思http://stackoverflow.com/questions/21250339/how-to-pass- arraylistcustomeobject-one-activity-to-another/21250450#21250450 –

回答

0

仔細閱讀this答案Jeremy Logan。您應該:

1)爲您的User類實施Parcelable;

2)爲你的User類別鑄造類,如User user = (User) getIntent().getParcelableExtra("someuser")intent.putExtra("someuser", (Parcelable)user)。這樣的結構

+0

我的用戶對象是一個Parcelable對象。 –

+0

因此,檢查'公共靜態最終Parcelable.Creator'方法。 –

0

通行證對象

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); 

再接到類似這樣的

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

創建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

做過同樣的工作 –

+0

@SairaNawaz在你的writeToParcel()方法中檢查你的類 dest.writeString(name);在您的代碼中添加此行以獲取名稱和ID。 –

0

嘗試與改變這種解決方案您User類象下面ANS它作品:

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

我想你沒有正確實現你的用戶模型類。 您可以在飛濺的活動試試這個

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]; 
    } 
}; 

}

然後,你可以做到這一點。我假設你已經創建了一個用戶對象要發送到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); 

然後,您可以收到它在MainActivity這樣

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

嗨,爲什麼你使用parcelable如果序列化容易使用和易於理解和執行

實現串行你們班

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; 
     } 
    } 

然後你就可以在第二活動意圖

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

傳遞這個對象,你可以得到的數據是這樣

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

parcelable使用時,有大量的數據需要明智送其他的你可以使用序列化

讓我知道,如果不行

相關問題