20

У меня есть 2 фрагмента и DetailMovieFragment.Возвратный переход не работает корректно при использовании общих разделов фрагментов

У меня есть интерфейс в ListMovieFragment, который реализован в MainActivity. Я использую переход общего элемента; когда я нажимаю на изображение в ListMovieFragment, onMovieSelected вызывается в MainActivity.

Выполняется с ListMovieFragment работ.
Но когда я нажимаю кнопку назад, переход из DetailMovieFragment в списокMovieFragment не работает.

gif of what is going wrong

Вот MainActivity. Я думаю, что у меня есть некорректная комбинация для установки переходов на фрагменты.

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_list

<?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> 
+0

Похоже, что переход работает нормально, но мы не можем видеть деталь за пределами первоначальных границ плаката. Что происходит, когда вы меняете размер первых экранов или первоначальный размер плаката? – cokceken

+0

Можете ли вы поделиться своими макетами activity_main и фрагментами? –

+0

@NileshSingh Я добавил файлы макета – ant2009

ответ

10

Вы должны изменить 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> 
+0

Не могу поверить, что все было так просто. Я думал, что я делаю что-то не так с переходами. Благодарю. – ant2009

+0

@cokceken Я думаю, что код работает без этого изменения. Я не вижу никаких изменений, кроме match_parent? –

+0

@Nilesh Singh Это размер макета. Если у вас больше изображения или много изображений, он будет работать – cokceken

 Смежные вопросы

  • Нет связанных вопросов^_^