Итак, у меня есть пользовательский класс SettingsPreferences
, в котором есть несколько методов, к которым я хочу получить доступ из своего класса Settings
(сгенерированного Android Studio) при изменении настройки в моем приложении.
В настоящее время я делаю это следующим образом:
Из класса моих настроек
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
final Preference audioCodec = findPreference("codec");
assert audioCodec != null;
audioCodec.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String audioInputValue = newValue.toString();
new SettingsPreferences().handleAudioCodecChange(audioInputValue);
return true;
}
}); ....
Из моего пользовательского класса
public void handleAudioCodecChange(String value) {
SharedPreferences.Editor codecEditor = settings.edit();
switch (value) {
case "1":
codecEditor.putInt("codec", 1);
codecEditor.apply();
break;
case "2":
codecEditor.putInt("codec", 2);
codecEditor.apply();
break;
case "3":
codecEditor.putInt("codec", 3);
codecEditor.apply();
break;
case "4":
codecEditor.putInt("codec", 4);
codecEditor.apply();
break;
case "5":
codecEditor.putInt("codec", 5);
codecEditor.apply();
break;
case "6":
codecEditor.putInt("codec", 6);
codecEditor.apply();
break;
case "7":
codecEditor.putInt("codec", 7);
codecEditor.apply();
break;
} ....
Однако способ получения файла настроек в других моих классах (показанный ниже) не работает.
// sharedPrefs for remembering settings
final static String PREFERENCES_NAME = "settingsFile";
SharedPreferences settings = null;
settings = getSharedPreferences(PREFERENCES_NAME, 0);
Я попытался исправить это, добавив нижеприведенный конструктор к своему пользовательскому классу:
public SettingsPreferences(Context context) {
settings = context.getSharedPreferences(PREFERENCES_NAME, 0);
}
Но для этого необходимо, чтобы я передал контекст для вызова класса в: new SettingsPreferences().handleAudioCodecChange(audioInputValue);
Если я добавлю getContext()
в этом виде, SettingsPreferences(getContext()).handleAudioCodecChange(audioInputValue);
, будет ли моя проблема исправлена? Он говорит, что getContext()
может быть нулевым.
Я включил ниже полный код для обоих классов на случай, если это необходимо.
Класс настроек
package com.voicerecorderproject;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
@RequiresApi(api = Build.VERSION_CODES.Q)
public class Settings extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
final Preference audioCodec = findPreference("codec");
assert audioCodec != null;
audioCodec.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String audioInputValue = newValue.toString();
new SettingsPreferences().handleAudioCodecChange(audioInputValue);
return true;
}
});
final Preference outputFormat = findPreference("outputFormat");
assert outputFormat != null;
outputFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String outputInputValue = newValue.toString();
new SettingsPreferences().handleOutputFormatChange(outputInputValue);
return true;
}
});
final Preference sampleRate = findPreference("sampleRate");
assert sampleRate != null;
sampleRate.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String sampleRateValue = newValue.toString();
new SettingsPreferences().handleSampleRateChange(sampleRateValue);
return true;
}
});
final Preference bitRate = findPreference("bitRate");
assert bitRate != null;
bitRate.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String bitRateValue = newValue.toString();
new SettingsPreferences().handleBitRateChange(bitRateValue);
return true;
}
});
}
}
}
НастройкиПреференс Класс
package com.voicerecorderproject;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import androidx.annotation.RequiresApi;
public class SettingsPreferences {
// sharedPrefs for remembering settings
final static String PREFERENCES_NAME = "settingsFile";
SharedPreferences settings = null;
settings = getSharedPreferences(PREFERENCES_NAME, 0);
@RequiresApi(api = Build.VERSION_CODES.Q)
public void handleBitRateChange(String bitRateValue) {
SharedPreferences.Editor bitEditor = settings.edit();
switch(bitRateValue) {
case "1":
bitEditor.putInt("bitRate", 1);
bitEditor.apply();
break;
case "2":
bitEditor.putInt("bitRate", 2);
bitEditor.apply();
break;
case "3":
bitEditor.putInt("bitRate", 3);
bitEditor.apply();
break;
case "4":
bitEditor.putInt("bitRate", 4);
bitEditor.apply();
break;
case "5":
bitEditor.putInt("bitRate", 5);
bitEditor.apply();
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
public void handleSampleRateChange(String sampleRateValue) {
SharedPreferences.Editor sampleEditor = settings.edit();
switch (sampleRateValue) {
case "1":
sampleEditor.putInt("sampleRate", 1);
sampleEditor.apply();
break;
case "2":
sampleEditor.putInt("sampleRate", 2);
sampleEditor.apply();
break;
case "3":
sampleEditor.putInt("sampleRate", 3);
sampleEditor.apply();
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
public void handleOutputFormatChange(String outputInputValue) {
SharedPreferences.Editor formatEditor = settings.edit();
switch (outputInputValue) {
case "1":
formatEditor.putInt("outputFormat", 1);
formatEditor.apply();
break;
case "2":
formatEditor.putInt("outputFormat", 2);
formatEditor.apply();
break;
case "3":
formatEditor.putInt("outputFormat", 3);
formatEditor.apply();
break;
case "4":
formatEditor.putInt("outputFormat", 4);
formatEditor.apply();
break;
case "5":
formatEditor.putInt("outputFormat", 5);
formatEditor.apply();
break;
case "6":
formatEditor.putInt("outputFormat", 6);
formatEditor.apply();
break;
case "7":
formatEditor.putInt("outputFormat", 7);
formatEditor.apply();
break;
case "8":
formatEditor.putInt("outputFormat", 8);
formatEditor.apply();
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
public void handleAudioCodecChange(String value) {
SharedPreferences.Editor codecEditor = settings.edit();
switch (value) {
case "1":
codecEditor.putInt("codec", 1);
codecEditor.apply();
break;
case "2":
codecEditor.putInt("codec", 2);
codecEditor.apply();
break;
case "3":
codecEditor.putInt("codec", 3);
codecEditor.apply();
break;
case "4":
codecEditor.putInt("codec", 4);
codecEditor.apply();
break;
case "5":
codecEditor.putInt("codec", 5);
codecEditor.apply();
break;
case "6":
codecEditor.putInt("codec", 6);
codecEditor.apply();
break;
case "7":
codecEditor.putInt("codec", 7);
codecEditor.apply();
break;
}
}
}