Articles of kotlin

产品风味:find重复的类

我有一个非常愚蠢的问题,但我几小时后就坐在我的应用程序前面,但我无法理解问题所在。 我有一个Android应用程序(用kotlin编写),我想制作两种产品风格并覆盖产品风格的类/文件: 所以我的gradle脚本是这样的: apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ android { … productFlavors { foo { applicationId “com.foo” } } } 我的文件结构如下: – src – androidTest – foo – java – com – example – Bar.kt – main – java – com – example – Bar.kt – test 所以基本上我想在foo产品风格中覆盖Bar.kt文件,但不知何故它不起作用:它说类Bar是重复的。 任何提示?

如何在Kotlin中组合Intent标志

我想结合两个意图标志,就像我们在android中所做的那样 Intent intent = new Intent(this, MapsActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); 我尝试过这样的事情,但它对我不起作用 val intent = Intent(context, MapActivity::class.java) intent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)

如何在androidTest范围内使用kapt

有没有办法使用kapt作为androidtest范围? 目前我正在从com.neenbedankt.gradle.plugins android-apt迁移到kapt – 这工作正常 – 但我不知道如何为androidTest范围做 – 所以替换: apt “com.github.hotchemi:permissionsdispatcher-processor:$permissiondispatcher_version” apt “com.google.dagger:dagger-compiler:$dagger_version” 同 kapt “com.github.hotchemi:permissionsdispatcher-processor:$permissiondispatcher_version” kapt “com.google.dagger:dagger-compiler:$dagger_version” 工作正常 – 但我发现无法迁移: androidTestApt “com.google.dagger:dagger-compiler:$dagger_version”

使用KClasstypes绑定到映射

