小编sta*_*uel的帖子

Android MVVM:具有多个片段的活动 - 在何处放置共享的LiveData?

我有一个关于android ViewModels的架构问题:

假设我的应用程序中有一个包含两个片段的Activity(使用Viewpager).这两个片段做了不同的事情(因此可能有自己的ViewModel?),但它们也需要各种类似的数据.

例如,如果网络连接可用或不存在(并且两个片段在没有连接的情况下显示不同的错误UI),或者某些用户设置来自服务器并且同等地影响两个片段,则这是状态.

这看起来像这样:

在此输入图像描述

现在我的问题是如何在使用ViewModels时处理这种情况?视图是否观察多个ViewModel是好的,就像我有一个ViewModel用于Activity(保持两个都需要的状态)和每个片段一个,如下所示:

在此输入图像描述

这在这里暗示,但这不是一个好的做法,因为MVVM中关系通常是

查看n - 1 ViewModel n - 1模型

但我不确定这种共享LiveData的正确位置在哪里?

android mvvm android-viewmodel

28
推荐指数
2
解决办法
4708
查看次数

使用CoordinatorLayout在滚动RecyclerView时隐藏/显示RelativeLayout

我有一个布局(由android studio生成),我在AppBarLayout中添加了一个RelativeLayout.代码如下,它看起来像这样:

在此输入图像描述

我被卡住的地方:我想要实现的是当滚动Recyclerview时我希望绿色相对布局(具有id'controlContainer')与它一起滚动,当我向上滚动它应该滚动(不仅仅是在顶部但在任何地方我在列表中向上滚动)

顶部的工具栏应保持原样.

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        />

    <RelativeLayout
        android:id="@+id/controlContainer"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@android:color/holo_green_dark"
        app:layout_scrollFlags="scroll|enterAlways"></RelativeLayout>

</android.support.design.widget.AppBarLayout>


<FrameLayout
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <include layout="@layout/venue_list" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

我认为app:layout_scrollFlags="scroll|enterAlways"在应该滚动的视图中使用app:layout_behavior="@string/appbar_scrolling_view_behavior"应该实现,但它没有做任何事情.或者,当我将这些字段添加到工具栏本身时,两个布局都会滚动 - 这不是我想要的,我希望工具栏始终保持固定.

如果有人能指出我在这里正确的方向会很好吗?(我希望有可能使用协调器布局而不是使用onscroll侦听器进行一些布局操作?)

android coordinator-layout

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

Android Espresso 点击 ImageButton 点击​​错误位置

当我尝试单击图像按钮时,android 上的 espresso UI 测试出现问题:

我有以下布局:

<LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="#FFFFFF">

        <ImageButton
                android:id="@+id/parent_task_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="#00000000"
                android:rotation="90"
                android:layout_gravity="center_vertical"
                android:src="@drawable/ic_subdirectory_arrow_left_black_24dp"
                android:paddingRight="10dp"
                android:paddingLeft="12dp"/>

        <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@color/layout_divider"></View>

        <com.mypackage.ui.TasklistItem
                android:id="@+id/parent_task_item"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

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

在我的应用程序中,这看起来像这样:

在此处输入图片说明

在我的浓缩咖啡测试中,我尝试单击其中的按钮(带箭头的按钮):

onView(withId(R.id.parent_task_button)).perform(click());
Run Code Online (Sandbox Code Playgroud)

但点击没有按预期工作。我逐步完成了(启用了 android“Show Taps”和“Pointer location”开发人员设置),结果发现测试没有点击图像按钮的中心,而是点击这里:

在此处输入图片说明

...正好在分隔线上,但不在 ImageButton 的中心。

如果我用普通按钮替换 ImageButton,点击是正确的,测试工作!有谁知道这里的问题是什么或如何解决它?

android android-espresso

3
推荐指数
1
解决办法
1021
查看次数

Android Espresso:测试动态创建的未分配 ID 的按钮

我有多个在 for 循环中动态创建的按钮,并且没有 ID。我需要对这些按钮进行自动化测试。我怎样才能用浓缩咖啡做到这一点?这是创建各种按钮的 for 循环:

 for (int i = 0; i < numberOfSamples; i++) {
            TableRow.LayoutParams vl = new TableRow.LayoutParams(30,30);
            Button b = new Button(context);
            b.setId(((blockNumber * 10000)+i));
            //b.setHint(i);
            //b.setHint(blockNumber);
    //      double selectedGrade = 0;
    //      if(FinalSurvey.multi[blockNumber][i] != 0){
    //          selectedGrade = FinalSurvey.multi[blockNumber][i];
    //      }
    //      final int makeHighlight = selectedGrade;
            b.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.a));
            b.setAlpha(1.0f);
            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    ViewsAdding va = new ViewsAdding();
                    va.showGrades(context, v, grades);
                    view = v;
                    maincontext = context;
                }
            });

            if(i%5 …
Run Code Online (Sandbox Code Playgroud)

android android-espresso

3
推荐指数
1
解决办法
1821
查看次数

在开始Espresso测试之前如何准备数据库数据?

数据库:SQLite

表:联系方式

浓咖啡测试:

@Test
public void testBlock() {
   onData(anything()).inAdapterView(withId(R.id.container_ListView)).atPosition(0).onChildView(withText(R.string.block_user))
            .perform(click());
}
Run Code Online (Sandbox Code Playgroud)

并且测试成功通过。但是,只有在开始联系之前状态已解除阻止(数据库表中的列状态)时,它才会成功。因此,我需要(开始测试之前)将此联系人更新为unblock状态。我怎样才能做到这一点?还是有人对此有更好的解决方案?

android android-testing android-espresso

3
推荐指数
1
解决办法
1379
查看次数

window.plugins.AdMob在离子应用程序中始终未定义

我正在尝试包含这个admob插件.

我已经尝试了一切,但无论我做什么,window.plugins.AdMob总是未定义的.我在我的Android设备和ios模拟器上检查了它(我知道它在浏览器中不起作用).

我做了什么:我使用以下命令添加了插件:cordova plugin add com.google.cordova.admob

然后我尝试按照插件中的说明操作,但也使用了此处的代码示例.

但无论我做什么,window.plugins.AdMob总是未定义的.

我也尝试加载3000ms超时(因为一些答案说插件最初没有准备好并需要一些时间).

我真的不知道下一步该尝试什么或我错过了哪一步.我也尝试了谷歌分析插件,并按照这里的教程,但再次,"分析"对象是未定义的.我在这里想念什么?

admob angularjs cordova ionic-framework

2
推荐指数
1
解决办法
2085
查看次数