小编asc*_*sco的帖子

通过反射获取String变量的值

我有一个带有大量字符串的POJO,我想要一个简单的方法来检查它们是否都是空的/包含某个字符/什么.

我用这个得到String变量:

    Field[] fields = this.getClass().getDeclaredFields();

    for (Field f : fields) {

        if (f.getType() == java.lang.String.class) {
            Log.d("REF", "Field: " + f.getName());
        }

    }
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获得Field的String值.怎么做?

java reflection

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

运行单元测试时无法获得任何资源

Android Studio中存在一个已知错误,即测试类中无法提供应用程序的资源.

根据上述线程的解决方案是将以下行放入build.gradle:

task copyTestResources(type: Copy) {
    from "${projectDir}/src/test/resources"
    into "${buildDir}/classes/test"
}
processTestResources.dependsOn copyTestResources
Run Code Online (Sandbox Code Playgroud)

但格拉德说:

Error:(132, 0) Could not find property 'processTestResources' on project ':app'.
Run Code Online (Sandbox Code Playgroud)

我到底在哪里放线

processTestResources.dependsOn copyTestResources
Run Code Online (Sandbox Code Playgroud)

在我的build.gradle中?

编辑:

我还没有apply plugin: 'java'在我的构建文件中.问题是在我的app模块的构建gradle中,我已经apply plugin: 'android'尝试添加java插件导致

Error:The 'java' plugin has been applied, but it is not compatible with the Android plugins.
Run Code Online (Sandbox Code Playgroud)

apply plugin: 'java'在顶级构建文件中尝试了puttin 然后

task copyTestResources(type: Copy) {
    from "${projectDir}/app/src/test/resources"
    into "${buildDir}/classes/test"
}
Run Code Online (Sandbox Code Playgroud)

请注意,我将modules目录添加到了from-line.这构建很好,但是需要访问资源的单元测试仍然无法正常工作.

android gradle android-studio

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

EditText的子类看起来与Android 4上的普通EditText不同

这是我在处理真实应用程序时发现的"错误",但我创建了一个空白项目来重现它.

我有以下布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:id="@+id/root"
    android:orientation="vertical"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.example.test.testapp.MyEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


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

这个类MyEditText 看起来像这样:

public class MyEditText extends EditText {

    public MyEditText(Context context){
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs){
        super(context, attrs);
    }


    public MyEditText(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }


}
Run Code Online (Sandbox Code Playgroud)

styles.xml除主题外,我的文件为空

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

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

我希望它MyEditText看起来像普通的EditText …

android android-custom-view android-layout android-edittext

5
推荐指数
2
解决办法
1085
查看次数

验证在RxJava订阅服务器的onNext中调用该方法

我有以下方法使用Retrofit服务接口从API获取一些数据,然后与view接口交互.

@Override
@VisibleForTesting
public void fetchPhotos(@Nullable PhotosService service, @Nullable Scheduler subscribeOn) {
    view.showLoading();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.PLACEHOLDER_API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

    if (service == null) service = retrofit.create(PhotosService.class);
    if (subscribeOn == null) subscribeOn = Schedulers.newThread();

    service.listPhotos()
            .subscribeOn(subscribeOn)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(photoList -> {
                Log.d(TAG, "got photos " + photoList.toString());
                view.unshowLoading();
            }, throwable -> {
                Log.d(TAG, "error " + throwable.toString());
                view.unshowLoading();
                view.displayError(throwable.toString(), v -> fetchPhotos());
            });
}
Run Code Online (Sandbox Code Playgroud)

我想测试view.unshowLoading()onNext中调用的那个.

这是我的测试:

