- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Mortar 和 Flow 来支持我的应用。如果我有以下 View :
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);
}
}
以及以下屏幕:
@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> {
private final SomeAsyncService service;
@Inject
Presenter() { }
@Override public void onLoad(Bundle savedInstanceState) {
}
@Override public void onSave(Bundle outState) {
}
}
}
现在我想访问使用此屏幕和 View 的 Activity 。我想访问一些 Activity 方法,例如:
getWindow()
finish()
getLayoutInflater()
getFragmentManager()
etc
我曾尝试在我的屏幕中转换这样的上下文:
Activity activity = (Activity)getView.getContext;
但这当然会引发以下异常:
java.lang.ClassCastException: mortar.MortarContextWrapper cannot be cast to
android.app.Activity
如何获得该 Activity ?谢谢。
最佳答案
不确定,但不建议 Mortar 直接使用 Activity 实例?
This mortal sample很有帮助。所以,我实现如下。
class WindowOwner extends Presenter<WindowOwner.Activity> {
interface Activity {
void addFragsToWindow(int flags);
}
public static class Config() {
final private int flags;
Config(int flags) { this.flags = flags; }
public int getFlags() { return this.flags; }
}
private Config config;
public void setConfig(Config config) {
this.config = config;
update();
}
private void update() {
WindowOwner.Activity activity = getView();
if (activity != null) {
activity.addFlagsToWindow(config.getFlags());
}
}
@dagger.Module(injects = {}, library = true)
public static class WindowOwnerModule {
@Provides
@Singleton
WindowOwner provideWindowOwnerPersenter() { return new WindowOwner(); }
}
}
您定义一个 WindowOwner.Module
,并像这样将此类包含到您的模块中。
@Module(injects = {}, library = true)
public class AndroidModule {
// WindowOwner provider
@Provides
@Singleton
SystemBarOwner provideWindowOwnerPersenter() {
return new WindowOwner();
}
}
@Module(
includes = {
AndroidModule.class, // Includes your modules
},
injects = {
MainApplication.class
},
library = true
)
public final class MainModule {
private final MainApplication mApplication;
public MainModule(MainApplication application) {
mApplication = application;
}
@Provides
@Singleton
Application provideApplication() {
return mApplication;
}
}
然后你像下面这样实现 Activivty。
class AwesomeActivity extends Activity implements WindowOwner.Activity {
@Inject WindowOwner windowOwner;
@Override
protected void onCreate(Bundle savedInstanceState) {
Mortar.inject(this, this);
this.windowOwner.takeView(this);
}
@Override
void addFragsToWindow(int flags) {
getWindow().addFlags(flags);
}
}
您可以通过 WindowOwner 使用
@Layout(R.layout.awesome_view)
public class AwesomeScreen implements Blueprint {
@Override
public String getMortarScopeName() {
return getClass().getName();
}
@Override
public Object getDaggerModule() {
return new Module(getViewState());
}
@dagger.Module(
injects = {
AwesomeView.class // inject your view
},
addsTo = MainModule.class,
library = true
)
public static class Module {
}
@Singleton
public static class Presenter extends ViewPresenter<AwesomeView> {
private final WindowOwner windowOwner;
@Inject
Presenter(WindowOwner windowOwner) {
this.windowOwner = systemBarOwner;
}
@Override
protected void onEnterScope(MortarScope scope) {
super.onEnterScope(scope);
// Update window flags via WindowOwner.Config
this.windowOwner.setConfig(new WindowOwner.Config(YOUR_FLAGS));
}
}
}
关于android - 在 Mortar 屏幕内获取 Activity 的推荐方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608108/
在 Mortar 中,如果 ActionBar 根据显示的屏幕发生变化,我很好奇人们如何处理它。例如,假设您想要在显示特定屏幕时更改 ActionBar 标题或操作。 注入(inject) Activ
我有一个使用 Mortar/Flow 和 Dagger 2 设置的应用程序。除了当我在同一类的两个 View 之间切换时,它似乎可以正常工作。新 View 以先前 View 的演示者结束。 例如,我有
我希望将应用程序与 Google Play 服务和 Mortar 集成以检索用户的当前位置。 https://developer.android.com/training/location/retri
我正在使用 Mortar 构建我的应用程序+ Flow .我试图找出正确的方法来显示一个弹出窗口,该弹出窗口请求用户提供一些文本。我创建了这个弹出类: public class SavedPageTi
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我将列表与带有 ViewHolder 的自定义适配器和带有按钮的项目 View 一起使用。我想通过单击 Presenter 中的按钮来处理一些事情。 如何将 Presenter 与这些 Item Vi
我正在尝试在我的应用程序中调整 Mortar&Flow,但遇到了一个问题,即我无法让 PageAdapter 与 Screens 一起工作,而不是与 Fragments 一起工作。 有人设法做对了吗?
我正在使用 Mortar 和 Flow 来支持我的应用。如果我有以下 View : public class MyView extends LinearLayout { @Inject MyScr
我想知道是否有任何为 Flow 和 Mortar Android 应用程序编写单元测试的示例。 MVP 模式的部分优势在于它提供了表示和 View 逻辑的分离,而表示逻辑是您要针对其编写测试的内容。我
一些第三方库在 Activity 生命周期中使用 Hook 来正常工作 - 例如,Facebook SDK (https://developers.facebook.com/docs/android/
所以我花了很多时间在 Mortar and Flow这个周末,我想我终于完成了大部分工作。我发现它比我最初想象的要复杂一些,主要是因为我还没有完全理解 Dagger 的 ObjectGraph 范围,
我正在寻找一种使用 Flow 从屏幕返回结果的方法不会丢失在上一个屏幕中构建的内容,类似于我对 onActivityResult 所做的。例如,这是我正在创建新文档的屏幕: @Layout(R.lay
我正在使用 Flow 和 Mortar 编写应用程序。当涉及到带有选项卡的 View 寻呼机时,我无法弄清楚如何使用它。 我能想到的唯一方法是将 ViewPager 屏幕视为单个屏幕,并最终使用 Fr
我正在尝试将 Acticity + Fragments 应用程序转换为 Flow + Mortar + Dagger2 我想在从一个屏幕跳到另一个屏幕(至少向后)时保存和恢复屏幕状态。首选/推荐的方法
我是一名优秀的程序员,十分优秀!