Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多个共享元素_Android_Shared Element Transition - Fatal编程技术网

Android 多个共享元素

Android 多个共享元素,android,shared-element-transition,Android,Shared Element Transition,我在足球应用程序中遇到以下情况。 我们希望实现所有这些活动之间的共享元素 在第一个活动的我的视图持有者中,我为比赛设置了一个android:transitionName,它对应于第二个活动上的相同transitionName <!-- item_viewholder (first activity) --> <CustomViewContainingImageViewAndTextView android:id="@+id/item_match_homet

我在足球应用程序中遇到以下情况。
我们希望实现所有这些活动之间的共享元素

在第一个
活动
的我的视图持有者中,我为比赛设置了一个
android:transitionName
,它对应于第二个
活动
上的相同transitionName

<!-- item_viewholder (first activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />

<!-- header (second activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam_header"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />
现在,这个转换很好,但如果我想了解更深入的细节,该怎么办。
显示所选团队的统计信息,我也想在那里共享转换

当将包含图像视图和文本视图的
自定义视图单击到新的
transitionName
时,我尝试以编程方式设置
transitionName

final String teamViewTransition = activityContext.getString(R.string.transition_morph_teamview_to_detail);
//teamView is the view that was clicked.
ViewCompat.setTransitionName(teamView, teamViewTransition);

final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
     activityContext,
     Pair.create(teamView, teamViewTransition));
activityContext.startActivity(teamInfoActivityIntent, options.toBundle());
此转换名称对应于第三个
活动

<ImageView
   android:id="@+id/team_info_header_logo"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:transitionName="@string/transition_morph_teamview_to_detail" />

但是Entertransformation失败,exitTransition工作
但是,这会将exitTransition从2-->1中断

视力。 希望有人能花点时间来解决这个问题


提前感谢

毫无疑问,问题是因为您正在将要共享的视图的
转换名称
从第二个
活动
更改为第三个。但是您只需将
transitionName
保留在第二个
Activity
中,而根据我们希望从第二个
Activity
中共享的内容,更改第三个
Activity
中视图的
transitionName
方法

<!-- item_viewholder (first activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />

<!-- header (second activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam_header"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />
因此,让我们保持从第一个
活动
到第二个活动的过渡,因为它按预期工作。让我们看看第二个
活动
:我们只需要将视图的
转换名
,作为
意图的额外部分
发送给第三个
活动
,然后以编程方式将该值分配给第三个
活动
中的共享视图

<!-- item_viewholder (first activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />

<!-- header (second activity) -->
<CustomViewContainingImageViewAndTextView
     android:id="@+id/item_match_hometeam_header"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:transitionName="@string/transition_morph_match_header_homeTeam" />
下面是我们第二次活动的代码:

View homeTeam = findViewById(R.id.home_team_detail);
View awayTeam = findViewById(R.id.away_team_detail);

View.OnClickListener onTeamClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Activity activityContext = MultipleElementsDetail.this;
        final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
                activityContext,
                Pair.create(v, v.getTransitionName()));
        startActivity(new Intent(activityContext, SingleElementDetail.class)
           .putExtra("shared_element_transition_name", v.getTransitionName()), options.toBundle());
    }
};

homeTeam.setOnClickListener(onTeamClickListener);
awayTeam.setOnClickListener(onTeamClickListener);
因此,我在这里所做的只是为两个团队创建了相同的
OnClickListener
,它创建了共享的转换,并以
Intent
transitionName
作为额外的共享视图开始新的活动

然后在第三个
活动中
我刚刚从
Intent
中获得了这个额外的信息,并将其设置为共享视图的
transitionName

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_element_detail);

    View team = findViewById(R.id.team_single);

    String transitionName = getIntent().getStringExtra("shared_element_transition_name");
    if (!TextUtils.isEmpty(transitionName)) {
        ViewCompat.setTransitionName(team, transitionName);
    }
}
因此,我们有了类似的东西(我使用了explode transition来更好地了解活动之间的差异):


希望这对您有所帮助,并且完全符合您的要求!:)

我自己也有这个疑问,但我觉得上面的答案有点让人困惑。简单地说,如果您有多个共享元素要设置动画,您可以根据需要创建视图和转换名称的“对”。以下是此示例的示例代码:

    Pair statusAnim = Pair.create(holder.getOrderStatusView(), "track_job_status");
    Pair driverBundleAnim = Pair.create(holder.getDriverProfileBundle(), "driver_profile_bundle");
    ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation((Activity) context, statusAnim, driverBundleAnim);
    context.startActivity(new Intent(context, TrackingActivity.class), transitionActivityOptions.toBundle());

嘿,伙计!我喜欢你的解决方案,但是我的第三个活动中的imageView是一个片段和一个recyclerview。因此,我必须为我的活动提供转换名称,将其传递给我的片段,将其传递给我的适配器,将其传递给我的视图持有者。真麻烦…是的,或者您可以将其保存在
SharedReferences
或数据库中,然后在您的
ViewHolder
/
适配器中提取它。或者您可以在某个地方将其设置为
静态
变量。或者您甚至可以将其设置为模型中的一个字段(即
团队
类,这是最简单的方法),然后再次在
onBindViewHolder
中提取。无论如何,您需要在运行时设置它,因为在单击它之前,您不知道将共享什么:)您可以发布此代码吗?不知怎的,我无法复制你所呈现的。