共享元素更新图片来源
Shared element update image source
我正在使用 androidx 导航组件。在 FragmentA 中,我有一个带卡片的回收站视图。这些卡片包含一个图像和一个赞按钮。当用户喜欢内容时,点赞按钮资产会发生变化。
此卡片内容是包含在 RecyclerViews.ViewHolder 布局中的单独布局:
<MaterialCardView>
<include layout="@layout/item_main_content_layout" />
</MaterialCardView>
和上面包含的 item_layout:
<merge>
<LinearLayout
android:id="@+id/content"
android:transitionName="content">
<ImageView
android:id="@+id/image"/>
<ImageView
android:id="@+id/like"/>
</LinearLayout>
</merge>
在适配器中绑定视图持有者期间,我使用唯一 ID 动态更新 transitionName
。
FragmentB 包含了相同的布局,在创建视图时,我用传递的项目更新了转换名称。
当通过单击项目从 FragmentA -> FragmentB 导航时,共享转换按预期工作。当我弹出堆栈时,它会按预期返回到列表中的原始位置。
问题
如前所述。当我 like/dislike 内容时,点赞按钮的资产发生变化。当我打开 FragmentB 时,类似 ImageView
中的资产被保留。但是当我改变状态时,我改变了 FragmentB 中的类似按钮的资产并弹出堆栈,转换发生但按钮资产切换回 [=] 中的起始资产23=]片段A。
如何在弹出堆栈时保留共享元素中的 src
可绘制对象?
昨天遇到了类似的问题,但是工具栏上有“赞”按钮。
我在主 activity 中使用了一个静态数组列表,每个点赞按钮将组件的 ID 添加到数组中,不喜欢从所述数组中删除该 ID。
所以我这样处理“喜欢”的压力:
case R.id.action_favorite:
pressed = !pressed;
// user pressed the heart icon
if(pressed)
{
item.setIcon(R.drawable.liked);
MainActivity.favs.add(ID);
}
else if(!pressed)
{
item.setIcon(R.drawable.unliked);
MainActivity.favs.remove(Integer.valueOf(ID));
}
return true;
在开始渲染每个 activity(一个可以喜欢或不喜欢的组件)时,我检查了组件 ID 是否在该静态数组中:
if(!MainActivity.favs.isEmpty())
{
if (MainActivity.favs.contains(ID))
{
pressed = true;
}
}
这样一来,喜欢的组件 activity 总是会以正确的“喜欢”图标恢复。
希望这能以任何方式帮助...
我忘了说 FragmentA 是 MVI 而 FragmentB 是 MVVM。这意味着 FragmentA 是根据我在其呈现器中减少的视图状态呈现的。接收数据的适配器与片段没有紧密耦合,因此它不知道数据更改。
当数据库中的项目发生某些更新时,我向我的演示者添加了一个额外的事件来更新视图状态。当用户恢复 FragmentA 时,它会呈现视图状态。 ViewState 现在包含更新的项目,我通过将更新的项目传递给适配器来相应地处理这种情况(传递新数据时类似)。现在两个 ViewHolder 的数据是相同的,当从 FragmentB -> FragmentA 返回时,我喜欢的状态被保留。
我正在使用 androidx 导航组件。在 FragmentA 中,我有一个带卡片的回收站视图。这些卡片包含一个图像和一个赞按钮。当用户喜欢内容时,点赞按钮资产会发生变化。 此卡片内容是包含在 RecyclerViews.ViewHolder 布局中的单独布局:
<MaterialCardView>
<include layout="@layout/item_main_content_layout" />
</MaterialCardView>
和上面包含的 item_layout:
<merge>
<LinearLayout
android:id="@+id/content"
android:transitionName="content">
<ImageView
android:id="@+id/image"/>
<ImageView
android:id="@+id/like"/>
</LinearLayout>
</merge>
在适配器中绑定视图持有者期间,我使用唯一 ID 动态更新 transitionName
。
FragmentB 包含了相同的布局,在创建视图时,我用传递的项目更新了转换名称。
当通过单击项目从 FragmentA -> FragmentB 导航时,共享转换按预期工作。当我弹出堆栈时,它会按预期返回到列表中的原始位置。
问题
如前所述。当我 like/dislike 内容时,点赞按钮的资产发生变化。当我打开 FragmentB 时,类似 ImageView
中的资产被保留。但是当我改变状态时,我改变了 FragmentB 中的类似按钮的资产并弹出堆栈,转换发生但按钮资产切换回 [=] 中的起始资产23=]片段A。
如何在弹出堆栈时保留共享元素中的 src
可绘制对象?
昨天遇到了类似的问题,但是工具栏上有“赞”按钮。 我在主 activity 中使用了一个静态数组列表,每个点赞按钮将组件的 ID 添加到数组中,不喜欢从所述数组中删除该 ID。 所以我这样处理“喜欢”的压力:
case R.id.action_favorite:
pressed = !pressed;
// user pressed the heart icon
if(pressed)
{
item.setIcon(R.drawable.liked);
MainActivity.favs.add(ID);
}
else if(!pressed)
{
item.setIcon(R.drawable.unliked);
MainActivity.favs.remove(Integer.valueOf(ID));
}
return true;
在开始渲染每个 activity(一个可以喜欢或不喜欢的组件)时,我检查了组件 ID 是否在该静态数组中:
if(!MainActivity.favs.isEmpty())
{
if (MainActivity.favs.contains(ID))
{
pressed = true;
}
}
这样一来,喜欢的组件 activity 总是会以正确的“喜欢”图标恢复。 希望这能以任何方式帮助...
我忘了说 FragmentA 是 MVI 而 FragmentB 是 MVVM。这意味着 FragmentA 是根据我在其呈现器中减少的视图状态呈现的。接收数据的适配器与片段没有紧密耦合,因此它不知道数据更改。 当数据库中的项目发生某些更新时,我向我的演示者添加了一个额外的事件来更新视图状态。当用户恢复 FragmentA 时,它会呈现视图状态。 ViewState 现在包含更新的项目,我通过将更新的项目传递给适配器来相应地处理这种情况(传递新数据时类似)。现在两个 ViewHolder 的数据是相同的,当从 FragmentB -> FragmentA 返回时,我喜欢的状态被保留。