标签: android-architecture-components

Android Room错误:无法识别枚举列表的TypeConverter

Room库无法识别TypeConverter我为List枚举创建的内容.但是,当我将其更改ArrayList为枚举时,它可以正常工作.任何人都知道为什么以及我能做些什么来使这项工作List?(在Kotlin中使用List更容易,我真的不想ArrayList仅仅因为这个而转发回来).

这是我的代码:

我的模特:

@Entity
data class Example(@PrimaryKey val id: String?,
                   val name: String,
                   var days: List<DayOfWeek>?)
Run Code Online (Sandbox Code Playgroud)

DayOfWeek 是一个枚举:

enum class DayOfWeek {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;

    val value: Int
        get() = ordinal + 1


    companion object {

        private val ENUMS = DayOfWeek.values()

        fun of(dayOfWeek: Int): DayOfWeek {
            if (dayOfWeek < 1 || dayOfWeek > 7) {
                throw RuntimeException("Invalid value for DayOfWeek: " + dayOfWeek)
            }

            return ENUMS[dayOfWeek …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room android-architecture-components

12
推荐指数
1
解决办法
4818
查看次数

未解决的参考:测试

我正在尝试在我当前在Kotlin中编写的android项目中编写简单的集成测试.

问题是测试没有事件启动并因以下错误而失败:

Error:(4, 36) Unresolved reference: testing
Error:(18, 52) Unresolved reference: InstantTaskExecutorRule
Error:Execution failed for task ':app:kaptGenerateStubsDebugAndroidTestKotlin'.
> Compilation error. See log for more details
Run Code Online (Sandbox Code Playgroud)

我试过谷歌搜索这个问题,但没有成功.

我已经尝试过的步骤:

  1. 检查是否安装了包含InstantTaskExecutorRule的库,我可以深入了解这个包(是的,我可以)
  2. 检查我的测试是否放在正确的文件夹中(是的,它在androidTest)
  3. 检查我是否正确启动了测试(可能是我通过右键单击包启动它们pkgName (androidTest)然后"在...中运行测试")

我也尝试将我的源目录从java重命名为koltin,并设置正确的值sourceSets但由于没有成功而将其更改回来,并认为这不是原因.

重要通知:

如果我评论该行import android.arch.core.executor.testing.InstantTaskExecutorRule和所有代码InstantTaskExecutorRule(意味着整个测试逻辑将为空)并放置一个简单assert的例子,那么一切正常.

但是我想用这个特别的东西InstantTaskExecutorRule,想知道问题到底是什么以及如何解决它,或者至少知道我应该在哪里找什么.

这是我的测试代码:

import android.arch.core.executor.testing.InstantTaskExecutorRule
import android.arch.persistence.room.Room
import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4

import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import com.myapp.storage.base.AppDataBase


@RunWith(AndroidJUnit4::class)
class UserDaoTest{
    @JvmField @Rule val instantTaskExecutorRule = …
Run Code Online (Sandbox Code Playgroud)

android integration-testing kotlin android-architecture-components

12
推荐指数
2
解决办法
5055
查看次数

PagedListAdapter.submitList()在更新现有项目时表现得很奇怪

这个主题的小故事:应用程序只是在确认后用对话框更新点击行的值.在房间数据库上使用分页方案.

添加或删除项目时,将获取最新数据集并将其传递给submitList方法,然后可以看到所有更改并运行良好.

问题从那里开始,如果现有项目更新,则再次正确获取最新数据集并传递给submitList,但这次似乎没有变化.

当我调试DIFF_CALLBACK并抓住我的项目时areItemsTheSame,newHistoryoldHistory值是一样的!(怎么样!)

submitList方法中可能有任何错误?

  • 房间v.:2.1.0-alpha02
  • Paging v.:2.1.0-beta01

初始化后,observe从房间中提取列表并传递给mHistoryAdapter.submitList(it).然后,如果我更新一个项目,观察再次被触发(我在param中看到更新的值it)并传递给submitList.

不幸的是,适配器不会改变......

    mResolvedAddressViewModel = ViewModelProviders.of(this).get(ResolvedAddressViewModel::class.java)
    mResolvedAddressViewModel.getAddresses(false).observe(this, Observer {
        mHistoryAdapter.submitList(it)
    })
Run Code Online (Sandbox Code Playgroud)

所有部件

模型

@Parcelize
@Entity
data class ResolvedAddress(
    @PrimaryKey var id: String = UUID.randomUUID().toString(),
    var requestedLat: Double = 0.0,
    var requestedLon: Double = 0.0,
    var requestedAddress: String = "",
    var lat: Double,
    var lon: Double,
    var address: String,
    var country: String,
    var countryCode: String,
    var city: …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-paging androidx

12
推荐指数
1
解决办法
2252
查看次数

SetupWithNavController 不适用于工具栏

我正在尝试将工具栏绑定到导航控制器,为此我使用以下代码:

NavigationUI.setupWithNavController(toolbar, NavHostFragment.findNavController(nav_host))
Run Code Online (Sandbox Code Playgroud)

在菜单文件中,我提供了应用程序应导航到的片段的 ID,如下所示:

<item
    android:id="@+id/menuFragment"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    app:showAsAction="never" />
Run Code Online (Sandbox Code Playgroud)

我有一个简单的导航图文件,如下所示:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.vapoyan.myapplication.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_homeFragment_to_menuFragment"
            app:destination="@id/menuFragment" />
    </fragment>

    <fragment
        android:id="@+id/menuFragment"
        android:name="com.vapoyan.myapplication.MenuFragment"
        android:label="fragment_menu"
        tools:layout="@layout/fragment_menu" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

有没有人有经验或可以建议我如何解决问题,导航组件是否支持工具栏?

任何示例代码或参考?

android kotlin android-architecture-components androidx

12
推荐指数
3
解决办法
1万
查看次数

Android导航组件弹出过渡问题

我有2个动作

动作1

 <action
        android:id="@+id/actionBaseFragmentToAskForLocation"
        app:destination="@+id/introAskForLocationFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right" />
Run Code Online (Sandbox Code Playgroud)

动作2

<action
        android:id="@+id/actionIntroAskLocationToLogin"
        app:destination="@id/loginFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/fade_out"
        app:popUpTo="@+id/app_main_navigation" />
Run Code Online (Sandbox Code Playgroud)

我想要的是当第二个动作被触发时,我想清除后堆栈并仅将loginFragment设置为保留在堆栈中。

唯一的问题是当我执行Action2时,将“ slide_out_right”作为退出动画执行

我知道,如果我们从堆栈中弹出片段,则将触发action1的“ popExitAnim”,而不是action2的“ exitAnim”。

但是我想知道如何让片段执行slide_out_left动画以退出并同时将其弹出堆栈。

android android-navigation android-architecture-components android-architecture-navigation

12
推荐指数
2
解决办法
3467
查看次数

如何使用新的androidx.lifecycle:*:2.2.0-alpha01获取lifecycle.coroutineScope

2019年5月7日androidx.lifecycle:*:2.2.0-alpha01发布,宣布:

此版本添加了新功能,增加了对Lifecycle和LiveData的Kotlin协程的支持。可以在此处找到有关它们的详细文档。

文档中提到我可以得到LifecycleScope

通过lifecycle.coroutineScopelifecycleOwner.lifecycleScope属性

但似乎我找不到它们。我目前的依赖是:

def lifecycle_ver = "2.2.0-alpha01"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_ver"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_ver"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_ver"

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
Run Code Online (Sandbox Code Playgroud)

可能是什么原因以及如何获得这些API?

android android-architecture-components android-jetpack

12
推荐指数
2
解决办法
761
查看次数

是observeForever 生命周期意识吗?

我正在使用 MVVM,并且已经对其进行了不同的实现,但仍然让我怀疑的一件事是如何从我的 ViewModel 的存储库 (Firebase) 获取数据,而不将任何生命周期附加到 ViewModel。

我已经observeForever()从 ViewModel实现了,但我认为这不是一个好主意,因为我认为我应该通过回调或转换从我的存储库到我的 ViewModel 进行通信。

我在这里留下一个例子,我从 Firebase 获取设备并更新我的 UI,如果我们能在这里看到,我正在观察来自 UI 的 repo 的数据,但从 ViewModel 我也在观察来自 repo 的数据,这就是我真正怀疑我是否使用正确方法的地方,因为我不知道如果我的视图被破坏是否observeForever()会被清除onCleared(),所以如果视图死亡,它不会让观察者保持活动状态。

用户界面

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            val deviceId = editText.text.toString().trim()
            observeData(deviceId)
        }
    }

    fun observeData(deviceId:String){
        viewModel.fetchDeviceData(deviceId).observe(this, Observer {
            textView.text = "Tipo: ${it.devType}"
        })
Run Code Online (Sandbox Code Playgroud)

视图模型

class MainViewmodel: ViewModel() {

    private val repo = Repo()
    fun fetchDeviceData(deviceId:String):LiveData<Device>{
        val mutableData = MutableLiveData<Device>()
        repo.getDeviceData(deviceId).observeForever {
            mutableData.value = it
        }

        return mutableData …
Run Code Online (Sandbox Code Playgroud)

android mvvm kotlin android-livedata android-architecture-components

12
推荐指数
1
解决办法
6937
查看次数

如何从Android分页组件中的PagedListAdapter中删除项目

我使用Paging with Retrofit从REST API加载Notifications数据列表.

当我按下通知项目的删除按钮时,我调用删除API删除它.PagedListAdapter删除API响应成功后删除它的正确方法是什么?PagedListPagedListAdapter不支持通过索引或对象删除项目.

我试着打电话DataSource.validate()但它从开始重新加载,而不是从当前页面重新加载.

android android-architecture-components android-paging

11
推荐指数
1
解决办法
2597
查看次数

类型不匹配:推断类型是LoginActivity,但LifecycleOwner是预期的

我正在玩预览版AndroidStudio - 3.4 Canary 9.

我从Configure your project窗口中选择了默认登录活动选项并提供了以下选项:

配置您的项目

Gradle同步没有报告错误,但是在构建编译时它会产生以下错误:

Type mismatch: inferred type is LoginActivity but LifecycleOwner was expected
Run Code Online (Sandbox Code Playgroud)

以下是显示错误的代码段:

// Type mismatch at this@LoginActivity, required LifeCycleOwner, found - LoginActivity
        loginViewModel.loginFormState.observe(this@LoginActivity, Observer {
            val loginState = it ?: return@Observer

            // disable login button unless both username / password is valid
            login.isEnabled = loginState.isDataValid

            if (loginState.usernameError != null) {
                username.error = getString(loginState.usernameError)
            }
            if (loginState.passwordError != null) {
                password.error = getString(loginState.passwordError)
            }
        })
Run Code Online (Sandbox Code Playgroud)

LoginActivity 源于 AppCompatActivity()

各自进口的图书馆是 …

kotlin android-architecture-components android-jetpack androidx android-studio-3.4

11
推荐指数
2
解决办法
3806
查看次数

前台服务与 WorkManager 进行位置跟踪

假设我想构建一个应用程序,它定期请求当前位置(例如,每 10 分钟一次,这个数字应该是可配置的)并提交到服务器。

我知道对于这种情况通常建议使用 Foreground Service 和 WorkManager。然而哪个更适合呢?以下是我的想法和疑问。

  1. WorkManager - 主要用于可延迟的后台工作,其执行是有保证的。但我知道从 Android 8 (API 26) 开始引入了后台位置,并且限制位置每小时只能更新几次https://developer.android.com/about/versions/oreo/background-location-limits。因此,这可能不符合定期更新的要求。

  2. ForegroundService - 非常适合运行并需要让用户意识到的东西。出于隐私目的,建议这种情况(位置跟踪)使用。Google 还创建了一个示例应用程序来推广这种做法https://github.com/android/location-samples/tree/master/LocationUpdatesForegroundService

从上面的分析来看,似乎ForegroundService是这样的。但是我还发现它WorkManager具有内置支持,可ForegroundService通过androidx.work.impl.foreground.SystemForegroundService https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running-kotlin结合使用 Worker

这让我很困惑,不知道我应该使用什么,以及谷歌针对这个特定场景真正推荐的是什么。

有人有什么想法吗?

android android-location foreground-service android-architecture-components android-workmanager

11
推荐指数
1
解决办法
5610
查看次数