4

我使用在Android 5.0運行的裝置,所述minSdk是21和targetSdk是22與片段問題進入過渡

應用描述

我在帶2周的活動的應用程序,活動A包含帶有圖片和文字的GridView,活動B包含一個ImageView,一個TextView和一個片段。該片段包含與文本關聯的圖像列表。 單擊活動A的圖像時,會出現一個共享元素轉換,它將圖像和文本移動到活動B的ImageViewTextView。我還在活動A和B之間設置淡入淡出過渡。將片段動態添加到onCreate()方法中的活動B.我設置,進入和退出過渡到片段:

@Override 
public void onBackPressed() { 
    if (myFragment.isVisible()) { 
     getFragmentManager().beginTransaction() 
       .replace(R.id.container, new Fragment()) 
       .commit(); 
    } 
    super.onBackPressed(); 
} 

MyFragment myFragment = new MyFragment(); 
myFragment.setEnterTransition(new Slide()); 
myFragment.setExitTransition(new Slide); 
getFragmentManager().beginTransaction() 
       .add(R.id.container, myFragment, MyFragment.TAG) 
       .commit(); 

關於片段的出口轉型,我用了一招,按後退按鈕的時候,我用另一個迫使它取代片段

我的應用程序的主題是Theme.Material一個孩子,所以我沒有定義

getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); 
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 

也不

<item name="android:windowActivityTransitions">true</item> 
<item name="android:windowContentTransitions">true</item> 

(我試過了,沒有區別)。

應用問題

我的問題是關於碎片進入其工作不正常,而出口過渡工作正常過渡。 我嘗試不同的情況:

  • 沒有明確定義的活動轉變:有沒有進入過渡,這個片段已經在那裏當共享元素轉換播放。
  • 用活動A和B中的java定義活動轉換: getWindow().setEnterTransition(new Fade()); getWindow().setExitTransition(new Fade()); 結果與未定義的顯式活動轉換相同。
  • 定義了一個使用XML的活動轉換: <item name="android:windowEnterTransition">@transition/fade</item> <item name="android:windowExitTransition">@transition/fade</item> 結果是片段將通過衰落進入並且Fragment.setEnterTransition()被忽略。
  • 定義XML中的片段輸入轉換: <item name="android:fragmentEnterTransition">@transition/fade</item> 結果是它被完全忽略,之前的所有情況都會發生相同的情況。

我嘗試過其他的東西,使它像這樣的工作:myFragment.setAllowEnterTransitionOverlap(false);但沒有...... 我也試着設置在ImageView點擊監聽器,並添加片段只在點擊圖像和它的工作!因此,我認爲與活動生命週期相比,片段轉換的時間可能存在問題,所以我嘗試將代碼放入onResume()方法中,但仍然沒有任何結果。

然後我試圖使用postDelayed()方法:

MyFragment myFragment = new MyFragment(); 
myFragment.setEnterTransition(new Slide()); 
myFragment.setExitTransition(new Slide); 
mImageView.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
     getFragmentManager().beginTransaction() 
      .add(R.id.container, myFragment, MyFragment.TAG) 
      .commit(); 
      } 
     }, 1000); 

而且還成功了!

最後,我想補充一個空的片段,然後通過myFragment替換:

MyFragment myFragment = new MyFragment(); 
myFragment.setEnterTransition(new Slide()); 
myFragment.setExitTransition(new Slide); 
getFragmentManager().beginTransaction() 
       .add(R.id.container, new Fragment) 
       .commit(); 
getFragmentManager().beginTransaction() 
       .replace(R.id.container, myFragment, MyFragment.TAG) 
       .commit(); 

,但仍然沒有...

所以現在我想知道如果有什麼我失蹤讓它工作而不使用詭計...而事情是我知道它可以工作,因爲我可能在5個月前開始在應用程序上工作,它工作正常!所以我不知道發生了什麼,我沒有更新我的Android版本。

獎金bug:它仍然是關於片段輸入轉換。在我之前描述的應用程序之前,我嘗試了一個沒有共享元素轉換的版本。如果我沒有爲活動B的TextView設置轉換名稱,則該片段將永遠不會有輸入轉換。但是和以前一樣,如果在onclicklistener方法中設置,它將起作用。我在Android 5.0.x上運行的兩個設備上嘗試了這一點,並且轉換不起作用。我嘗試了Android 5.1.1的設備,並且轉換工作正常(無需更改代碼中的任何內容)!仍然不知道發生了什麼......

所以我的最後一個問題是:這種行爲的解釋是什麼,有沒有辦法讓它工作而不使用詭計?

+0

我想我陷入了類似的問題。唯一的區別是我被困在退出轉換中。你解決這個問題嗎? – Uday

回答

2

嘗試在其OnCreate中添加片段的進入和退出轉換。這似乎已經奏效從FragmentTransaction類我

-1

使用setCustomAnimations。

getFragmentManager()。的BeginTransaction() .setCustomAnimations(R.id.inAnim,R.id.outAnim,R.id.inAnim,R.id.outAnim) .replace(R.id.container,myFragment ,MyFragment.TAG) .commit();

這樣你就可以爲每個轉換定義一個動畫。

+0

Downvoted,因爲這是做這件事的老方法。 OP正在使用更新的Transition API – Justin