小编jom*_*mni的帖子

匕首2单身人士不工作

使用Dagger 2,我试图在单个范围内的多个位置注入单个对象.但是,似乎我的解决方案每次都会创建一个新实例.

在这个测试项目中,我有一个MainActivity初始化DaggerModule.DaggerModule提供Box和Cat对象,Box以Cat为参数.我也在我的MainActivity中接受了Cat.最后,我检查了注入的两个Cat变量的引用(分别在Box和MainActivity中),但它们不是同一个实例.

如果我在MainActivity中调用了两次provideCat(),则会提供相同的实例.

主要活动:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerModule daggerModule = new DaggerModule();
        DaggerComponent daggerComponent = Dagger_DaggerComponent.builder()
                .daggerModule(daggerModule).build();

        // Same Cat instance returned.
        Cat cat1 = daggerComponent.provideCat();
        Cat cat2 = daggerComponent.provideCat();
        Log.d("=== cat1: ", cat1.toString());
        Log.d("=== cat2: ", cat2.toString());

        // Different Cat instance returned. Why?
        Box box = daggerComponent.provideBox();
        Log.d("=== box cat: ", box.getCat().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)
@Module
public class DaggerModule {

    @Provides
    @Singleton
    public Cat provideCat() {
        return new …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger-2

12
推荐指数
1
解决办法
7286
查看次数

使用支持库时更改popupmenu背景颜色

我正在尝试使用Android支持库v7更改操作栏中弹出菜单的背景颜色.我一直在尝试我发现的各种建议的解决方案,但没有一个有效,弹出菜单背景根本不会改变主题的标准颜色.这是我到目前为止所做的:

AndroidManifest:

android:theme="@style/MyTheme" >
Run Code Online (Sandbox Code Playgroud)

值/的themes.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="MyTheme" parent="@style/Theme.AppCompat">
        <item name="popupMenuStyle">@style/MyPopupMenu</item>
    </style>

    <style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
        <item name="background">#ffffff</item>
    </style>

</resources>
Run Code Online (Sandbox Code Playgroud)

values-11和values-14文件夹也各有一个主题文件,区别在于popupMenuStyle和background属性被写为android:popupMenuStyle和android:background,因为它们不应该使用支持库.

提前致谢.

android android-layout android-support-library android-styles

7
推荐指数
1
解决办法
3714
查看次数

重定向到ACS并返回后,Cookie在极少数情况下为空

在我的网站上,有一个注册表.填写完成后,用户将被重定向到Azure ACS以便登录.登录后,用户将被重定向回我的网站并进行注册和登录.

注册表由JavaScript提交.用户填写的信息通过RegisterController中的RedirectToProvider方法保存到cookie中,用户被重定向到ACS.当用户从ACS重定向回网站时,然后通过RegisterController中的RegisterUser方法读取cookie.问题是:这在95%的时间都有效.5%的时间,当用户回来时,cookie为空.我一直无法追踪原因,我想知道是否有任何已知的问题或我可能会监督的事情.表单代码如下所示:

@using (Html.BeginForm("RedirectToProvider", "Register", FormMethod.Post, new { id = "registerForm" }))

    ... various fields...

    <input type="button" class="btn" id="registerSubmitButton" value="Register" onclick="RegisterRedirect()" />
}
Run Code Online (Sandbox Code Playgroud)

提交表单的RegisterRedirect()JavaScript(此处省略了相关的功能):

var RegisterRedirect = function () {
    $("#registerForm").valid();
    $("#registerForm").submit();
}
Run Code Online (Sandbox Code Playgroud)

RegisterController中的RedirectToProvider方法:

[AllowAnonymous]
[HttpPost]
public ActionResult RedirectToProvider(RegisterViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var providerUrl = viewModel.SelectedProviderUrl;
        viewModel.SelectedProviderUrl = "";

        var json = JsonConvert.SerializeObject(viewModel);

        try
        {
            var cookie = new HttpCookie("RegisterViewModel", json)
                {
                    Expires = DateTime.Now.AddMinutes(10)
                };
            ControllerContext.HttpContext.Response.Cookies.Add(cookie);
        }
        catch (FormatException)
        {
            return RedirectToAction("Index", "Error", new { reason …
Run Code Online (Sandbox Code Playgroud)

c# cookies azure razor acs

5
推荐指数
1
解决办法
217
查看次数

使用Robolectric进行配置更改

为了在配置更改中保留我的AsyncTasks,我使用基于片段的解决方案和setRetainInstance(true),它托管每个AsyncTask并回调一个监听活动,类似于此解决方案http://www.androiddesignpatterns.com/2013/04 /retaining-objects-across-config-changes.html

最终,目的是使用Robolectric在整个配置更改中测试AsyncTask的保留功能,但我需要从正确设置实际配置更改开始.但是,似乎我无法模仿配置更改期间发生的确切参考行为.


真正的应用程序:在运行真正的应用程序时,在配置更改时,在保留Fragment时销毁并重新创建Activity,因此它似乎正在工作.我可以通过在配置更改之前和之后检查它们的引用来看到这一点(下面使用的示例引用):

  • 真正的应用程序,之前: 活动: abc 片段: xyz

  • 真正的应用程序,之后: 活动: bca 片段: xyz(正确保留和重新附加)


情况1:然而,当在Robolectric测试中对Activity运行recreate()时,Activity似乎没有正确地重新创建其实例(尽管文档说该方法执行所有生命周期调用):

mActivityController =
Robolectric.buildActivity(AsyncTaskTestActivity.class).attach().create().start().resume().visible();

mActivity = mActivityController.get();
mActivity.recreate();
Run Code Online (Sandbox Code Playgroud)
  • Robolectric与recreate(),之前: 活动: abc 片段: xyz

  • Robolectric with recreate(),在Activity之后 : abc Fragment: xyz

这使我相信没有正确创建新的Activity实例,因此重新附加功能没有以真实的方式发生.


案例2:如果我根据个别生命周期调用创建测试:

mActivityController = Robolectric.buildActivity(AsyncTaskTestActivity.class).attach().create().start().resume().visible();
mActivityController.pause().stop().destroy();
mActivityController = Robolectric.buildActivity(AsyncTaskTestActivity.class).attach().create().start().resume().visible();
Run Code Online (Sandbox Code Playgroud)

在这个版本中,似乎Activity从头开始完全替换,但片段也是如此:

  • Robolectric具有单独的生命周期调用,在Activity之前 : abc Fragment: xyz

  • Robolectric有独立的生命周期通话,后 活动: BCA 片段: YZX


看来我要么重用相同的Activity(案例1),要么用新实例替换所有内容,好像没有底层应用程序保留Fragment(案例2).

问题:有没有什么方法可以设置我的Robolectric测试来模仿在实际Android环境中运行应用程序时获得的参考结果(根据Real应用程序结果),或者我是否仍然坚持要么创建一个单独的测试应用程序或者使用Robotium功能测试解决?我尝试这样做/sf/answers/1852780751/,但得到了与我的情况2相同的结果.

提前致谢!

android android-lifecycle android-fragments robolectric android-testing

5
推荐指数
1
解决办法
1069
查看次数