小编azi*_*ian的帖子

使用Mockito单独测试Fragment类

添加@VisibleForTesting并保护.我的测试现在可以这个方法:

   @VisibleForTesting
    protected void setupDataBinding(List<Recipe> recipeList) {
        recipeAdapter = new RecipeAdapter(recipeList);
        RecyclerView.LayoutManager layoutManager
                = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        rvRecipeList.setLayoutManager(layoutManager);
        rvRecipeList.setAdapter(recipeAdapter);
    }
Run Code Online (Sandbox Code Playgroud)

使用间谍对象更新了测试用例:但是,即使我创建了一个将被调用的间谍模拟,真正的setupDataBinding(配方)也会被调用.也许我做错了.

@Test
public void testShouldGetAllRecipes() {
    RecipeListView spy = Mockito.spy(fragment);
    doNothing().when(spy).setupDataBinding(recipe);

    fragment.displayRecipeData(recipe);

    verify(recipeItemClickListener, times(1)).onRecipeItemClick();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试测试我Fragment班上的方法,如下所示.但是,我试图模拟方法来验证方法被调用正确的次数.但是,问题是我有一个private方法setupDataBinding(...)设置RecyclerView调用来自displayRecipeData(...).我想模仿这些调用,因为我不想调用真正的对象RecyclerView.我只想验证setupDataBinding(...)被调用.

我曾尝试使用间谍VisibleForTesting,但仍不确定如何做到这一点.

我试图孤立地测试片段.

public class RecipeListView
        extends MvpFragment<RecipeListViewContract, RecipeListPresenterImp>
        implements RecipeListViewContract {

    @VisibleForTesting
    private void setupDataBinding(List<Recipe> recipeList) {
        recipeAdapter = new RecipeAdapter(recipeList);
        RecyclerView.LayoutManager layoutManager
                = new …
Run Code Online (Sandbox Code Playgroud)

java android unit-testing mockito android-testing

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

改造中依次有多个类似的请求

在Retrofit中,有什么方法可以依次执行多个请求吗?

这些请求使用相同的Java接口,只是它们所包含的参数有所不同ArrayList

对于请求A1,A2,A3,A4,A5 ...

  1. 打A1

onResponse()A1的2 。

  1. 打A2

2. onResponse()A2中的称为

  1. 打A3。

onResponse()被称为。

java android kotlin retrofit retrofit2

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

Topmost View因重叠而吞下触摸事件

所以这是我的布局结构:

- RelativeLayout (full screen)
  - FrameLayout (full screen)
  - Button (in the middle of the screen)
  - RecyclerView (align parent bottom but with very big padding top to 
    capture the scrolling also in the top of the screen, so it's basically acting like a full screen `RecyclerView`)
Run Code Online (Sandbox Code Playgroud)

所以是的,这些观点相互重叠.

由于RecyclerView它是最顶层的视图,它捕获屏幕上的所有触摸事件,并吞下它们,防止任何触摸"通过它"到它下面的底层视图.(注意:根据基本观点,我不是指RecyclerView孩子而是其他rootview's孩子)

我已经阅读了大量关于传播触摸事件和防止吞咽触摸事件等的stackoverflow帖子,即使看起来非常简单的任务,我也无法实现以下效果:

我想要我RecyclerView捕捉触摸事件,所以它会滚动或其他任何东西.但是我想要rootView认为RecyclerView没有捕获事件,并继续传递给其他孩子(rootview的孩子).

这是我试图做的事情:

1.重写dispatchTouchEventRecyclerView做它的逻辑并返回false作为它没有调度其触摸事件,因此rootview将继续迭代通过其子视图触摸.

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    super.dispatchTouchEvent(ev); …
Run Code Online (Sandbox Code Playgroud)

java android android-custom-view android-layout android-view

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

Gradle 3.0.0 alpha变体输出问题

我希望在构建类型中使用不同versionCodedebug构建类型而不是release构建类型.这曾经在Gradle Android插件v2.3.2(Gradle v3.3)中使用下面的配置工作,但现在在v3.0.0-alpha5(Gradle v4.1-milestone-1)中没有任何效果.关于最新的Gradle插件中哪些内容发生了变化的想法让它忽略了variant.mergedFlavor.versionCode属性?

buildTypes {    
      debug {
                applicationIdSuffix ".debug"
                versionNameSuffix "-" + buildTime()
                android.applicationVariants.all { variant ->
                    if (variant.buildType.name != buildTypes.debug.name) return
                    variant.outputs.all {
                        outputFileName = "${archivesBaseName}-${variant.name}-v${variant.versionName}-signed.apk"
                        variant.mergedFlavor.versionCode = Integer.parseInt(buildTimeSmall())
                    }
                }
            }
}
Run Code Online (Sandbox Code Playgroud)

groovy android gradle build.gradle android-gradle-plugin

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

如何从屏幕的底部到顶部为ConstraintLayout设置动画?

我一直在寻找ConstraintLayout从A点到B点动画对象的最简单方法,能够改变其持续时间和加速度.例如,在屏幕上设置约束的情况下,将布局/视图从屏幕底部移动到其预期位置.我无法找到如何为对象做到这一点ConstraintLayout.任何人都可以指出我正确的方向?谢谢.

animation android android-animation kotlin android-constraintlayout

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

重新启动AnimatedVectorDrawableCompat的AnimatorSet

这是我需要实现的效果AnimatedVectorDrawableCompat

vector_drawable_anim.xml

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                 android:drawable="@drawable/vector_drawable">
    <target
        android:name="star"
        android:animation="@animator/star_anim"/>
</animated-vector>
Run Code Online (Sandbox Code Playgroud)

vector_drawable.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="500px"
        android:height="500px"
        android:viewportHeight="500"
        android:viewportWidth="500">
    <group
        android:name="star_group"
        android:scaleX="5.0"
        android:scaleY="5.0">
        <path
            android:name="star"
            android:pathData="M 50.0,90.0 L 82.9193546357,27.2774101308 L 12.5993502926,35.8158045183 Z"
            android:strokeColor="@color/colorAccent"
            android:strokeWidth="1"/>
    </group>
</vector>
Run Code Online (Sandbox Code Playgroud)

star_anim.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="sequentially">

    <objectAnimator
        android:duration="1000"
        android:propertyName="trimPathStart"
        android:valueFrom="1"
        android:valueTo="0"/>

    <objectAnimator
        android:duration="1000"
        android:propertyName="trimPathEnd"
        android:valueFrom="1"
        android:valueTo="0"/>

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

但是AnimatorSet不能设置repeatMode

如果我设置objectAnimatorrepeatMode,第二个objectAnimator将不显示。

我该怎么办?

android android-animation android-vectordrawable animatorset

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

当你没有使用unbind()时会发生什么?

我有一个应用程序,我使用Butterknife,最近我发现了一个片段,我没有unbinder.unbind()在片段中调用onDestroyView().我解决了这个问题,但这让我开始思考.

这会导致什么样的错误?为什么?我现在没有特别的错误,但我想知道将来要注意什么,并且图书馆的网站没有说明这可能导致的问题.

android android-layout android-view butterknife

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

Android上的硬件层和硬件加速

我刚刚阅读了有关硬件加速的内容,并观看了该视频。现在我有点困惑。

硬件加速意味着绘图操作由GPU执行,并且默认情况下在Android 3.0+上启用。如果启用了硬件加速,为什么默认情况下View的图层类型为LAYER_TYPE_NONE?我认为应该是LAYER_TYPE_HARDWARE

硬件层必须做一些事情来保持View屏幕外的缓冲区。

因此,它看起来像常量View.LAYER_TYPE_NONE,,View.LAYER_TYPE_HARDWAREView.LAYER_TYPE_SOFTWARE硬件加速无关。它们是关于将其保留View在屏幕外缓冲区中,以避免每次View透明性和其他一些属性更改时都进行绘制。

android drawing hardware-acceleration android-canvas android-view

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

圆角 ItemDecoration

我有一个RecyclerViewwith GridLayoutManager,其中包含各种ViewTypes(以及SpanSizes )的项目。我需要为所有R.layout.item_image类型圆角,如下图所示

圆角示例

所以我创建了一个ItemDecoration计算Rect这些项目将被绘制的对象。然后将其剪辑Canvas到此Rect(用于Path圆角):

public class RoundCornersDecoration extends RecyclerView.ItemDecoration {
    private final float radius;
    private final RectF defaultRectToClip;

    public RoundCornersDecoration(float radius) {
        this.radius = radius;
        defaultRectToClip = new RectF(Float.MAX_VALUE, Float.MAX_VALUE, 0, 0);
    }

    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        final RectF rectToClip = getRectToClip(parent);

        // has no items with ViewType == `R.layout.item_image`
        if (rectToClip.equals(defaultRectToClip)) {
            return;
        } …
Run Code Online (Sandbox Code Playgroud)

android android-custom-view android-canvas android-view android-recyclerview

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

Loader <Cursor>仅加载选定的行+下一行

活动A中,我正在加载一个包含我表中所有值的列表,并设置了一个setOnItemClickListener来启动活动B并通过发送数据发送带有所选项的id [ 1 ] 的uri

[ 1 ] Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);

活动B中,我的onCreateLoader包含投影:

String[] projection = {
       TestEntry._ID,
       TestEntry.COLUMN_TEST_ONE,
       TestEntry.COLUMN_TEST_TWO}
Run Code Online (Sandbox Code Playgroud)

...带有return语句

return new CursorLoader(this,  
    mCurrentTestUri, //Got this from Activity A         
    projection,             
    null,                   
    null,                   
    null);  
Run Code Online (Sandbox Code Playgroud)

我的onLoadFinished看起来像这样:

if (cursor.moveToFirst()) {
      int oneColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
      int twoColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_TWO);

      String currentOne = cursor.getString(oneColumnIndex);
      String currentTwo = cursor.getString(twoColumnIndex);

      textViewOne.setText(currentOne);
      textViewTwo.setText(currentTwo);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,现在我希望显示下一行(右下方)的值,但是使用不同的投影(我只需要_IDCOLUMN_TEST_ONE)并且onLoadFinished显示COLUMN_TEST_ONE的值textViewThree.

[两行的值应该同时显示,而不是一个或另一个]

我可以使用[ …

sqlite android android-cursorloader android-loader android-sqlite

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