首页 > 解决方案 > 用户更改首选项后如何对 MainActivity 对象进行操作?

问题描述

目标:当用户更改设置中的偏好时,我想对主要活动采取行动。特别是我需要更改一个 HashMap。

问题:我找不到解决方案。我开始认为我的方法在上游是错误的。

主要活动

public class MainActivity extends AppCompatActivity {

    // db declaration //
    private SignalDatabase db;  

   private HashMap<Integer, String> RSSIcolorHmap ;





}

设置活动

public class SettingsActivity extends AppCompatActivity {

     public  static class MainSettingsFragment extends PreferenceFragmentCompat {

     public final static String KEY_ENABLE_BACKGROUND_UPDATE = "enable_background_update";
     public final static String KEY_ENABLE_LAST_KNOWN_LOCATION = "enable_last_known_location";
     public final static String KEY_DELETE_DB_DATA = "delete_db_data";
     public final static String KEY_CHANGE_MAP_COLOR ="change_map_color";

     private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
         // Load the Preferences from the XML file
         addPreferencesFromResource(R.xml.preferences);

         preferenceChangeListener = new 
        SharedPreferences.OnSharedPreferenceChangeListener() {
             @Override
             public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

                 if(key.equals(KEY_DELETE_DB_DATA))
                 {

                     String connectivityType = sharedPreferences.getString(key, null);
                     new DeleteAreaAsync(SignalAreaDatabase.getDatabase(getContext()), connectivityType).execute();

                 } else if(key.equals(KEY_CHANGE_MAP_COLOR)){

                     String gradientColor = sharedPreferences.getString(key, null);
                      /* I want to use this value to take action on MainActivity's HashMap. */

                }

            }
        };

    }

         }

    }

我尝试了什么

我已经阅读了这两个(无效)的想法:

#1 方法

SettingsActivity settingsActivity = (SettingsActivity)getActivity();
 MapsActivity mapsActivity = (MapsActivity) settingsActivity.getParent();

getParent()总是返回null。来自安卓开发者网站:

如果此视图是嵌入的子视图,则返回父 Activity 。

#方法2

 SettingsActivity settingsActivity = (SettingsActivity)getActivity();
     MapsActivity mapsActivity = (MapsActivity) settingsActivity.getCallingActivity();

但在这种情况下,getCallingActivity()返回一个ComponentName对象,我无法从中获取对相关 Activity 的引用。

问题:

1)这种方法在上游完全错误吗?如果是,我该如何解决?

2)如果没有,是否可以使上述两种方法之一起作用?

3)嵌入孩子究竟是什么意思?

标签: javaandroidandroid-fragmentsandroid-activity

解决方案


您的设计错误。您无法访问 SettingActivity MainSettingsFragment 中的 MainActivity 引用。Activity 旨在显示 UI,您需要将业务逻辑保留在 Activity 之外。如果您想在 Fragment 和父 Activity(Host Activity)之间进行通信,您可以使用接口方法。

如果您想在设置活动中访问 SignleDatabase 参考。创建 Helper 类以访问数据库引用。


推荐阅读