我有一个关于android ViewModels的架构问题:
假设我的应用程序中有一个包含两个片段的Activity(使用Viewpager).这两个片段做了不同的事情(因此可能有自己的ViewModel?),但它们也需要各种类似的数据.
例如,如果网络连接可用或不存在(并且两个片段在没有连接的情况下显示不同的错误UI),或者某些用户设置来自服务器并且同等地影响两个片段,则这是状态.
这看起来像这样:
现在我的问题是如何在使用ViewModels时处理这种情况?视图是否观察多个ViewModel是好的,就像我有一个ViewModel用于Activity(保持两个都需要的状态)和每个片段一个,如下所示:
这在这里暗示,但这不是一个好的做法,因为MVVM中的关系通常是
查看n - 1 ViewModel n - 1模型
但我不确定这种共享LiveData的正确位置在哪里?
我有一个布局(由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 上的 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,点击是正确的,测试工作!有谁知道这里的问题是什么或如何解决它?
我有多个在 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) 数据库: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状态。我怎样才能做到这一点?还是有人对此有更好的解决方案?
我正在尝试包含这个admob插件.
我已经尝试了一切,但无论我做什么,window.plugins.AdMob总是未定义的.我在我的Android设备和ios模拟器上检查了它(我知道它在浏览器中不起作用).
我做了什么:我使用以下命令添加了插件:cordova plugin add com.google.cordova.admob
然后我尝试按照插件中的说明操作,但也使用了此处的代码示例.
但无论我做什么,window.plugins.AdMob总是未定义的.
我也尝试加载3000ms超时(因为一些答案说插件最初没有准备好并需要一些时间).
我真的不知道下一步该尝试什么或我错过了哪一步.我也尝试了谷歌分析插件,并按照这里的教程,但再次,"分析"对象是未定义的.我在这里想念什么?