Переходы общих элементов работают только в 2/3 случаев - PullRequest
0 голосов
/ 28 июня 2018

Я играл с переходом от общего элемента и разработал тестап с 4 фрагментами.

enter image description here

На картинке, которую вы видите, первый фрагмент содержит сообщение «начать сейчас», при нажатии которого я хочу заменить контейнер фрагментом посередине. Как конфетка для глаз, я хочу анимацию с использованием переходов между общими элементами.

Задача
Моя проблема в том, что, если я оставляю первый фрагмент пустым (без начального сообщения) и, например, я устанавливаю OnClickListener на саму иконку, все работает хорошо с хорошей анимацией. Но если первый фрагмент содержит это сообщение , то только первый значок (второй фрагмент, изображение посередине) больше не имеет анимации. Это просто замена первого фрагмента. Любопытно, что если я изменю свой OnClickListener и позволю ему запустить вторую страницу (правая картинка), анимация снова будет работать нормально. Таким образом, только первый / левый значок не обеспечивает анимацию, хотя все методы и XML в основном 1: 1 одинаковы.

Поскольку я не мог разработать лучшее решение, каждая «панель инструментов» разработана в самом фрагменте.

Основная деятельность

 public class FirstStartupActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_firststartup);
    doFragmentTransaction(new MainFragment(), "TAG", false, null);
}

public void doFragmentTransaction(Fragment fragment, String tag, boolean addToBackStack, List<View> sharedElements){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.ActivityFirstStartup_fragmentContainer, fragment, tag);
    if(addToBackStack){
        transaction.addToBackStack(tag);
    }
    if( sharedElements != null && !sharedElements.isEmpty()){
        for(int i = 0; i < sharedElements.size(); i++){
            View view = sharedElements.get(i);
            transaction.addSharedElement(view, view.getTransitionName());
        }
    }
    transaction.commit();
}}

Первый фрагмент с сообщением

 public class MainFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_firststartup_home, container, false);

    View view = v.findViewById(R.id.relLayoutPageOne);
    final List<View> listview = new ArrayList<>();
    listview.add(view);
    View view2 = v.findViewById(R.id.relLayoutPageTwo);
    final List<View> listview2 = new ArrayList<>();
    listview2.add(view2);

    Button button = v.findViewById(R.id.buttonStart);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((FirstStartupActivity)getActivity()).doFragmentTransaction(new UsernameFragment(), "test", true, listview);
            //((FirstStartupActivity)getActivity()).doFragmentTransaction(new CameraFragment(), "TEST2", true, listview2);
        }
    });

    RelativeLayout rel2 = v.findViewById(R.id.relLayoutPageTwo);
    rel2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((FirstStartupActivity)getActivity()).doFragmentTransaction(new CameraFragment(), "TEST2", true, listview2);
        }
    });

    return v;
}}

Второй фрагмент без анимации

 public class UsernameFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_firststartup_pgone, container, false);
    postponeEnterTransition();
    return v;
}

@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));
    }
}}

Третий фрагмент работает

 public class CameraFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_firststartup_pgtwo, container, false);

    return v;
}

@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));
    }
}}

Второй фрагмент (картинка посередине) Нет анимации при замене)

 <android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.constraint.ConstraintLayout
    android:id="@+id/constraintLayout2"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@drawable/draw_login_edittext">

</android.support.constraint.ConstraintLayout>

<RelativeLayout
    android:id="@+id/relLayoutPageTwo"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_marginTop="4dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:transitionName="ProfileCam"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:transitionName="ProfileCam"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/testtwo" />

</RelativeLayout>

<RelativeLayout
    android:id="@+id/relLayoutPageThree"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:transitionName="ProfileGender"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.95"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/testthree" />

</RelativeLayout>

<RelativeLayout
    android:transitionName="ProfilePic"
    android:layout_width="273dp"
    android:layout_height="210dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:background="@drawable/draw_login_edittext_rounded"

    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/constraintLayout2">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/test" />
</RelativeLayout>

Первый фрагмент (изображение слева)

 <android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
    android:id="@+id/constraintLayout2"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#a8655c">
</android.support.constraint.ConstraintLayout>
<RelativeLayout
    android:transitionName="ProfilePic"
    android:id="@+id/relLayoutPageOne"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/draw_login_edittext_rounded"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.049"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/test" />
</RelativeLayout>
<RelativeLayout
    android:id="@+id/relLayoutPageTwo"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:transitionName="ProfileCam"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/testtwo" />
</RelativeLayout>
<RelativeLayout
    android:id="@+id/relLayoutPageThree"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:transitionName="ProfileGender"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.95"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/testthree" />
</RelativeLayout>
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:forceHasOverlappingRendering="true"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:padding="25dp"
    android:transitionName="ProfilePic"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/constraintLayout2">
    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:text="Bevor du loslegen könnst benötigen wir noch kurz ein paar Informationen über dich! :)"
        android:textAlignment="center"
        android:textColor="#BFFFFFFF" />
    <Button
        android:id="@+id/buttonStart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/text"
        android:layout_centerHorizontal="true"
        android:layout_marginHorizontal="15dp"
        android:layout_marginTop="15dp"
        android:background="@drawable/draw_rounded_edittext_dark"
        android:text="Start now"
        android:textColor="#BFFFFFFF" />
</RelativeLayout>

Третий фрагмент (правая картинка) Анимация при замене

 <android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.constraint.ConstraintLayout
    android:id="@+id/constraintLayout2"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@drawable/draw_login_edittext">

</android.support.constraint.ConstraintLayout>

<RelativeLayout
    android:id="@+id/relLayoutPageOne"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:transitionName="ProfilePic"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.049"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/test" />

</RelativeLayout>

<RelativeLayout
    android:id="@+id/relLayoutPageThree"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/draw_login_edittext_rounded"
    android:transitionName="ProfileGender"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.95"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/testthree" />

</RelativeLayout>

<RelativeLayout
    android:layout_width="273dp"
    android:layout_height="210dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:background="#c8c8c8"
    android:transitionName="ProfileCam"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/constraintLayout2">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="fitStart"
        app:srcCompat="@mipmap/testtwo" />
</RelativeLayout>

Визуальное описание

Первый значок не работает, но второй работает как шарм По какой-то причине первый GIF слишком быстрый, обычно он выскакивает, единственная проблема - отсутствующая анимация

enter image description here

enter image description here

1 Ответ

0 голосов
/ 28 июня 2018

Ну, я пытался изменить некоторые вещи, и я сделал все хуже. Тогда я «починил» его, и теперь он работает, к сожалению, я не могу показать вам решение для этого. Я пытаюсь снова работать с кодами

РЕДАКТИРОВАТЬ: @LieForBanana было решение, но я понял его неправильно, действительно мой первый фрагмент также имел имя перехода это (3x TransitionName ProfilePic). Мне стыдно, это была только одна глупая ошибка

...