Вызов функции в другом классе в Android Java

#java #android #methods #sharedpreferences #preferences

#java #Android #методы #sharedpreferences #настройки

Вопрос:

Я искал ответ на этот вопрос и нашел ряд похожих вопросов, но ни один из них не казался достаточно похожим, и ни одно из решений, которые я нашел в Интернете, не решило проблему.

Для приложения для Android, которое я пишу, мне нужно сохранить настройки Android в базе данных. Для этого я хотел создать отдельный класс с функциями, которые я могу вызывать для синхронизации, обновления и т. Д. Настроек. Итак, это проблема

  • Вызов initiateSaveSettings() в классе syncSettings из MainActivity

То, как я пытаюсь сделать это сейчас, — это вызвать:

  syncSettings sync = new syncSettings();
 sync.initiateSettingSave();
  

В класс syncSettings:

 public class syncSettings extends Context {
      public void initiateSettingsSave(){
            PreferenceManager.setDefaultValues(syncSettings.this, R.xml.root_preferences, false);
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
      }
}
  

и т.д.
Проблема в том, что SharedPreferences требует расширенного контекста, и для того, чтобы это работало, Android Studio выдает ошибку для изменения syncSettings на

 public abstract class syncSettings extends Context {
  

Выполнение этого приводит к ошибке для new syncSettings() при вызове функции, удаление аннотации приводит к ошибке в классе syncSettings. Что я могу сделать, чтобы это сработало? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Заранее благодарю вас.

Редактировать: я очень новичок в разработке Android, поэтому, если я скажу или спрошу что-то глупое, вполне может быть, почему…

Комментарии:

1. Ваши предпочтения — это действие, в котором пользователь может выбирать вещи? как обычно работают приложения с обычными настройками?

2. Да, я использую действие настроек по умолчанию из Android Studio, но я хотел бы создать способ синхронизации этих настроек с базой данных при открытии приложения, потому что настройки, похоже, автоматически сохраняются локально.

3. Хорошо, я понимаю, итак, что вы хотите, это сохранить настройки в вашей удаленной базе данных за пределами устройства?

4. @josap97 Я думаю, что вы вызываете sync.initiateSettingSave(); метод из контекста (т.е. activity или service). Если я прав, то вам следует изменить метод как public void initiateSettingsSave(Context context) и удалить, который расширяет контекст. Теперь вы можете передать activity или service object, потому что оба являются дочерним классом Context. Просто вызовите sync.initiateSettingSave(this); из activity / service.

Ответ №1:

Попробуйте это:

 public class syncSettings {
         private Context context;

         public syncSettings(Context context){
             this.context = context;
         }
        
          public void initiateSettingsSave(){
                PreferenceManager.setDefaultValues(syncSettings.this, R.xml.root_preferences, false);
                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
          }
    }
  

И в вашей деятельности:

 syncSettings sync = new syncSettings(this);
 sync.initiateSettingSave();
  

Комментарии:

1. Спасибо, похоже, это работает. Мне действительно нужно устранить некоторые другие ошибки перед правильным тестированием, но, по крайней мере, Android Studio больше не злится :).

2. Да, это не окончательное решение вашей проблемы, это просто правильно получить экземпляр SharedPreferences, но теперь вам нужно принять эти значения и сохранить их в вашей удаленной базе данных.

Ответ №2:

Я не понимаю вашей причины расширения контекста Десять. Но вы можете использовать этот класс.

 import android.content.Context;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    
    public class PrefUtils {
    
        /**
         * Called to save supplied value in shared preferences against given key.
         * @param context Context of caller activity
         * @param key Key of value to save against
         * @param value Value to save
         */
        public static void saveToPrefs(Context context, String key, String value) {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
            final SharedPreferences.Editor editor = prefs.edit();
            editor.putString(key,value);
            editor.commit();
        }
    
        /**
         * Called to retrieve required value from shared preferences, identified by given key.
         * Default value will be returned of no value found or error occurred.
         * @param context Context of caller activity
         * @param key Key to find value against
         * @param defaultValue Value to return if no data found against given key
         * @return Return the value found against given key, default if not found or any error occurs
         */
        public static String getFromPrefs(Context context, String key, String defaultValue) {
            SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
            try {
                return sharedPrefs.getString(key, defaultValue);
            } catch (Exception e) {
                 e.printStackTrace();
                 return defaultValue;
            }
        }
         /**
         * 
         * @param context Context of caller activity
         * @param key Key to delete from SharedPreferences
         */
        public static void removeFromPrefs(Context context, String key) {
             SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
             final SharedPreferences.Editor editor = prefs.edit();
             editor.remove(key);
             editor.commit();
        }
    }