gpt4 book ai didi

java - ViewPager 中的 fragment 和新 fragment 之间的共享元素转换

转载 作者:太空狗 更新时间:2023-10-29 13:52:13 24 4
gpt4 key购买 nike

有什么方法可以使用共享元素从 ViewPager 内的 fragment 过渡到新的 fragment ?

编辑

我有一个 MainActivity 和包含 FragmentA 的 ViewPager。由此我想用 Shared Element Transition 打开 FragmentB

我已经创建了一个示例项目,您可以在下面看到它。如果我删除 ViewPager 并定期打开 FragmentA,共享元素转换工作正常,但是一旦我将 ViewPager 添加到项目中,就不会出现转换。

这是MainActivity

的代码
public class MainActivity extends AppCompatActivity {

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

ViewPager mViewPager = (ViewPager)findViewById(R.id.viewpager);

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
private int NUM_ITEMS = 1;
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FragmentA();
default:
return null;
}
}
@Override
public int getCount() {
return NUM_ITEMS;
}
};
mViewPager.setAdapter(adapter);
}
}

MainActivity 的 XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.gustafwennerstrom.testeb.MainActivity">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:id="@+id/viewpager"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</RelativeLayout>

这是FragmentA

的代码
public class FragmentA extends Fragment {
FrameLayout root;

public FragmentA() {}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
root = (FrameLayout)inflater.inflate(R.layout.fragment_, null);
ImageView image = (ImageView) root.findViewById(R.id.testImage);
image.setOnClickListener(openFragment);
return root;

}

private View.OnClickListener openFragment = new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView sharedImage = (ImageView)root.findViewById(R.id.testImage);
getFragmentManager()
.beginTransaction()
.addSharedElement(sharedImage, ViewCompat.getTransitionName(sharedImage))
.addToBackStack(getTag())
.replace(android.R.id.content, new FragmentB())
.commit();
};
}

FragmentA 的 XML(FragmentB 看起来非常相似)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_a"
android:background="@color/colorAccent"
tools:context="com.example.gustafwennerstrom.testeb.FragmentA">
<ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@drawable/yo"
android:transitionName="myImage"
android:id="@+id/testImage"/>
</FrameLayout>

这是 fragment B

public class FragmentB extends Fragment {
public FragmentB() {}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setSharedElementEnterTransition(TransitionInflater
.from(getContext())
.inflateTransition(android.R.transition.move)
.setDuration(100));
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_fragment_b, container, false);

}
}

styles.xml 中,我添加了这行代码:

<item name="android:windowContentTransitions">true</item>

最佳答案

解决方案/解决方法

好吧,我放弃了让它在包含 ViewPager 的 fragment 之间工作。来自 this thread我们可以看到:

The Fragmnets in ViewPager load with a delay, meaning that the activity returns a lot faster than its fragments which are contained inside the ViewPager

因此,我需要延迟过渡,直到内容加载完毕。为了延迟过渡,我不能使用 postponeEnterTransition () 因为我在加载 fragment 时不能使用 makeSceneTransitionAnimation(Activity, android.util.Pair[]),只有 Activity 。来自文档:

startPostponedEnterTransition() must be called to allow the Activity to start the transitions. If the Activity did not use makeSceneTransitionAnimation(Activity, android.util.Pair[]), then this method does nothing.

我将 FragmentB 更改为 Activity,现在它工作正常了!如果您找到可以从 ViewPager 内部过渡到 Fragment 的解决方案,请随时发布。

关于java - ViewPager 中的 fragment 和新 fragment 之间的共享元素转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45284650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com