Tag: android

Moshi的定制适配器与RxAndroid&Retrofit&Kotlin

在为Android项目配置Kotlin之后,我写了一个简单的MainActivity.kt 。 它调用Retrofit来获取包含以下数据的JSON文件: { “消息”:“成功”, “user”:{ “用户名”:“Eric” } } 现在我想用Moshi把JSON数据转换成Kotlin类,所以这里有两个类来反映上面的JSON结构: class User(var username:String) UserJson类(var消息:字符串,var用户:用户) 而Moshi的自定义类型适配器: 类UserAdapter { @FromJson fun fromJson(userJson:UserJson):User { Log.d(“MyLog”,“message = $ {userJson.message}”)// =成功 Log.d(“MyLog”,“user = $ {userJson.user}”)// = null 返回userJson.user } } 当它进入函数从fromJson() , userJson.message = "success"的预期。 但奇怪的是, userJson.user是null ,这应该是User(username="Eric") 。 我是Moshi和Kotlin的新手,我已经坚持了这个问题约10个小时。 请帮我一下 感谢您的帮助。 ======================================== 以下是MainActivity.kt的完整代码(仅限50行): class MainActivity:AppCompatActivity(){ 重写fun onCreate(savedInstanceState:Bundle?){ super.onCreate(savedInstanceState) 的setContentView(R.layout.activity_main) […]

Kotlin泛型:实现MVP的接口

在下面的例子中,我明白BaseActivity不能作为presenter.onAttached的参数presenter.onAttached ,尽管它实现了与V类似的BaseView接口。实现的Presenter可能被提供了BaseView的一个子类,例如MainPresenter<MainView> ,这意味着BaseView不够具体。 abstract class BaseActivity<V : BaseView, out P : BasePresenter<V>> : AppCompatActivity(), BaseView { abstract val presenter : P override fun onCreate(savedInstanceState: Bundle?) { … presenter.onAttached(this) // Type mismatch } } 但是,我仍然需要通过参考实施活动来告诉演讲者其观点是什么。 理想情况下,我可以从Base类中完成所有这些工作,这样MVP实现细节对于实现类几乎是不可见的。 我已经找到了两种方法来做到这一点,但他们有他们的问题: 1.我可以让每个执行活动都覆盖一个V字段,但是每一个执行活动都会有相同的代码行! 锅炉多? 它似乎也不符合泛型的精神。 // base abstract val view : V override fun onCreate(savedInstanceState: Bundle?) { … presenter.onAttached(view) } // […]

期望的类型与kotlin中的if表达不匹配

我想知道是否有人可以帮助我解决这个问题与错误的类型内的if表达式使用Kotlin? 我有2个活动之间的连接:第一个活动是MainActivity.kt和第二个活动是Main2Activity.kt ,在第一个活动MainActivity class我有一个问题的mismatched types ,因为我使用if语句来选择specific image在第二个活动中转换为specific adapter ,比如点击图片( a ),将ADAPTER_TYPE_1转换为第二个活动,将图片( b )转换为ADAPTER_TYPE_2的第二个活动 注意:图像类型是Int ,我的第一个图像名为a在我的Drawable里面,第二个图像名为b 这是一个MainActivity.kt class MainActivity : AppCompatActivity() { var adapter:FoodAdapter?=null var listOfFoods =ArrayList<Food>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(layout.activity_main) // load foods listOfFoods.add(Food("Coffee"," Coffee preparation is", a)) listOfFoods.add(Food("Coffee"," Coffee preparation is", b)) adapter= FoodAdapter(this,listOfFoods) gvListFood.adapter =adapter } class FoodAdapter: BaseAdapter { […]

这个错误是什么意思,当从java代码转换到通用的kotlin,单T后禁止?

试图将一些java代码转换为kotlin,并与泛型类型的问题。 这里的一个示例是Danny Preussler的Bundles和ViewModel的帖子的Java代码: 这里 class BundleAwareViewModelFactory<T extends ParcelableViewModel> implements ViewModelProvider.Factory { private final Bundle bundle; private final ViewModelProvider.Factory provider; public BundleAwareViewModelFactory(@Nullable Bundle bundle, ViewModelProvider.Factory provider) { this.bundle = bundle; this.provider = provider; } @SuppressWarnings("unchecked") @Override public T create(final Class modelClass) { T viewModel = (T) provider.create(modelClass); if (bundle != null) { viewModel.readFrom(bundle); } return viewModel; […]

Kotlin 1.0.0-rc-1036注释处理问题

我有一个使用Raizlabs DBFlow 2.2.1的Android应用程序,我更新了我的kotlin版本到1.0.0-rc-1036,但现在当我尝试运行该应用程序时,它给了我以下错误: https://gist.github.com/yiyocx/3cc9cf594121eba7ab0e 我尝试做一个干净的运行,但是这只是第一次启动,在接下来的启动我收到上面的同样的错误。 我认为这个错误是由于注解问题,我正在使用kapt 。 这些是我在app / build.gradle中的DBFlow依赖关系: dependencies { kapt 'com.raizlabs.android:DBFlow-Compiler:2.2.1' compile "com.raizlabs.android:DBFlow-Core:2.2.1" compile "com.raizlabs.android:DBFlow:2.2.1" } kapt { generateStubs = true }

在Kotlin lambda表达式中重写多个接口方法

说我有两个方法onCurrentLocation和onError的Callbacks接口: public interface Callbacks { void onCurrentLocation(ClientLocation location); void onError(); } 和一个在它的构造函数中接受这个接口的类,说: public MyLocationClient(Callbacks callbacks) {…} 现在,在Kotlin中,我应该如何能够实例化MyLocationClient: val myLocationClient = MyLocationClient( { location: ClientLocation -> updateClientLocation(location) }, {}) 如果没有,为什么不呢? 我看到的行为是:当接口只有一个方法,这个对象的构造罚款。 但是,只要我添加更多的方法Callbacks ,编译器抱怨 “Type mismatch。Required:Callbacks!Found:(ClientLocation) – > Unit” 编辑:删除空位检查的location因为它是不相关的问题。

测试Android Kotlin应用程序 – 用匕首Mockito注入null

我正在学习使用Mockito和Robolectric在Android上进行测试。 我用RxJava和Dagger2在Kotlin中使用Clean Architecture创建了一个非常简单的应用程序。 一切正常,但我不能让我的测试通过。 这是我的LoginPresenterTest: @RunWith(RobolectricGradleTestRunner::class) @Config(constants = BuildConfig::class) public class LoginPresenterTest { private lateinit var loginPresenter: LoginPresenter @Rule @JvmField public val mockitoRule: MockitoRule = MockitoJUnit.rule() @Mock private lateinit var mockContext: Context @Mock private lateinit var mockLoginUseCase: LoginUseCase @Mock private lateinit var mockLoginView: LoginView @Mock private lateinit var mockCredentialsUseCase: GetCredentials @Before public fun setUp() { […]

对于用作表达式的Kotlin函数,有没有简洁的方法来操作并返回一个值?

在Kotlin中,函数的最后一个语句可以被解释为它的返回值。 像下面的例子可以被简化为不太冗长吗? { text: String -> val validated = validateText(text) if (validated) { actOnValidation() } validated } 下面是一个使用RxJava的例子 – 即使有更好的Rx方法,我也会对纯Kotlin解决方案感兴趣。 fun inputChainObservable(targetField: TextView, chainedField: TextView): Observable<Boolean> { return targetField.textChanges() .observeOn(AndroidSchedulers.mainThread()) .map { cs: CharSequence? -> val hasInput = validateText(cs.toString()) if (hasInput) { chainedField.requestFocus() } hasInput } }

kotlin android开始新的服务

通过使用下面的代码,我试图从Broadcast receiver启动一个新的服务,但服务没有启动。 请引导我如何在kotlin开始服务? val intent = Intent(context, LocationService::class.java) if (context != null) { context.startService(intent) }

将用于复制资产文件的java代码转换为Android中的缓存文件夹到Kotlin的最佳实践

我使用这个代码来将Android中的Asset文件复制到缓存文件夹中,重点在于它是一个Java代码,我将它转换为Kotlin,但是它看起来更像Java(ish) val file = File("${cacheDir.path}/$fileName") val dir = file.parentFile dir.mkdirs() val inputStream = assets.open(fileName) val bufferedOutputStream = BufferedOutputStream(FileOutputStream(file)) val buf = ByteArray(10240) var num = inputStream.read(buf) // Java version: while ((num = fi.read(buf)) > 0) while (num > 0) { bufferedOutputStream.write(buf, 0, num) num = inputStream.read(buf) } bufferedOutputStream.close() inputStream.close() 任何能使Kotlin更为专业的专家。