目标:当用户更改设置的偏好时,我想对主要活动进行操作。 特别是我需要更改一个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)嵌入子代到底是什么意思?
答案 0 :(得分:0)
您需要使用startActivityForResult()
才能使用.getCallingActivity()
...或向Bundle
添加Intent
,以传递活动名称。
ComponentName
可与intent.setComponent(componentName)
一起使用。
答案 1 :(得分:0)
您的设计错误。您无法访问SettingActivity MainSettingsFragment中的MainActivity参考。 活动是用于显示UI的,您需要将业务逻辑置于活动之外。如果要在片段活动和父活动(主机活动)之间进行通信,则可以使用界面方法。
如果要访问“设置活动”中的SignleDatabase参考。 创建Helper类以访问数据库引用。