我的应用基础是Android提供的模板 "底部菜单导航"
我有一个用户登录的活动(用google),一旦用户登录,我有一个意向调用我的MainActivty。
在我的MainActivity中,我做了AppBarConfiguration,它与一个xml导航(基本上是3个片段)一起工作。当每个底部导航按钮被点击时,会显示不同的片段。
Android在Java文件夹中设置了一个ui包,在那里我们有3个fragment类以及它们的视图模型。
我想做的是,将登录的google值(即givenName和个人资料图片URL)传递给我的第一个片段(dashboard片段),当我的MainActivity被创建时,该片段被加载。
我在登录类中使用了Bundle,并在我的dashboard fragment类中的onActivityCreated中使用了bundle getString.问题是,当我的dashboard被显示时,我的Bundle是空的。
我假设数据在登录和dashboard fragment之间的某个地方丢失了,而MainActivity正在被创建。
我不相信我必须共享任何编码,我只需要知道如何在活动和片段之间正确共享数据,也许还有视图模型?
我的代码。
登录活动
Bundle bundle = new Bundle();
bundle.putString("GIVEN_NAME",loginItem.getGivenName());
bundle.putString("PERSON_EMAIL",loginItem.getEmail());
bundle.putString("PERSON_ID",loginItem.getmID());
bundle.putString("PERSON_PHOTO",loginItem.getPhotoUri().toString());
DashboardFragment fragment = new DashboardFragment();
fragment.setArguments(bundle);
DashboardFragment
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//Get login intent
Bundle bundle = this.getArguments();
if (bundle != null) {
personGivenName = bundle.getString("GIVEN_NAME","No Name");
personEmail = bundle.getString("PERSON_EMAIL","No Email");
personID = bundle.getString("PERSON_ID","NA");
personPhoto = Uri.parse(bundle.getString("PERSON_PHOTO",""));
}//if
}//onActivityCreated
如果有任何帮助,我将非常感激。
+++++++++++++++++++++++++++编辑 ++++++++++++++++++++++创建了一个新的类Singleton(名字wtv你喜欢)
public class SingletonUserInfo {
private String uID;
private String username;
private String uEmail;
private Uri uProfilePic;
//Singleton object
private static SingletonUserInfo INSTANCE = null;
// other instance variables can be here
private SingletonUserInfo() { };
public static SingletonUserInfo getInstance() {
if (INSTANCE == null) {
INSTANCE = new SingletonUserInfo();
}//if
return(INSTANCE);
}//getInstance
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getuID() {
return uID;
}
public void setuID(String uID) {
this.uID = uID;
}
public String getuEmail() {
return uEmail;
}
public void setuEmail(String uEmail) {
this.uEmail = uEmail;
}
public Uri getuProfilePic() {
return uProfilePic;
}
public void setuProfilePic(Uri uProfilePic) {
this.uProfilePic = uProfilePic;
}
}/class
然后通过这种方式从singleton中获取值。
SingletonUserInfo.getInstance().setuEmail(personEmail);
SingletonUserInfo.getInstance().getuEmail();
编码愉快!
如果你需要访问相同的数据,你不应该通过捆绑来传递它们。通过捆绑传递数据可能会减慢你的应用程序的速度(Parcing数据会降低性能)。相反,你可以尝试Singleton和ViewModels.For Examble的组合。
class LoginViewModel(
private val userController : Controller
): ViewModel() {
fun login(){
userController.downloadUsers()
}
//some code...
fun getUser(name: String): User{
return userController.findUser(name)
}
}
class DetailsScreenViewModel(
private val userController : Controller
): ViewModel() {
//some code...
fun getUser(name: String): User{
return userController.findUser(name)
}
}
/**
* Singleton class
*/
class Controller(){
private var users = mutableListOf<User>()
/**
* Download users from a server.
*/
fun downloadUsers(){
users.add(User("Super User"))
users.add(User("Good User"))
}
/**
* Find a user.
*/
fun findUser(name: String): User{
return users.find { it.name == name } ?: throw NoUserFound()
}
}
class NoUserFound(): Exception()
data class User(var name: String)
在activity中,你创建bundle,并将其作为参数分配给片段。
Bundle mbundle = new Bundle();
bundle.putString("key", "value");
Fragmentclass mfrag = new Fragmentclass();
mfrag.setArguments(mbundle);
然后你在片段的onCreateView中检索它。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String value = getArguments().getString("key");
return inflater.inflate(R.layout.fragment, container, false);
}
我希望这能帮助你
尝试使用静态字段或接口。
在你的Activity类中。
HashMap<T> pojoMap =new HashMap<>();
private void setYourPojo(){
//Add your data to HashMap
}
public static HashMap<T> getYourPojo(){
return pojoMap;}
然后从你的Fragment onCreateView中调用它。
HashMap<T> getYourData = Activity.getYourPojo();
注意:如果使用异步任务,应该使用Interface而不是静态HashMap。 但是如果你使用异步任务,你应该使用Interface而不是静态HashMap。否则你的HashMap数据将是空的。