小编Ben*_*654的帖子

Android - 如何使用AppCompatDelegate.MODE_NIGHT_AUTO检测夜间模式是否打开

我正在使用Androids内置的日/夜模式功能,我想为我的应用添加一个选项 AppCompatDelegate.MODE_NIGHT_AUTO

我遇到了问题,因为我的应用程序需要以编程方式对某些内容进行着色,而我无法弄清楚如何检查应用程序是在夜间还是白天模式中考虑自己.没有它,我不能设置标志来选择正确的颜色.

调用AppCompatDelegate.getDefaultNightMode()只返回无用的AppCompatDelegate.MODE_NIGHT_AUTO.

我没有看到任何可以告诉我的东西,但一定有什么东西?

android android-night-mode

24
推荐指数
6
解决办法
5185
查看次数

Kotlin 协程单元测试错误:线程“main @coroutine#1 @coroutine#2”中的异常 java.lang.NullPointerException

我正在尝试对我用 Kotlin 协程制作的演示器进行单元测试,这也是我第一次使用 Mockito

每当我尝试运行单元测试时,我第一次尝试在协程中对我的视图执行任何操作时都会收到以下错误

Exception in thread "main @coroutine#1 @coroutine#2" java.lang.NullPointerException
    at .signin.SignInPresenter$subscribe$1.doResume(SignInPresenter.kt:45)
    at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:54)
    at kotlinx.coroutines.experimental.DispatchedKt.resumeCancellable(Dispatched.kt:208)
    at kotlinx.coroutines.experimental.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:35)
    at kotlinx.coroutines.experimental.CoroutineStart.invoke(CoroutineStart.kt:111)
    at kotlinx.coroutines.experimental.AbstractCoroutine.start(AbstractCoroutine.kt:161)
    at kotlinx.coroutines.experimental.BuildersKt.launch(Builders.kt:68)
    at kotlinx.coroutines.experimental.BuildersKt.launch$default(Builders.kt:61)
    at .signin.SignInPresenter.subscribe(SignInPresenter.kt:42)
Run Code Online (Sandbox Code Playgroud)

这是我的演示者的相关部分,错误中引用的行是 view.showSigninPanel

