【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

项目需求

在多个Activity或者Fragment中使用同一个ViewModel

需求实现

1.使用ActivityScope或FragmentScope

想在一个Activity或Fragment中共享ViewModel实例,可以使用ActivityScope或FragmentScope。这两种范围会根据它们所绑定的Activity或Fragment自动管理ViewModel实例的生命周期。

例如,创建一个继承自AndroidX库中的ViewModel类的MyViewModel实例,并将其分配给MainActivity和MyFragment:

public class MainActivity extends AppCompatActivity {
    
    
    private MyViewModel mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取ViewModel实例
        mViewModel = new ViewModelProvider(this).get(MyViewModel.class);
    }
}

public class MyFragment extends Fragment {
    
    
    private MyViewModel mViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
    
        View view = inflater.inflate(R.layout.fragment_my, container, false);

        // 获取ViewModel实例
        mViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);

        return view;
    }
}

注意,在MainActivity中,使用this作为ViewModelProvider的构造函数参数,而在MyFragment中,使用requireActivity()作为参数。这是因为Fragment需要使用其父Activity的范围来访问ViewModel实例。

2.使用ApplicationScope

如果想在整个应用程序中共享ViewModel实例,可以使用ApplicationScope。这种范围会在整个应用程序中自动管理ViewModel实例的生命周期。

例如,创建一个继承自AndroidX库中的ViewModel类的MyViewModel实例,并将其分配给整个应用程序:

public class MyApplication extends Application {
    
    
    private MyViewModel mViewModel;

    @Override
    public void onCreate() {
    
    
        super.onCreate();

        // 获取ViewModel实例
        mViewModel = new ViewModelProvider.AndroidViewModelFactory(this).create(MyViewModel.class);
    }

    public MyViewModel getViewModel() {
    
    
        return mViewModel;
    }
}

注意,在MyApplication中,我们使用了ViewModelProvider.AndroidViewModelFactory这个工厂来创建ViewModel实例。这个工厂需要一个Application对象作为构造函数参数。

然后可以在任何Activity或Fragment中,通过MyApplication实例获取ViewModel实例:

public class MainActivity extends AppCompatActivity {
    
    
    private MyViewModel mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取ViewModel实例
        MyApplication app = (MyApplication) getApplication();
        mViewModel = app.getViewModel();
    }
}

public class MyFragment extends Fragment {
    
    
    private MyViewModel mViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
    
        View view = inflater.inflate(R.layout.fragment_my, container, false);

        // 获取ViewModel实例
        MyApplication app = (MyApplication) requireActivity().getApplication();
        mViewModel = app.getViewModel();

        return view;
    }
}

注意,在MainActivity和MyFragment中,我们都使用了getApplication()方法来获取MyApplication实例,并从MyApplication实例中获取ViewModel实例。

总之,可以根据自己的需求选择合适的方法来共享ViewModel实例。

猜你喜欢

转载自blog.csdn.net/qq_43358469/article/details/130361027
今日推荐