2016-05-27 3 views
2

Ниже приводится мой сценарий.Как запустить DialogFragment с переходом на Android?

У меня есть ActivityMainActivity который имеет один FAB. Когда пользователь нажимает на FAB, я открываю полный экран DialogFragment. Я хочу открыть DialogFragment с некоторыми переходами.

Вот код, который я пробовал до сих пор.

//MainActivity.java 

final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
fab.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 

    ReviewDialog reviewDialog = ReviewDialog.newInstance(); 
    Slide slide = new Slide(); 
    slide.setSlideEdge(Gravity.LEFT); 
    slide.setDuration(1000); 
    reviewDialog.setEnterTransition(slide); 
    Bundle bundle =ActivityOptions.makeSceneTransitionAnimation(ScrollingActivity.this) 
     .toBundle(); 
    reviewDialog.setArguments(bundle); 
    reviewDialog.show(getSupportFragmentManager(),"review"); 
    } 
}); 

И вот код диалогового окна DialogFragment ReviewDialog.

//ReviewDialog.java 
    public class ReviewDialog extends DialogFragment { 
    static ReviewDialog newInstance() { 
    ReviewDialog f = new ReviewDialog(); 

    // Supply num input as an argument. 
    Bundle args = new Bundle(); 
    f.setArguments(args); 
    return f; 
    } 

    @Override 
    public void onActivityCreated(Bundle arg0) { 
    super.onActivityCreated(arg0); 
    Slide slide = new Slide(); 
    slide.setSlideEdge(Gravity.LEFT); 
    slide.setDuration(1000); 
    getDialog().getWindow().setEnterTransition(slide); 
    getDialog().getWindow().setExitTransition(slide); 
    getDialog().getWindow().setReenterTransition(slide);} 

    @Override 
    public void onCreate(Bundle bundle){ 
    super.onCreate(bundle); 
    setStyle(DialogFragment.STYLE_NORMAL,R.style.DialogTheme); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.dialog_review, container, false); 
    return v; 
    } 

} 

Также я установил следующее свойство в моем AndroidManifest.xml

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

Проблема заключается в том, когда запускается ReviewDialog, он не показывает каких-либо переходов. Я могу показать переходы между различными видами деятельности, но очень трудно показать переход между Activity и Fragment. Как показать переходы при запуске DialogFragment?

+0

посмотреть Http: //stackoverflow.com/questions/13402782/show-dialogfragment-with-animation-growing-from-a-point – Ironman

+0

@Ironm a: вопрос, упомянутый в ссылке, был задан еще в 2012 году, и большинство ответов составило 2013. Очевидно, что все ответы были написаны до того, как были объявлены переходы на леденец. Я хочу достичь этого с помощью переходов, предусмотренных в леденец. – thedarkpassenger

+0

см. Это: http://stackoverflow.com/a/13537234/4628611 – Mehta

ответ

0

Используйте эту библиотеку: https://github.com/lgvalle/Material-Animations

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

а) Включить окно Содержание Переход

значения/styles.xml

<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
    ... 
    <item name="android:windowContentTransitions">true</item> 
    ... 
</style> 

б) Определить общее название с переходной

макет/fragment_a.xml

<ImageView 
     android:id="@+id/small_blue_icon" 
     style="@style/MaterialAnimations.Icon.Small" 
     android:src="@drawable/circle" 
     android:transitionName="@string/blue_name" /> 

макет/fragment_b.xml

<ImageView 
     android:id="@+id/big_blue_icon" 
     style="@style/MaterialAnimations.Icon.Big" 
     android:src="@drawable/circle" 
     android:transitionName="@string/blue_name" /> 

с) Начать фрагмент с общим элементом

FragmentB fragmentB = FragmentB.newInstance(sample); 

// Defines enter transition for all fragment views 
Slide slideTransition = new Slide(Gravity.RIGHT); 
slideTransition.setDuration(1000); 
sharedElementFragment2.setEnterTransition(slideTransition); 

// Defines enter transition only for shared element 
ChangeBounds changeBoundsTransition = TransitionInflater.from(this).inflateTransition(R.transition.change_bounds); 
fragmentB.setSharedElementEnterTransition(changeBoundsTransition); 

getFragmentManager().beginTransaction() 
     .replace(R.id.content, fragmentB) 
     .addSharedElement(blueView, getString(R.string.blue_name)) 
     .commit(); 

И это окончательный результат:

enter image description here