class SignInPresenter(
    private val view: SignInContract.View,
    private val userRepo: ParseAuthController,
    private val contextPool: CoroutineContextProvider
) : SignInContract.Presenter {

    private val coroutineJobs: MutableList<Job> = mutableListOf()

    override fun subscribe() {
        view.loadBackgroundImage()
        view.setUpSignInPanel()
        view.setUpKeyboardListener()

        coroutineJobs.add(launch(contextPool.Main) {
            if (!userRepo.isAuthenticated()) {
                view.showSignInPanel()
                subscribeToLoginValidation()
                subscribeToPaswordEmailValidation()
            } else {
                view.launchMainActivity()
            }
        })
    }
Run Code Online (Sandbox Code Playgroud)

呼叫userRepo.isAuthenticated() …

android unit-testing mockito kotlin kotlinx.coroutines

14
推荐指数
1
解决办法
5101
查看次数

内联函数导致单元测试代码覆盖率报告中的错误

我正在为用Kotlin编写的Android应用程序编写一些单元测试,并且从包含的内联集合函数中得到了错误,在这种情况下,我特别对sortedBy进行了排序。

 override fun onDaysSelected(dayOfWeekList: ArrayList<DayOfWeek>) {
        view.userRoutingRule.days = dayOfWeekList.sortedBy { it.dayOfWeek }
        renderRule()
 }
Run Code Online (Sandbox Code Playgroud)

这是我在覆盖范围内运行单元测试时遇到的错误

---- IntelliJ IDEA覆盖运行程序----采样...包括模式:com.mypackage .. *排除模式:[2019.02.02 14:49:40](覆盖):未提取类数据:com。 mypackage \ myfile $ onDaysSelected $$ inlined $ sortedBy $ 1:java.lang.Throwable

流程结束,退出代码为0

我的单元测试相应地通过了所有测试,但是当我查看覆盖率报告时,由于该错误使它无法完成,因此几乎是完全裸露的。

现在有什么解决办法吗?如果我不能仅仅看一下报告,就很难知道我是否错过了某些条件。

junit android kotlin

8
推荐指数
1
解决办法
473
查看次数

Android支持注释@StringDef在.aar文件中导出时无法正常工作

我遇到了@StringDef支持注释的问题.当它们所在的库是项目的一部分(不是.aar文件)时,它们工作得非常好,但是当我将库编译为.aar文件并尝试在另一个项目中使用它们时,注释不会被强制执行.

http://tools.android.com/tech-docs/support-annotations

在"使用您自己的库中的注释"部分中,它说

如果您使用这些注释注释自己的库,并使用Gradle构建AAR工件,则在构建时,Android Gradle插件将提取注释信息并将其发送到您的AAR文件中以供库的客户端使用.您可以查看记录信息的AAR内的annotations.zip文件; 这是使用IntelliJ的外部注释XML格式.这是必要的,因为.class文件不能包含足够的注释信息来处理上面的@IntDef信息; 请注意,我们需要记录对常量本身的引用,而不是其值.如果(并且仅当)您的项目依赖于注释支持库,Android Gradle插件将作为构建的一部分运行提取注释任务.(请注意,只有源保留注释放在.aar文件中;类级别保留在classes.jar中.)

我打开了.aar文件,里面有annotations.zip文件,如果我提取它,就会有一个包含所有正确注释的XML文件.

我正在使用@Retention(RetentionPolicy.SOURCE)它所说的我需要的东西

我试图在.aar文件中使用这些应用程序的应用程序确实依赖于支持库 compile 'com.android.support:support-annotations:23.1.1

我缺少什么使这些工作?

编辑:我仔细检查了使用这些.aar文件的项目是否也打开了注释处理器.

android annotations android-library android-support-library

7
推荐指数
1
解决办法
1006
查看次数

Android Studio - Gradle生成特定的javadoc文件

我需要为包含3个模块的项目生成一些javadoc,我只需要来自每个模块的特定文件.

在Android Studio中,我可以使用工具 - >生成JavaDoc,然后设置自定义范围,并有选择地选择我想要的文件,并将它们聚合到一个javadoc文件夹中,但这不适用于我们的自动构建.

我无法弄清楚如何在gradle命令行上执行此操作?

每个例子都是这项任务的一些变化

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath+=project.files(android.getBootClasspath().join(File.pathSeparator))
    destinationDir = file("../javadoc/")
    failOnError false
}
Run Code Online (Sandbox Code Playgroud)

这会为整个模块生成javadoc.我无法弄清楚如何只获取我想要的文件?

android javadoc android-studio android-gradle-plugin

6
推荐指数
1
解决办法
1315
查看次数

Android Studio单元测试覆盖率显示为0%

我正在尝试检查单元测试的覆盖范围,所有的测试都通过了,但是当我通过右键单击测试文件来使用“使用覆盖率运行测试”来运行测试时,它完成后,一切恢复为0%吗?

看起来它应该只能阅读https://developer.android.com/studio/test/index.html,并且找不到任何说明为什么它将为所有内容返回0%的信息吗?

我缺少一些隐藏的设置来使它正常工作吗?

android-testing android-studio

6
推荐指数
1
解决办法
823
查看次数

如何在主线程上使用协同程序GlobalScope?

我试图在0.30.0中使用最新的协同程序,并且无法弄清楚如何使用新的作用域.在原始的协同程序中,我可以使用UI或CommonPool设置上下文,一切正常.

现在我正在尝试在从房间数据库中读取时在我的ViewModel中使用GlobalScope,然后我想将返回的值赋给我的LiveData对象.

我尝试设置LiveData值时收到以下错误

java.lang.IllegalStateException:无法在后台线程上调用setValue

