我有一个带有大量字符串的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值.怎么做?
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.这构建很好,但是需要访问资源的单元测试仍然无法正常工作.
这是我在处理真实应用程序时发现的"错误",但我创建了一个空白项目来重现它.
我有以下布局:
<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 …
我有以下方法使用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) 给定以下 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?
我的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脚本访问它们的任何建议?
我可以从那里访问构建类型和产品口味,所以应该可以吗?
我们在 Google Play 商店中有一个应用程序,我们以后将不再支持该应用程序。
用户可以购买应用程序内容的订阅。
我们要取消所有正在运行的订阅并向用户退款。
Google Play Developer Api 提供了revoke方法,该方法需要单个订阅的详细信息(订阅 ID、令牌),并将取消和退还该订阅。
我们必须为数千名用户这样做(可能通过脚本)。
有没有更好的方法来撤销所有订阅?有人可能遇到过类似的情况吗?
in-app-purchase in-app-billing google-play google-play-developer-api
我想向接口添加一个函数,该函数返回具体实现的对象。
因此,使用界面:
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) 鉴于我有两个列表:
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) 我可以这样创建一个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 ×6
gradle ×2
kotlin ×2
deep-linking ×1
generics ×1
google-play ×1
jacoco ×1
java ×1
mockito ×1
reflection ×1
rx-java ×1