gpt4 book ai didi

android - 使用 fragment 共享过渡时返回过渡无法正常工作

转载 作者:IT老高 更新时间:2023-10-28 23:14:44 29 4
gpt4 key购买 nike

我有 2 个 fragment ListMovieFragmentDetailMovieFragment

我在 ListMovieFragment 中有一个在 MainActivity 中实现的接口(interface)。我正在使用共享元素转换;当我单击 ListMovieFragment 中的 ImageView 时,onMovieSelectedMainActivity 中被调用。

ListMovieFragment 过渡有效。
但是当我单击 back 按钮时,从 DetailMovieFragment 转换到 ListMovieFragment 无法正常工作。

gif of what is going wrong

这里是 MainActivity。我认为我在 fragment 上设置过渡的组合不正确。

public class MainActivity extends AppCompatActivity implements ListMovieFragment.MovieSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if(savedInstanceState == null) {
ListMovieFragment listMovieFragment = new ListMovieFragment();

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.activity_main, listMovieFragment, ListMovieFragment.TAG);
fragmentTransaction.commit();
}
}

@Override
public void onMovieSelected(int movieId) {
DetailMovieFragment detailMovieFragment =
(DetailMovieFragment)getSupportFragmentManager().findFragmentByTag(DetailMovieFragment.TAG);
/* Create a new DetailMovieFragment if not exits */
if(detailMovieFragment == null) {
detailMovieFragment = new DetailMovieFragment();
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
/* Get the fragments that will be using the transition */
ListMovieFragment listMovieFragment =
(ListMovieFragment)getSupportFragmentManager().findFragmentByTag(ListMovieFragment.TAG);
if(listMovieFragment == null) {
listMovieFragment = new ListMovieFragment();
}

/* Inflate the transition */
Transition changeTransition = TransitionInflater
.from(MainActivity.this)
.inflateTransition(R.transition.change_image_transform);

/* source fragment (ListMovieFragment) */
listMovieFragment.setExitTransition(new Explode());
listMovieFragment.setSharedElementReturnTransition(changeTransition);

/* Destination fragment (DetailMovieFragment) */
detailMovieFragment.setSharedElementEnterTransition(changeTransition);
detailMovieFragment.setEnterTransition(new Explode());

/* Get the shared imageview from the source fragment (MovieListFragment) */
final ImageView ivSharedImage = (ImageView) findViewById(R.id.ivMoviePoster);

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.activity_main, detailMovieFragment, DetailMovieFragment.TAG);
fragmentTransaction.addToBackStack(DetailMovieFragment.TAG);
fragmentTransaction.addSharedElement(ivSharedImage, getResources().getString(R.string.transition_poster_image));
fragmentTransaction.commit();
}
else {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.activity_main, detailMovieFragment, DetailMovieFragment.TAG);
fragmentTransaction.addToBackStack(DetailMovieFragment.TAG);
fragmentTransaction.commit();
}
}

@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}
else {
super.onBackPressed();
}
}
}

我的过渡 xml 文件:

<transitionSet>
<changeBounds />
</transitionSet>

fragment 列表

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="18dp"
android:paddingBottom="6dp">

<ImageView
android:id="@+id/ivMoviePoster"
android:layout_width="184dp"
android:layout_height="276dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:transitionName="@string/transition_poster_image"/>
</LinearLayout>

fragment_detail

<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"
tools:context="me.androidbox.fragmenttransitions.detail.DetailMovieFragment">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="The Movie App"
android:textSize="28sp"
android:fontFamily="sans-serif-light"
android:textColor="@android:color/holo_blue_dark"/>

<ImageView
android:id="@+id/ivMoviePoster"
android:layout_width="92dp"
android:layout_height="138dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="112dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:layout_gravity="end"
android:transitionName="@string/transition_poster_image"/>
</FrameLayout>

activity_main

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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="me.androidbox.fragmenttransitions.activity.MainActivity">
</FrameLayout>

最佳答案

你应该改变 fragment_list.xml 如下,android:layout_width/height 属性被改变了。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="18dp"
android:paddingBottom="6dp">

<ImageView
android:id="@+id/ivMoviePoster"
android:layout_width="184dp"
android:layout_height="276dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:transitionName="@string/transition_poster_image"/>
</LinearLayout>

关于android - 使用 fragment 共享过渡时返回过渡无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41355756/

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