fun getContact() {
        GlobalScope.launch {
            val contact = contacts.getContact() // suspended function
            withContext(Dispatchers.Default) { phoneContact.value = contact }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我只看到调度员的默认,无限和IO,而且没有一个工作,我无法弄清楚我做错了什么?我对主线程的选择在哪里?

android kotlin kotlin-coroutines

6
推荐指数
2
解决办法
6926
查看次数

在新活动中从 Intent 获取时,带有私有构造函数的 Parcelized 密封类会引发无法访问的错误,但在其他任何地方都有效?

我制作了一个特殊的密封类来验证我的可空 URL,这样我就可以安全轻松地知道它的状态(无、无效、有效)

sealed class UrlType : Parcelable {
    @Parcelize class Valid private constructor(val url: String) : UrlType() {
        companion object : CompanionTest<UrlType.Valid, String>(::Valid)
    }

    @Parcelize object None : UrlType()
    @Parcelize class Invalid(val invalidUrl: String) : UrlType()

    companion object {

        fun getUrlType(url: String?): UrlType {
            return if (url == null) {
                UrlType.None
            } else if (!url.isValidUrl()) {
                UrlType.Invalid(url)
            } else {
                Valid.create(url)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
open class CompanionTest<out T, in A>(creator: (A) -> T) {

    private var creator: ((A) -> …
Run Code Online (Sandbox Code Playgroud)

kotlin

6
推荐指数
1
解决办法
3820
查看次数

Android - 使用ColorFIlter从ColorView获取颜色应用于Drawable

我试图在GridView中获得ImageView的颜色,我之前已经应用了颜色过滤器.我正在运行带有4.2.2的Nexus 4

我正在改变像这样的ImageView的颜色.在应用滤镜之前,图像的实际颜色是白色.

Drawable myIcon = getResources().getDrawable(R.drawable.bufferbuildercolor3);                       
myIcon.setColorFilter(new PorterDuffColorFilter(Color.rgb(Color.red(color),Color.green(color), Color.blue(color)),PorterDuff.Mode.MULTIPLY));
Run Code Online (Sandbox Code Playgroud)

现在这实际上并没有改变我想要的源图像颜色.这始终是白色的.

我的问题是,在我丢失了用于设置它的数据后,我正在尝试很好地引用颜色.我想长按ImageView并获得它的颜色.

我在下面的问题中找到了一些代码,但它似乎不起作用,因为它总是返回白色(255,255,255),这是原始图像的颜色,但不是过滤器.如何在Android中获得像素颜色?

ImageView imageView = ((ImageView)v);
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
int pixel = bitmap.getPixel(x,y);

int redValue = Color.red(pixel);
int blueValue = Color.blue(pixel);
int greenValue = Color.green(pixel);
Run Code Online (Sandbox Code Playgroud)

我尝试过类似下面的东西,但是当我调用getColorFilter时它就崩溃了.

ImageView image = (ImageView)findViewById(R.drawable.bufferbuildercolor3);
ColorFilter test = image.getColorFilter();
Run Code Online (Sandbox Code Playgroud)

我不知道还能做什么,除了找到实际网格位置的X/Y,然后在那个点获得屏幕背景颜色而不是图像.似乎应该有一个更简单的方法来做到这一点?

android android-imageview android-gridview android-drawable

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

PreferenceFragmentCompat将不会加载到AppCompatPreferenceActivity中 - 尝试实例化一个不是片段的类

我正在尝试使用v7支持库中的PreferenceFragmentCompat.当我尝试添加它时,它总是返回以下异常

Process: com.sample.preferencetest, PID: 14444
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.preferencetest/com.sample.preferencetest.SettingsActivity}: android.app.Fragment$InstantiationException: Trying to instantiate a class com.sample.preferencetest.SettingsActivity$EmptyFragment that is not a Fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3155)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263)
at android.app.ActivityThread.access$1000(ActivityThread.java:197)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6897)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用PreferenceFragment时,一切正常.只有当我尝试使用它失败的PreferenceFragmentCompat时

我想使用它的原因是因为现在不推荐使用onAttach(Activity)方法,而早期的设备没有附加我的界面.

这是班级

package com.sample.preferencetest;

import android.os.Bundle;
//import android.preference.PreferenceFragment;  I toggle this to try regular preference fragments.
import android.support.v7.preference.PreferenceFragmentCompat;
import java.util.List;

public class SettingsActivity extends AppCompatPreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-preferences android-fragments android-support-library

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