Android在Activity和Fragments之间传递数据

问题描述 投票:0回答:1

我的应用基础是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();

编码愉快!

android firebase google-login
1个回答
1
投票

如果你需要访问相同的数据,你不应该通过捆绑来传递它们。通过捆绑传递数据可能会减慢你的应用程序的速度(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)

0
投票

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

我希望这能帮助你


0
投票

尝试使用静态字段或接口。

在你的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数据将是空的。

© www.soinside.com 2019 - 2024. All rights reserved.