Android BottomSheetFragment中的ModelView
我正在构建一个应用程序,希望在MainActivity中显示bottomSheetFragment。由于我在该片段中显示了一些数据(用户帐户详细信息等),所以我决定实现这一点的最佳方法是使用modelView 因此,我在主活动中设置数据,如下所示:Android BottomSheetFragment中的ModelView,android,Android,我正在构建一个应用程序,希望在MainActivity中显示bottomSheetFragment。由于我在该片段中显示了一些数据(用户帐户详细信息等),所以我决定实现这一点的最佳方法是使用modelView 因此,我在主活动中设置数据,如下所示: @Override protected void onStart() { // Initialize view model for bottom menu. bottomMenuData = ViewModelProviders.of
@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设置值。好吧,经过两天的努力,这很容易:)非常感谢你,先生!你让我开心!!