一些第三方库使用钩子进入活动生命周期才能正常工作 - 例如,Facebook SDK(https://developers.facebook.com/docs/android/login-with-facebook/).
我在弄清楚如何使用单活动流+砂浆设置干净地协调这个模型时遇到了一些麻烦.
例如,如果我想使用Facebook登录作为登录流程的一部分(带有FlowView/FlowOwner),而不是活动中的其他内容,如果您需要在onCreate中为该特定流程挂钩,那么最明智的方法是将其解除, onResume,onPause,onDestroy,onSaveInstanceState,onActivityResult等?
最明确的路径是什么并不是很明显 - 为每个生命周期活动阶段创建一个observable并订阅它的流程?如果您不小心,似乎该路径会快速转移到相同的Android生命周期.有没有更好的办法?
我喜欢单一的活动模型,如果可能的话,我真的希望保持一切由流/迫击炮管理,而不是活动.或者我是否以一种从根本上使其变得更加困难的方式来思考这个问题?
我一直在尝试使用flow和mortar作为Android应用程序的替代架构.我一直在研究一个应用程序,在那一刻只有一个电话布局,但我想知道如果你想为平板电脑设置不同的流量和灰浆架构如何工作.主要细节可能是最简单的例子,但显然还有其他例子.
我有一些想法如何工作,但我想知道广场开发人员可能已经考虑过这个主题.
我想知道是否有任何为Flow和Mortar Android应用编写单元测试的例子.MVP模式的部分优势在于它提供了表示和视图逻辑的分离,而表示逻辑是您要编写测试的.我希望我能看到一些人们如何使用Flow&Mortar进行此操作,以及他们依赖的库.建立一些最佳实践会很棒.
编辑:值得注意的是,Google刚刚发布了针对Android的junit支持.
我正在使用Mortar和Flow为我的应用程序供电.如果我有以下视图:
public class MyView extends LinearLayout {
@Inject MyScreen.Presenter presenter;
private EditText someText;
public MyView(Context context) {
super(context);
Mortar.inject(context, this);
}
@Override protected void onFinishInflate() {
super.onFinishInflate();
presenter.takeView(this);
}
@Override protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
presenter.dropView(this);
}
}
Run Code Online (Sandbox Code Playgroud)
以下屏幕:
@Layout(R.layout.my_view)
public class MyScreen implements Blueprint {
@Override public String getMortarScopeName() {
return getClass().getName();
}
@Override public Object getDaggerModule() {
return new Module();
}
@dagger.Module(injects = MyView.class, addsTo = MyActivity.Module.class)
public class Module {
}
@Singleton
public class Presenter extends ViewPresenter<MyView> …Run Code Online (Sandbox Code Playgroud) 在发现Android库和框架时,我遇到了Square关于Flow和Mortar的博客文章.作者指出,开发流动和砂浆的一些动机是因为
...屏幕碎片神秘地在奇怪的时刻恢复生机
......没有直接控制动画
我无法理解作者的意思.谁能详细阐述作者所说的这两个痛点?
我正在尝试在我的应用中调整Mortar&Flow并遇到一个问题,我无法使PageAdapter与屏幕一起使用,而不是片段.
有人设法做到了吗?
我没有成功但是,可能有人可以从这一点指导我:
最初的Dagger注册:
@Module(
injects = {
MainActivity.class,
},
library = true,
complete = false
)
public class DaggerConfig {
@SuppressWarnings("unused")
@Provides @Singleton Gson provideGson() {
return new GsonBuilder().create();
}
}
Run Code Online (Sandbox Code Playgroud)
MainScreen,其View托管ViewPager:
@Layout(R.layout.screen_main) @WithModule(MainScreen.Module.class)
public class MainScreen extends Path {
@dagger.Module(injects = MainView.class, addsTo = DaggerConfig.class)
public static class Module {}
@Singleton
public static class Presenter extends ViewPresenter<MainView> {
@Inject
public Presenter() {}
}
}
Run Code Online (Sandbox Code Playgroud)
的MainView:
...........
@Inject
MainScreen.Presenter presenter;
...........
@Override protected void onFinishInflate() {
super.onFinishInflate();
ButterKnife.inject(this);
final …Run Code Online (Sandbox Code Playgroud) 我用Mortar + Flow构建我的应用程序.我正在试图找出显示弹出窗口的正确方法,该弹出窗口请求用户提供一些文本.我创建了这个弹出类:
public class SavedPageTitleInputPopup implements Popup<SavedPageTitleInput, Optional<String>> {
private final Context context;
private AlertDialog dialog;
public SavedPageTitleInputPopup(Context context) {
this.context = context;
}
@Override public Context getContext() {
return context;
}
@Override
public void show(final SavedPageTitleInput info, boolean withFlourish,
final PopupPresenter<SavedPageTitleInput, Optional<String>> presenter) {
if (dialog != null) throw new IllegalStateException("Already showing, can't show " + info);
final EditText input = new EditText(context);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
input.setLayoutParams(lp);
input.setText(info.savedPage.getName());
dialog = new AlertDialog.Builder(context).setTitle(info.title)
.setView(input) …Run Code Online (Sandbox Code Playgroud) 我有一个Mortar应用程序,MortarActivityScope是根范围内的第一个孩子.MortarActivityScope有一个ActivityScope,@为注入类提供一个活动:
@Module(addsTo = ApplicationModule.class, injects = {Foo.class, SomePresenter.class, AnotherPresenter.class})
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides Activity provideActivity() {
return activity;
}
}
public class Foo {
private final Activity activity;
@Inject(Activity activity) {
this.activity = activity;
}
public void doSomethingWithActivity() {
// do stuff with activity: findViewById(), getWindow(), mess with action bar etc.
}
}
Run Code Online (Sandbox Code Playgroud)
这种情况很好,直到方向发生变化.在Mortar示例项目中,不会在方向更改时销毁活动范围.这可能是为了让@Singleton演示者,屏幕等能够在方向变化中持续存在.您可以在示例项目的主要活动中的onDestroy()方法中看到这一点:
@Override protected void onDestroy() {
super.onDestroy();
actionBarOwner.dropView(this);
// activityScope may be null in …Run Code Online (Sandbox Code Playgroud) 我正在使用Flow和Mortar编写应用程序.当涉及带有标签的视图寻呼机时,我无法弄清楚如何使用它.
我能想到的唯一方法是将ViewPager屏幕视为单个屏幕,最后使用Fragments来构建它.但使用Flow&Mortar的重点是摆脱碎片并简化生命周期.
任何帮助表示赞赏.谢谢.
是否有关于如何在流程中构建子容器的文档?
例如,我有一个Master,一个Detail视图.
我打算添加一个弹出视图,它将拥有它自己的backstack.弹出窗口将用作向导,要求用户完成一些设置指令并显示为弹出窗口.
类似于下面的布局,除了还有一个主容器(完全显示抽屉布局)

怎么能实现这一目标?详细信息(或父级)容器是否需要知道弹出容器的存在?有点像这样吗?
@InjectView(R.id.master_container)
FramePathContainerView masterContainer;
@InjectView(R.id.detail_container)
FramePathContainerView detailContainer;
@InjectView(R.id.popup_container)
FramePathContainerView popupContainer;
@Override
public boolean onBackPressed() {
return BackSupport.onBackPressed(popupContainer)
|| BackSupport.onBackPressed(detailContainer);
}
@Override
public ViewGroup getCurrentChild() {
Paths.MasterDetailPath showing = Path.get(getContext());
return showing.isMaster() ? masterContainer.getCurrentChild()
: showing.isPopup() ? popupContainer.getCurrentChild()
: detailContainer.getCurrentChild();
}
Run Code Online (Sandbox Code Playgroud)
是应该做什么的?思考?