我面临着应用程序中数据相关性的一些问题。
在我们的应用中,我们有1个活动和许多片段。
例如,我们有1个片段与User列表和那里的按钮(有3个状态:none / like / favorite)。 在下一页中,我们也有User和like按钮的完整描述。 如果我们按下userList中的按钮,就没有问题,在详情屏幕中我们看到正确的状态。但是,如果我们点击用户详细信息中的按钮并返回列表,那么此处仍有过去的数据。
我们不能使用activityForResult因为片段。
我们使用rx,也许有一些方法可以轻松解决这个问题?
答案 0 :(得分:1)
为了重用Fragment
UI组件,您应该将每个组件构建为一个完全独立的模块化组件,以定义自己的布局和行为。然后,每个Fragment
都可以将数据传递给Activity
,而Activity
也可以将数据发送到Fragment
。
在您的情况下,Activity
可以保存实际数据。当用户修改详细信息Fragment
中的内容时,Fragment
应该将其与Activity
相关联。然后,Activity
会通知列表Fragment
。
答案 1 :(得分:0)
实际上,您可以对片段使用$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.airtable.com/v0/appQmOEr6c6AV4X47/foo');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Authorization: Bearer YOUR_API_KEY';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
方法。我在不同的项目中已经看过几次这种模式,由你来决定它是否适合你。
假设您的左侧片段为onActivityResult()
且您的右侧片段为AFragment
,这就是想法。
(1)在BFragment
中,在将事务从A提交到B之前设置目标片段:
AFragment
(2)提供Fragment bFragment = new BFragment();
bFragment.setTargetFragment(this, 42); // `this` is your AFragment instance
// transact here
:
onActivityResult()
(3)在BFragment中,在@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// your logic here
}
中准备数据并在目标上调用onDetach()
。
onActivityResult()
这样,每当@Override
public void onDetach() {
super.onDetach();
if (getTargetFragment() != null) {
Intent data = new Intent();
// pass your data here
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
}
}
弹回时,您的BFragment
都有机会处理其数据。
答案 2 :(得分:0)
我在应用程序中处理这种情况的方法是使用SharedPreferences的中央“存储库”来跨多个屏幕存储序列化数据。然后,每次创建或恢复新的Activity(或在您的情况下,Fragment)时,它都会进入序列化数据仓库以填充其共享数据。
这就是我想象这会对你的情况起作用的方式。要使用“用户”示例,我将创建一个SharedPreferences文件来存储我的用户数据对象列表。所以我会有一个课程,存储我需要知道的关于用户的所有信息 - 他们的信息,他们的“喜欢”状态等。
假设我在某个List中有用户,我只想用Gson序列化,并将序列化数据保存到我创建的SharedPreferences中。然后,每个片段只能轮询序列化数据以获得用户的当前状态。如果进行了一些更改,每个Fragment会将数据保存回相同的SharedPreferences文件,以便其他Fragment可以使用它来实例化其视图。
这是一些伪代码......
//Some kind of data class for User
class MyUser {
String name;
String location;
String likeStatus;
//... whatever else
}
然后,假设你有一个用户列表,我会序列化该列表并将其存储在像这样的全局SharedPreferences文件中......
//ArrayList<MyUser> users <- defined somewhere
Gson gson = new Gson();
String usersJson = gson.toJson(users);
SharedPreferences userPrefs = getSharedPreferences("users_storage", MODE_PRIVATE);
SharedPreferences.Editor editor = userPrefs.edit();
editor.putString("users_data_key", usersJson);
editor.apply();
然后当加载一个新的Fragment并且它需要知道用户的当前状态时,它只是打开SharedPreferences文件并获取这样的所有内容的当前状态......
SharedPreferences userPrefs = getSharedPreferences("users_storage", MODE_PRIVATE);
String usersJson = userPrefs.getString("users_data_key", null);
Type collectionType = new TypeToken<ArrayList<MyUser>>(){}.getType();
ArrayList<MyUser> users = gson.fromJson(usersJson, collectionType);
为了清楚起见,这种方法将在您的Activity中完成,当您启动新的Fragment时,您只需传入正确实例化所需的数据。然后,如果Fragment需要保存数据,它只需调用Activity的方法并将其传递给需要保存的数据,而Activity将执行上面的代码来保存它。