目标是从一个
以下是关于MVVM的想法:
活动 (Activity)
如果你将
谢谢!
Fragment
获取信息,以便托管的Activity
可以展示它。让我们举一个简单的例子,假设当一个Fragment
改变时,我们想要在我们Activity
的操作栏中展示Fragment
的标题。
这是我以前的做法:
Activity
@Override
protected void onCreate( @Nullable Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
getSupportFragmentManager().addOnBackStackChangedListener( this );
}
@Override
public void onBackStackChanged( )
{
BaseFragment fragment = mNavigationManager.getCurrentFragment( );
if( fragment != null && fragment instanceof ActionBarProvider )
mActionBarTitle.setText( ( ( ActionBarProvider ) fragment ).getTitle( ) );
}
ActionBarProvider
public interface ActionBarProvider
{
String getTitle( );
}
碎片
// implements ActionBarProvider
@Override
protected String getTitle( )
{
return "Hello world";
}
以下是关于MVVM的想法:
活动 (Activity)
@Override
protected void onCreate( @Nullable Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
mViewModel = ViewModelProviders.of( this, mViewModelFactory ).get( MainViewModel.class );
mViewModel.getTitle( ).observe( this, s -> mActionBarTitle.setText( s ) );
}
主视图模型
private MutableLiveData< String > mTitle = new MutableLiveData<>( );
public MutableLiveData< String > getTitle( )
{
return mTitle;
}
public void setTitle( String title )
{
mTitle.postValue( title );
}
碎片
@Override
public void onActivityCreated( @Nullable Bundle savedInstanceState )
{
super.onActivityCreated( savedInstanceState );
MainViewModel viewModel = ViewModelProviders
.of( getActivity( ), mViewModelFactory )
.get( MainViewModel.class );
viewModel.setTitle( "hello world" );
}
MVVM看起来更干净,但它假设Fragment
知道它的主Activity
的ViewModel:
MainViewModel viewModel = ViewModelProviders
.of( getActivity( ), mViewModelFactory )
.get( MainViewModel.class );
如果你将
Fragment
移动到另一个Activity
,这种方法就不起作用了。我应该保持旧方式吗?或者你们有其他使用MVVM进行此类通信的方法吗?谢谢!
getActivity().setBottomNavigationVisibility(true/false);
吗? - Samuel Eminet