我试图通过他们的KClasstypes将ViewModel子类绑定到一个映射中: @Module abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(MyViewModel::class) abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel @Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory } 但我得到Dagger编译错误: e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass,? extends javax.inject.Provider> cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent { e: ^ e: java.util.Map<kotlin.reflect.KClass,? extends javax.inject.Provider> is injected at e: com.example.app.ui.ViewModelFactory.(creators) e: […]

Android支持库27,片段更新?

自从我将项目更新到SDK版本27并将支持库的gradle插件更新到版本27.0.0我需要更改我的代码。 使用26.1.0我可以在我的Fragment ( android.support.v4.app )中使用getContext() (使用Kotlin context )并且我没有可空性问题,但是因为我使用Kotlin我遇到了版本27.0.0的问题,我的所有context调用都不再起作用了,我需要一个安全操作符,就像context!!一样context!! ,但是因为我个人觉得每次我做自己的工作都是一种喧嚣 override fun getContext() = super.getContext()!! 改变的另一件事(突然,这就是我要问的原因)是onCreateView()和onViewCreated() 。 在onCreateView ,inflater不再是null,所以我需要更改我的函数签名以正确覆盖onCreateView(inflater: LayoutInflater?…)到onCreateView(inflater: LayoutInflater…)并且对于createdView参数也是createdView 。 onViewCreated 。 所以现在我想知道为什么,特别是(对于Kotlin)非常丑陋的getContext()更改已经完成并转向https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html 。 但等等,显然他们没有改变它? 所以现在我的问题是,如果我做错了什么或者他们是否真的改变了它,如果是这样,我可能会问他们为什么? 顺便说一句,同样适用于getActivity() ,我认为添加了mHost == null检查, getActivity方法甚至是最终的,所以我不能在那里使用我的解决方法,这使得它非常难看。 实际上在源文件中方法看起来是一样的,但是26.1.0有Kotlin返回typesContext! 和27.0.0返回typesContext? 。

如何模糊我用kotlin编码的sdk(并摆脱元数据)

我正在开发一个SDK(Android库),我不得不混淆我的大部分代码,因此客户可能不会尝试使用内部代码。 我的lib用kotlin编码,我使用proguard来混淆代码。 问题是在编译和混淆之后代码中仍然存在@ kotlin.Metadata(运行时)注释。 使用这些注释,检索源自此“(不是那样)混淆的”字节码的java代码非常容易。 我首先认为这是我的错,我的项目有太多的熵源可能导致这种行为,所以我做了一个示例项目来certificate问题不是来自我的sdk实现。 我用AS创建了一个新项目,然后是一个包含2个文件的lib模块: facade.kt是我的门面类,我不希望混淆,所以客户可以使用它: package com.example.mylibrary class MyFacade(val internalClass:InternalClass) { fun doSomething() { internalClass.doSomething( firstArgument=1, secondArgument=2 ) } } 在这个示例中,internal.kt包含了我想要混淆的类: package com.example.mylibrary class InternalClass { fun doSomething(firstArgument: Int, secondArgument: Int) { System.out.println(“Arguments are : $firstArgument, $secondArgument”) } } 使用此版本闭包将proguard规则注入到gradle项目中: buildTypes { release { minifyEnabled true proguardFiles ‘proguard-rules.pro’ } } 这里是proguard-rules.pro (只有一行,仅此而已): […]

在Kotlin中定义log TAG常量的最佳方法是什么?

我正在Android应用程序中创建我的第一个Kotlin类。 通常为了记录目的,我有一个名为TAG的常量。 我在Java中会做的是: private static final String TAG = MyClass.class.getSimpleName(); 我知道在Kotlin课程中我可以用这种方式创建TAG : private val TAG = MyClass::class.java.simpleName 对于使用Java和Kotlin的项目来说这是可以的,但是如果我开始一个仅在Kotlin中的新项目呢? 如何定义TAG常数? 是否有更多的Kotlin方式我没有这个奇怪的构造class.java.simpleName ?

java.lang.IllegalStateException:Dex存档:仅为.CLASS文件设置.DEX扩展名

我在gitlab ci上构建了这个项目 ./gradlew assembleDebug –stacktrace 有时它会抛出一个错误: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ‘:app:transformClassesWithDexBuilderForDebug’. > com.android.build.api.transform.TransformException: java.lang.IllegalStateException: Dex archives: setting .DEX extension only for .CLASS files 在我的本地电脑上它工作正常。 kotlin版本是1.2 multidex已启用 这个错误的原因是什么?

将支持库更新到27.0.0后,我的片段中出现多个错误

将支持库从v-26.1.0更新到v-27.0.0后,我的片段中出现多个错误。 这是一些这些错误的列表: 错误:智能转换为’Bundle’是不可能的,因为’arguments’是一个可变属性,此时可能已被更改。 错误:’onCreateView’不会覆盖任何内容 错误:’onViewCreated’不会覆盖任何内容 错误:types不匹配:推断types是View? 但预计是View 错误:types不匹配:推断types是上下文? 但是上下文是预期的 错误:types不匹配:推断types是FragmentActivity? 但是上下文是预期的 错误:types不匹配:推断types是FragmentActivity? 但是上下文是预期的 来自android studio的空片段模板。 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (arguments != null) { mParam1 = arguments.getString(ARG_PARAM1) mParam2 = arguments.getString(ARG_PARAM2) } } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater!!.inflate(R.layout.fragment_blank, container, false) } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) […]

Android Studio 3.1:编辑器中错误的未解析引用

我正在运行Ubuntu 17.10,我刚刚将Android Studio从版本3.0.1更新到3.1。 这是帮助中的版本信息 – >关于: Android Studio 3.1 Build #AI-173.4670197, built on March 22, 2018 JRE: 1.8.0_152-release-1024-b01 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains sro Linux 4.13.0-37-generic 不幸的是,虽然IDE在我的(第一次)Kotlin项目之前能够解析特定于android的引用,但在新版本中它似乎无法解决。 这是截图显示我的意思: 在Android Studio 3.1中,它声称核心Android函数(如setContentView()不存在,并且不断提示我为它创建一个抽象函数 – 我显然不想这样做。 但是,如果我按下构建按钮,我会BUILD SUCCESSFUL in 8s获得一次BUILD SUCCESSFUL in 8s 。 有谁知道我的编辑器为什么这样做,以及如何让Android相关的函数和类再次正确解析? 编辑:更新:我现在有关于这个问题的更多信息,但它仍然没有解决: 构建 – >清理然后构建 – >重建没有帮助。 文件 – >无效缓存和重新启动也没有帮助 也没有手动Gradle同步。 […]