java - 用户更改首选项后如何对 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)嵌入孩子究竟是什么意思?
解决方案
您的设计错误。您无法访问 SettingActivity MainSettingsFragment 中的 MainActivity 引用。Activity 旨在显示 UI,您需要将业务逻辑保留在 Activity 之外。如果您想在 Fragment 和父 Activity(Host Activity)之间进行通信,您可以使用接口方法。
如果您想在设置活动中访问 SignleDatabase 参考。创建 Helper 类以访问数据库引用。
推荐阅读
- c - Return 语句是否应该在临界区之外?
- http - 使用 sim900 发送 get 或 post 请求时 Http 错误代码 400
- c# - Bootstrap Modal 不适用于 asp.net Web 应用程序
- visual-studio-code - 关于“git bash”和“VS 代码”
- flutter - 将 2 个表中的数据连接到一个类中
- c# - 无法运行 ios 模拟器或情节提要
- c# - C# 中有模拟 IntPredicate 吗?
- kotlin - 链式 kotlin 流取决于结果状态
- php - 警告:count():参数必须是在 C:\xampp\htdocs\m2\my booking.php 第 158 行实现 Countable 的数组或对象
- javascript - 将查询(Firestore)的月收入保存在本机反应中