@Test
public void viewUnshowsLoadingAfterFetchingPhotos() {

    PhotosListView view …
Run Code Online (Sandbox Code Playgroud)

android mockito rx-java

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

Android 深层链接:仅在没有路径时匹配 url

给定以下 URL:

1. www.example.com

2. www.example.com/a
Run Code Online (Sandbox Code Playgroud)

通过深层链接,我希望我的应用程序只对 作出反应1而不对 2.

            <data
                android:host="*.example.com"
                android:pathPrefix="/"
                android:scheme="http"/>
Run Code Online (Sandbox Code Playgroud)

当然,这将捕获所有www.example.com/...网址,我如何仅在www.example.com没有任何路径的情况下匹配而不匹配www.example.com/a

android deep-linking android-manifest

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

根据产品风味尺寸创建gradle任务

我的build.gradle中有以下productFlavors:

productFlavors {

    free {

    }
    paid {

    }       
}
Run Code Online (Sandbox Code Playgroud)

现在,我添加了一个flavorDimension(http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Multi-flavor-variants),如下所示:

flavorDimensions "payment", "releasetype"

productFlavors {

    paid {
        dimension "payment"
    }
    free {
        dimension "payment"
    }
    beta {
        dimension "releasetype"
    }

    major {
        dimension "releasetype"
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此脚本为jacoco覆盖率报告生成gradle任务。该脚本将构建类型(调试,发布)与产品风格(付费,免费,...)结合在一起,并相应地生成任务。

当然,这是由于风味尺寸而造成的,因为脚本未将它们考虑在内。

该脚本生成任务:

testDebugPaidUnitTestCoverage
testDebugFreeUnitTestCoverage
testDebugBetaUnitTestCoverage
testDebugMajorUnitTestCoverage
Run Code Online (Sandbox Code Playgroud)

它应该做的是:

testDebugPaidBetaUnitTestCoverage
testDebugPaidMajorUnitTestCoverage
...
Run Code Online (Sandbox Code Playgroud)

我试图通过gradle任务访问flavorDimensions

android.flavorDimensions
Run Code Online (Sandbox Code Playgroud)

但无法识别该属性:

Error:Could not get unknown property 'flavorDimensions' for object of type com.android.build.gradle.LibraryExtension.
Run Code Online (Sandbox Code Playgroud)

关于如何扩展此脚本以使其与风味尺寸一起使用或如何从外部jacoco.gradle脚本访问它们的任何建议?

我可以从那里访问构建类型和产品口味,所以应该可以吗?

android gradle jacoco android-gradle-plugin

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

取消并退还所有 google play 订阅

我们在 Google Play 商店中有一个应用程序,我们以后将不再支持该应用程序。

用户可以购买应用程序内容的订阅。

我们要取消所有正在运行的订阅并向用户退款。

Google Play Developer Api 提供了revoke方法,该方法需要单个订阅的详细信息(订阅 ID、令牌),并将取消和退还该订阅。

我们必须为数千名用户这样做(可能通过脚本)。

有没有更好的方法来撤销所有订阅?有人可能遇到过类似的情况吗?

in-app-purchase in-app-billing google-play google-play-developer-api

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

接口中的泛型函数以返回具体实现

我想向接口添加一个函数,该函数返回具体实现的对象。

因此,使用界面:

interface Content {
        fun <???> cloneMe(): ?
}
Run Code Online (Sandbox Code Playgroud)

和班级

class Music: Content
class Video: Content
Run Code Online (Sandbox Code Playgroud)

该功能cloneMe()的的Music类应该返回一个Music对象和函数cloneMe()中的Video类应返回一个Video对象。

我最接近的是:

interface Content {
    fun <T: Content> cloneMe(): T
}

class Music : Content {
    override fun <T : Content> cloneMe(): T {
        return Music() as T
    }
}
Run Code Online (Sandbox Code Playgroud)

那我就可以

val music: Music = Music().cloneMe<Music>()
Run Code Online (Sandbox Code Playgroud)

这里的问题是我必须进行未经检查的强制转换,“允许我”(即可以编译)执行

class Music : Content {
        override fun <T : Content> cloneMe(): T {
            return …
Run Code Online (Sandbox Code Playgroud)

generics kotlin kotlin-generics

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

两个列表的所有可能组合

鉴于我有两个列表:

val ints = listOf(0, 1, 2)
val strings = listOf("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)

我想要所有可能的元素组合

0a, 1a, 2a, 0b 等等

是否有比以下更优雅的方式:

ints.forEach { int -> 

    strings.forEach { string ->  


        println("$int $string")

    }

}
Run Code Online (Sandbox Code Playgroud)

kotlin

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

每个活动的自定义DataBindingComponent

我可以这样创建一个BindingAdapter

public class MyClass {

  @BindingAdapter("bindItems")
  public static void bindItems(ViewPager viewPager, List<String> items) {

  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我不希望此绑定方法是静态的,而是希望封闭类的实例方法,则只需忽略static关键字:

public class MyClass {

  @BindingAdapter("bindItems")
  public void bindItems(ViewPager viewPager, List<String> items) {

  }
}
Run Code Online (Sandbox Code Playgroud)

但随后,我必须为数据绑定框架提供一种方法,以获取包含@BindingAdapter方法(MyClass)的类的实例。

使用DataBindingComponent的自定义实现可以实现这一点,如下所示:

public class MyDatabindingComponent implements android.databinding.DataBindingComponent {

  public getMyClass() {
    return new MyClass(); 
  }
}
Run Code Online (Sandbox Code Playgroud)

并且在设置“活动”的内容视图时使用,例如:

DataBindingUtil.setContentView(this, R.layout.activity_test, new MyDatabindingComponent);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利...但是! 此自定义DataBindingComponent必须@BindingAdapter使用整个应用程序的非静态方法创建类的实例。

这很快就会失控,特别是当实例的创建不像我的例子那么简单时。我知道我可以使用DI,例如Dagger来更轻松地创建MyDataBindingComponent,但我仍然不满意将很多东西注入到我的Activity中,而在该特定Activity中并不需要很多东西。

失去控制的DataBindingComponent的示例

public class MyDatabindingComponent implements android.databinding.DataBindingComponent {

  MyClass myClass;
  MyClass2 myClass2;
  MyClass3 myClass3; …
Run Code Online (Sandbox Code Playgroud)

android android-databinding

5
推荐指数
0
解决办法
222
查看次数