Android BottomSheetFragment中的ModelView

Android BottomSheetFragment中的ModelView,android,Android,我正在构建一个应用程序,希望在MainActivity中显示bottomSheetFragment。由于我在该片段中显示了一些数据(用户帐户详细信息等),所以我决定实现这一点的最佳方法是使用modelView 因此,我在主活动中设置数据,如下所示: @Override protected void onStart() { // Initialize view model for bottom menu. bottomMenuData = ViewModelProviders.of

我正在构建一个应用程序,希望在MainActivity中显示bottomSheetFragment。由于我在该片段中显示了一些数据(用户帐户详细信息等),所以我决定实现这一点的最佳方法是使用modelView

因此,我在主活动中设置数据,如下所示:

@Override
protected void onStart() {
    // Initialize view model for bottom menu.
    bottomMenuData = ViewModelProviders.of(this).get(BottomMenuData.class);
    bottomMenuData.setGoogleSignInAccount(CurrentGmailAccount);
    ...
}
// Observe google account.
bottomMenuData.getGoogleSignInAccount().observe(getViewLifecycleOwner(), googleSignInAccount -> {
    // Load image.
    Glide.with(account_image)
         .load(googleSignInAccount.getPhotoUrl())
         .apply(new RequestOptions()
         .placeholder(R.drawable.sample_image_profile))
         .into(account_image);

         // Set other account details.
         account_name.setText(googleSignInAccount.getDisplayName());
         account_email.setText(googleSignInAccount.getEmail());
});
现在,我观察到bottomSheetFragment中的值发生了变化,如下所示:

@Override
protected void onStart() {
    // Initialize view model for bottom menu.
    bottomMenuData = ViewModelProviders.of(this).get(BottomMenuData.class);
    bottomMenuData.setGoogleSignInAccount(CurrentGmailAccount);
    ...
}
// Observe google account.
bottomMenuData.getGoogleSignInAccount().observe(getViewLifecycleOwner(), googleSignInAccount -> {
    // Load image.
    Glide.with(account_image)
         .load(googleSignInAccount.getPhotoUrl())
         .apply(new RequestOptions()
         .placeholder(R.drawable.sample_image_profile))
         .into(account_image);

         // Set other account details.
         account_name.setText(googleSignInAccount.getDisplayName());
         account_email.setText(googleSignInAccount.getEmail());
});
我尝试如下初始化viewModel:

@Override
public void onAttach(@NonNull Context context) {
    bottomMenuData = ViewModelProviders.of(getActivity()).get(BottomMenuData.class);
    super.onAttach(context);
}
问题是我在这里遇到了一个异常,即我尝试在onCreateView()之前获取活动。片段的生命周期表示在onCreateView()之后运行onAttach。我也尝试初始化viewModel onViewCreated(),但代码从未在那里执行过!我读了几乎整个互联网,但不能使它的工作

感谢您的帮助

编辑: 这是my viewModel的源代码:

public class DataModel extends ViewModel {
    /** The current gmail account. */
    private MutableLiveData<GoogleSignInAccount> currentGmailAccount = new MutableLiveData<>();
    /** List containing messages history. */
    private MutableLiveData<List<MsgModel>> messagesList = new MutableLiveData<>();
    /** Listener to invoke callbacks for item clicks. */
    private MutableLiveData<SettingsListener> settingsListener = new MutableLiveData<>();
    /** Defines if it is the first run (first onCreate). */
    boolean firstRun = true;

    /**
     * Add a new message to messages list.
     * @param message Message to add.
     */
    void AddMessage(MsgModel message) {
        // Make sure list is initialized.
        if (messagesList.getValue() == null) messagesList.setValue(new ArrayList<>());

        // Add new message.
        messagesList.getValue().add(message);
    }

    /**
     * Defines how many messages are in the messages list.
     * @return The count of the messages in the messages list.
     */
    int MessagesSize() {
        // Make sure list is initialized.
        if (messagesList.getValue() == null) messagesList.setValue(new ArrayList<>());

        return  messagesList.getValue().size();
    }

    /**
     * Get current gmail account as set from {@Link MainActivity}.
     * @return Current gmail account. May be null if requested before set.
     */
    GoogleSignInAccount GetCurrentGmailAccount() {
        return currentGmailAccount.getValue();
    }

    @NonNull
    public MutableLiveData<GoogleSignInAccount> GetGoogleSignInAccount() {
        return currentGmailAccount;
    }

    void SetGoogleSignInAccount(GoogleSignInAccount googleSignInAccount) {
        this.currentGmailAccount.setValue(googleSignInAccount);
    }

    @NonNull
    public SettingsListener GetSettingsListener() {
        return settingsListener.getValue();
    }

    void SetSettingsListener(SettingsListener settingsListener) {
        this.settingsListener.setValue(settingsListener);
    }

    @NonNull
    MutableLiveData<List<MsgModel>> GetMessagesList() {
        // Make sure list is initialized.
        if (messagesList.getValue() == null) messagesList.setValue(new ArrayList<>());

        return messagesList;
    }
}
公共类数据模型扩展了ViewModel{
/**当前的gmail帐户*/
private MutableLiveData currentGmailAccount=new MutableLiveData();
/**包含消息历史记录的列表*/
私有MutableLiveData messagesList=新的MutableLiveData();
/**侦听器为项目单击调用回调*/
私有MutableLiveData settingsListener=新的MutableLiveData();
/**定义它是否是第一次运行(第一次创建)*/
布尔值firstRun=true;
/**
*将新邮件添加到邮件列表。
*@param要添加的消息。
*/
void AddMessage(MsgModel消息){
//确保列表已初始化。
if(messagesList.getValue()==null)messagesList.setValue(new ArrayList());
//添加新消息。
messagesList.getValue().add(消息);
}
/**
*定义消息列表中的消息数。
*@返回消息列表中的消息计数。
*/
int MessagesSize(){
//确保列表已初始化。
if(messagesList.getValue()==null)messagesList.setValue(new ArrayList());
返回消息list.getValue().size();
}
/**
*从{@Link MainActivity}获取当前gmail帐户设置。
*@返回当前gmail帐户。如果在设置之前请求,则可能为空。
*/
GoogleSignInAccount GetCurrentGmail帐户(){
返回currentGmailAccount.getValue();
}
@非空
public MutableLiveData GetGoogleSignInAccount(){
返回currentGmailAccount;
}
无效设置GoogleSignInAccount(GoogleSignInAccount GoogleSignInAccount){
this.currentGmailAccount.setValue(googleSignInAccount);
}
@非空
公共设置侦听器GetSettingsListener(){
返回settingsListener.getValue();
}
无效设置设置侦听器(设置侦听器设置侦听器){
此.settingsListener.setValue(settingsListener);
}
@非空
MutableLiveData GetMessagesList(){
//确保列表已初始化。
if(messagesList.getValue()==null)messagesList.setValue(new ArrayList());
返回消息列表;
}
}
getActivity()在片段准备过程中和准备就绪时可以为null。将ViewModel引用/实例创建移动到[onActivityCreated][1]

[1] :,如下图所示

void onActivityCreated (Bundle savedInstanceState) {
    bottomMenuData = 
ViewModelProviders.of(getActivity()).get(BottomMenuData.class);

}

post your BottomMenuData classIt是一个扩展ViewModel的简单类。这门课没什么特别的。在主要活动中,它就像一个符咒。我可以在模型中设置值。问题是我不知道如何使它在BottomSheetFragment类中工作。您是否在setGoogleSignInAccount(CurrentGmailAccount)方法内的livedata中设置值?Current account是从MainActivity设置的,fragment只是观察此帐户上的数据更改。Observer用于更新对话框中视图上的帐户设置。我了解buddy:)。只需发布您的视图模型类。我猜你没有给livedata设置值。好吧,经过两天的努力,这很容易:)非常感谢你,先生!你让我开心!!