2015-03-03 3 views
0

дамы и господа,Android анимации фрагмент не работает, как ожидается,

Я учусь развиваться для андроид, и я немного застрял с фрагмента анимации.

У меня есть деятельность с кнопкой вверху. При нажатии кнопки я программно добавляю синий фрагмент при создании действия. При нажатии кнопки я хочу, чтобы синий фрагмент исчез, и появится зеленый.

Он отлично работает без анимации (оставил его в верхней части метода).

Затем я пытаюсь использовать метод replace() и после этого удалять + добавлять методы. Не ведите себя так, как я ожидал бы ...

заменить: я нажимаю кнопку, и синий фрагмент выходит. Зеленый фрагмент уже присутствует под синим. Затем зеленый цвет исчезает и скользит в ожидании.

удалить/добавить: синий фрагмент исчезает без анимации, зеленый фрагмент уже присутствует, то исчезает и скользит в

Может кто-то пожалуйста, дайте мне руку фиксирующую в обоих направлениях? Я сделал много поисковых запросов, но не могу решить, в чем проблема.

Кроме того, несколько слов, объясняющих, где неправильно, чтобы я не повторил ту же ошибку снова в будущем.

Вот код основной деятельности:

package com.example.zz0011_detach_attach_fragment; 

import android.app.Activity; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.view.View; 


public class MainActivity extends Activity 
{ 
    FragmentManager fm = getFragmentManager(); 

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

     FragmentTransaction ft = getFragmentManager().beginTransaction();  

     ft.add(R.id.blueFragmentPlaceholder, new BlueFragment(), "blueFragmentTag"); 

     ft.commit(); 
    } 

    public void buttonClicked (View view) 
    { 
     // ============================================================================== 
     // ================================================================= NO ANIMATION 

     // ------------------------------------------------------------------- WORKS FINE 

     // ==============================================================================  

     // FragmentTransaction ft = getFragmentManager().beginTransaction();  

     // ft.remove(fm.findFragmentByTag("blueFragmentTag")); 
     // ft.add(R.id.greenFragmentPlaceholder, new GreenFragment(), "greenFragmentTag"); 

     // ft.commit(); 

     // ============================================================================== 
     // ================================================================== REPLACEMENT 

     // ----------------------------------------------------- BLUE FRAGMENT SLIDES OUT 
     // ----- GREEN FRAGMENT IS ALREADY PRESENT UNDERNEATH, DISAPPEARS, SLIDES BACK IN 

     // ==============================================================================  
     //  getFragmentManager().beginTransaction().setCustomAnimations 
     //  (
     //    R.animator.slide_in, R.animator.slide_out, R.animator.slide_out, R.animator.slide_in 
     //   ).replace 
     //   ( 
     //    getFragmentManager().findFragmentByTag ("blueFragmentTag").getId(), new GreenFragment() 
     //   ).commit();  


     // ============================================================================== 
     // ========================================================= REMOVAL AND ADDITION 

     // --------------------------------- BLUE FRAGMENT DISAPPEARS WITHOUT ANIMATION 
     // ----- GREEN FRAGMENT IS ALREADY PRESENT UNDERNEATH, DISAPPEARS, SLIDES BACK IN 

     // ==============================================================================  

     getFragmentManager().beginTransaction().setCustomAnimations (R.animator.slide_out, 0). 
     remove (getFragmentManager().findFragmentByTag ("blueFragmentTag")).commit();  

     getFragmentManager().beginTransaction().setCustomAnimations (R.animator.slide_in, 0). 
     add(R.id.greenFragmentPlaceholder, new GreenFragment(), "greenFragmentTag").commit(); 
    } 
} 

Это android_main XML-файл

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.zz0011_detach_attach_fragment.MainActivity" > 

<Button 
    android:id="@+id/clicableButton" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:onClick="buttonClicked" 
    android:text="@string/click_me" 
    android:textAlignment="center" /> 

<FrameLayout 
    android:id="@+id/blueFragmentPlaceholder" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:layout_below="@id/clicableButton" 
    android:layout_marginTop="20dp" 
    > 
</FrameLayout> 

---- EDIT

Я нашел, где проблема была, это было в другом файле, который я теперь добавляю к исходному сообщению

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <objectAnimator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="5000" 
    android:propertyName="x" 
    android:valueFrom="-1000" 
    android:valueTo="0" 
    android:valueType="floatType" 
    android:startOffset="300" /> 

</set> 

Причина появления зеленого фрагмента была значением startOffset. Его не должно быть

ответ

1

Я предлагаю вам всегда использовать replace и пропустить add в начале. Кроме того, вы имеете в виду разные теги, используйте один и тот же тег для поддержки Fragments в том же стеке. Используйте этот метод ниже для замены фрагментов, где R.id.content - это контент (FrameLayout), где будет отображаться Fragments, использовать его для всех из них. Я добавил для вас clearBackStack, чтобы вы могли выбрать, когда хотите отобразить Fragment в качестве корневого уровня.

private void switchFragment(Fragment fragment, boolean clearBackStack){ 
     if (clearBackStack) { 
      getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.content, fragment, "current"); 
     if (!clearBackStack) { 
      ft.addToBackStack(null); 
     } 
     ft.commitAllowingStateLoss(); 
    } 
+0

Карнал, благодарю вас за помощь. Я изменил свой код соответственно, и я только что узнал о стеке, как я уже сказал, только что начался ... Однако та же самая проблема, которая была у меня до этого, до сих пор сохраняется: исходный фрагмент выходит, второй уже есть, затем исчезает и слайды назад. Любая идея о том, почему это происходит? – Dan

+0

Нет проблем, удачи! – Carnal

+0

Извините, Carnal Я все еще пытаюсь понять, как публиковать ответы в правильной рамке, а не в этих крошечных коробках! Введите ключ, который отправил мой второй пост вместо новой строки ... Добавленный бит для анимации следующий: ft.setCustomAnimations (R.animator.slide_in, R.animator.slide_out, R.animator.slide_out, R.animator.slide_in); – Dan

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