2014-08-29 33 views
1

使用下面的代碼,我被另一個替換片段:如何避免碎片覆蓋而做了更換FragmentTransaction與customAnimation

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
if(anomalieFragment == null) 
{ 
    ft.setCustomAnimations(R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left); 
    anomalieFragment = new AnomalieListFragment(); 
    ft.replace(R.id.content, anomalieFragment); 
    ft.addToBackStack(null); 
} 

slide_in_leftslide_out_right這樣定義

<?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="500" 
      android:propertyName="XFraction" 
      android:valueFrom="0" 
      android:valueTo="100" 
      android:valueType="floatType" /> 

</set> 

and

<?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="500" 
      android:propertyName="XFraction" 
      android:valueFrom="100" 
      android:valueTo="0" 
      android:valueType="floatType" /> 

</set> 

一旦th e轉換完成後,一切正常,沒有疊加,但是當轉換處於運行狀態時,舊片段在新片段下仍然可見。

轉型進展 - 1 Transition in progress - 1 正在進行轉型 - 2 Transition in progress - 2

有什麼我可以做,以避免?

編輯

這裏的XFraction實施(我創建了一個FrameLayout裏派生類:

SlidingFrameLayout

package com.aquadata.tutorials.FirstApp.view; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.FrameLayout; 
import com.aquadata.fms.R; 
import com.google.android.gms.internal.x; 

/** 
* Created by igirouard on 2014-08-27. 
* FrameLayout supportant d'être slidé in an out par le R.animator.slide_in_left et slide_out_right 
* Supporte aussi que son enfant contienne une vue id/shadow pour afficher un ombrage quand 
*/ 
public class SlidingFrameLayout extends FrameLayout 
{ 
    //Position initiale du layout, telle que définie dans OnLayout 
    float initialX = -1; 

    //Dernière fraction 
    float _xFraction = -1; 

    public SlidingFrameLayout(Context context) 
    { 
     super(context); 
    } 

    public SlidingFrameLayout(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public SlidingFrameLayout(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    //Retourne la fraction de la position initiale par rapport à la position lors du slide 
    private float getXFraction() 
    { 
     return getWidth() == 0 ? 0 :(getX() - initialX)/getWidth() * 100; 
    } 

    //Déterminer un nouveau x selon la fraction de déplacement domandée 
    public void setXFraction(float xFraction) 
    { 
     _xFraction = xFraction; 
     if(initialX != -1.0f && getWidth() != 0) 
     { 
      final float newX = initialX + (xFraction/100 * getWidth()); 
      setX(newX); 
     } 
    } 

    /** 
    * Called from layout when this view should 
    * assign a size and position to each of its children. 
    * 
    * Derived classes with children should override 
    * this method and call layout on each of 
    * their children. 
    * @param changed This is a new size or position for this view 
    * @param left Left position, relative to parent 
    * @param top Top position, relative to parent 
    * @param right Right position, relative to parent 
    * @param bottom Bottom position, relative to parent 
    * 
    * Si une ombre a été ajoutée au layout, la cacher si on est à x == 0 
    */ 
    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
    { 
     if(changed) 
      initialX = left; 


     super.onLayout(changed, left,top,right,bottom); 

     if(_xFraction != -1) 
      setXFraction(_xFraction); 
    } 
} 
+0

嘗試設置對第二個片段不透明的背景 – 2014-08-29 14:10:51

+0

@Eldar背景已經不透明 – Goldorak84 2014-08-29 14:46:42

+0

使用簡單的片段檢查了相同的動畫並沒有觀察到問題。碎片背景或/和你實現xFraction屬性有錯誤。請分享完整的例子。 – sandrstar 2014-09-04 07:50:17

回答

0

我通過設置背景顏色固定這個類似的問題:

android:background="@color/background_material_light"