В моем приложении я использую Android Jetpack, а также компонент архитектуры навигации.Итак, теперь я хотел добавить свой фрагмент настроек с несколькими фрагментами настроек.Навигация пока работает нормально, и проблем нет - теперь я получил фрагмент настроек камеры, где пользователь может сделать некоторые настройки камеры.Дело в том, что теперь я хотел заполнить ListPreference
возможными разрешениями, которые обеспечивает камера устройства.Так что все мои установочные фрагменты должны использовать мой единственный SettingsViewModel
для хранения данных.Я думал, что мог бы сделать метод в своем SettingsViewModel для получения этих разрешений, но я не знаю, как получить CameraManager
, не нарушая ссылку на мою деятельность.
MainActivity.java
public class MainActivity extends AppCompatActivity implements
NavigationView.OnNavigationItemSelectedListener,
ActivityCompat.OnRequestPermissionsResultCallback,
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback{
...
@Override
public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
switch (pref.getTitle().toString()){
case "Camera":
Log.i(TAG, "camera settings selected");
navController.navigate(R.id.cameraSettingFragment);
}
return true;
}
CameraSettingFragment.java
public class CameraSettingFragment extends PreferenceFragmentCompat {
private static final String TAG = "CameraSettingFragment";
private SettingsViewModel mViewModel;
@Override
public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
setPreferencesFromResource(R.xml.camera_preferences, rootKey);
mViewModel = ViewModelProviders.of(this).get(SettingsViewModel.class);
setupCameraPreferences();
}
private void setupCameraPreferences() {
getPossibleFrameRateRanges();
getPossibleCameraResolutions();
}
private void getPossibleFrameRateRanges(){
final ListPreference listPreference = findPreference("framerate");
CharSequence[] entries = listPreference.getEntries();
if(entries == null){
mViewModel.getPossibleFrameRateRanges();
}
И моя ViewModel, где я хотел кое-что рассказать о характеристиках камеры
import static android.content.Context.CAMERA_SERVICE;
public class SettingsViewModel extends AndroidViewModel {
public SettingsViewModel(@NonNull Application application) {
super(application);
}
public void doAction() {
// depending on the action, do necessary business logic calls
}
public void getPossibleFrameRateRanges() {
// THIS LINE IS BUGGY AND NEEDS A FIX
CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);
}
}
Так как мне не нарушать эти строки:
Внимание : ViewModel никогда не должен ссылаться на представление, жизненный цикл или любой класс, который может содержать ссылку на контекст действия.
Или я пропустилчто-то?Заранее спасибо!