21
Революционный Android ищем замену фрагментам Олег Осипенко [email protected] [email protected]

Революционный Android. Ищем замену фрагментам

Embed Size (px)

Citation preview

Page 1: Революционный Android. Ищем замену фрагментам

Революционный Androidищем замену фрагментам

Олег Осипенко[email protected]+

[email protected]

Page 2: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Fragments API• Android 3.0 Honeycomb • 2011 год • Адаптивный UI • Backstack внутри Activity • MVC

Page 3: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Fragments API

Page 4: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Page 5: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Page 6: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Fragments API• сложный жизненный цикл (lolcycle) • асинхронные транзакции • конструирование фрагмента • вложенные фрагменты • архитектура?..

Page 7: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Fragments APIчто мы создаем при создании фрагмента?<FrameLayout> <ImageView /> <TextView /> </FrameLayout>

@Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.some_view, container, null); }

Page 8: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Flow & Flow.Path• Замена FragmentManager • Механизм для создания и удаления отдельных View

• Журнал для истории переходов между экранами

Page 9: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Flow & Flow.Path

Flow.set(Object newScreen);

Flow.goBack();

Переход к новому экрану

Возврат на предыдущий

Page 10: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Flow & Flow.Pathpublic class SampleActivity implements Flow.Dispatcher { 5

@Override public void dispatch(Traversal traversal, TraversalCallback callback) { Object newScreen = traversal.destination.top(); showNewScreen(newScreen); callback.onTraversalCompleted(); } 5

}

Page 11: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Screen

public class AlbumListScreen extends Path

• объединяет View и соответствующий Presenter

Page 12: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar• инструмент, использующий Dagger для связывания View и Presenter

• Предоставляет каждому экрану доступ к BundleService

Page 13: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & Flow

@Layout(R.layout.album_list_screen) @WithModule(AlbumListScreen.Module.class) public class AlbumListScreen extends Path {}

Объявление экрана

Page 14: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & Flow

public class AlbumListScreen extends Path { 5

@dagger.Module(injects = AlbumListView.class) public static class Module { 5

@Provides List<Album> provideAlbums() {} } }

Объявление экрана

Page 15: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & Flowpublic class AlbumListScreen extends Path { @Singleton public static class Presenter extends ViewPresenter<AlbumListView> { 5

@Override public void onLoad(Bundle savedInstanceState) { getView().showAlbums(albums); }

} }

Объявление экрана

Page 16: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar presenterpublic abstract class Presenter { void takeView(V view) void dropView(V view)

boolean hasView() V getView() void onEnterScope() void onLoad() void onSave() void onExitScope

}

Page 17: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & FlowОбъявление экрана<org.sample.SomeView> <ImageView /> <TextView /> </org.sample.SomeView>

public class SomeView extends FrameLayout

Page 18: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & FlowОбъявление экранаpublic class AlbumListView extends ListView { @Inject AlbumListScreen.Presenter presenter; public AlbumListView(Context context, AttributeSet attr){ super(context, attr); ObjectGraphService.inject(context, this);

} }

Page 19: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & FlowОбъявление экранаpublic class AlbumListView extends ListView { 5

@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); presenter.takeView(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); presenter.dropView(this); } }

Page 20: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам

Mortar & FlowОбъявление экранаpublic class AlbumListView extends ListView { 5

public void showAlbums(List<Album> albums) { adapter.setAlbums(albums); adapter.notifyDataSetChanged(); } }

Page 21: Революционный Android. Ищем замену фрагментам

Революционный Android Ищем замену фрагментам