用户更改首选项后如何对MainActivity对象采取行动?

时间:2018-10-08 15:35:08

标签: java android android-fragments android-activity

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

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

MainActivity

public class MainActivity extends AppCompatActivity {

    // db declaration //
    private SignalDatabase db;  

   private HashMap<Integer, String> RSSIcolorHmap ;





}

SettingsActivity

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。在android开发者网站上:

  

如果该视图是嵌入式孩子,则返回父活动。

#METHOD2

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

但是在这种情况下,getCallingActivity()返回了一个ComponentName对象,我无法从该对象获得相对活动的引用。

问题:

1)这种方法在上游是否完全错误?如果可以,我该怎么解决?

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

3)嵌入子代到底是什么意思?

2 个答案:

答案 0 :(得分:0)

您需要使用startActivityForResult()才能使用.getCallingActivity()

...或向Bundle添加Intent,以传递活动名称。

ComponentName可与intent.setComponent(componentName)一起使用。

答案 1 :(得分:0)

您的设计错误。您无法访问SettingActivity MainSettingsFragment中的MainActivity参考。 活动是用于显示UI的,您需要将业务逻辑置于活动之外。如果要在片段活动和父活动(主机活动)之间进行通信,则可以使用界面方法。

如果要访问“设置活动”中的SignleDatabase参考。 创建Helper类以访问数据库引用。