小编Ami*_*mir的帖子

Android 导航组件:BottomNavigationView 的选定选项卡图标未更新

我正在BottomNavigationView与导航组件一起使用。当显示片段不是根片段时,选项卡图标不会更新(选择)。

示例:
当我在带有片段 A(也是根片段)的Tab Home和带有片段 B(也是根片段)的Tab Star之间切换时,它工作正常。
但是,当我从Tab Home导航到另一个片段(例如片段 A2),然后点击Tab Star并再次返回Tab Home时,仍然在 中选择Tab StarBottomNavigationView

Android 导航组件错误

版本运行良好2.4.0-alpha05,当我将其更新到2.5.0-alpha01.

构建.gradle(应用程序)

implementation "androidx.navigation:navigation-fragment-ktx:2.5.0-alpha01"
implementation "androidx.navigation:navigation-ui-ktx:2.5.0-alpha01"
implementation "androidx.navigation:navigation-dynamic-features-fragment:2.5.0-alpha01"
Run Code Online (Sandbox Code Playgroud)

构建.gradle(根)

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.0-alpha01"
Run Code Online (Sandbox Code Playgroud)

图形:
Android 导航图

<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/graph"
        app:startDestination="@id/fragmentA">
    <fragment
            android:id="@+id/fragmentA"
            android:name="ui.test.FragmentA"
            tools:layout="@layout/fragment_test"
            android:label="FragmentA" >
        <action
                android:id="@+id/action_fragmentA_to_fragmentA2"
                app:destination="@id/fragmentA2" />
    </fragment>
    <fragment
            android:id="@+id/fragmentA2"
            android:name="ui.test.FragmentA2"
            tools:layout="@layout/fragment_test"
            android:label="FragmentA2" />
    <fragment
            android:id="@+id/fragmentB"
            android:name="ui.test.FragmentB"
            tools:layout="@layout/fragment_test"
            android:label="FragmentB" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> …
Run Code Online (Sandbox Code Playgroud)

navigation android bottomnavigationview android-safe-args

18
推荐指数
2
解决办法
3644
查看次数

如何更改 Jectpack Compose BasicTextField 的文本颜色?

我正在尝试使用BasicTextField.
默认文本颜色是黑色,我找不到任何更改文本颜色的选项。
我还需要更改文本大小、字体和其他属性。

@Composable
fun MyBasicTextField(){
    var text by remember { mutableStateOf("Hello") }
    BasicTextField(
        value = text,
        onValueChange = {
            text = it
        },
        decorationBox = { ... },
        modifier = Modifier
            .fillMaxWidth()
            .background(Color.DarkGray, CircleShape)
            .padding(10.dp)
    )
}
Run Code Online (Sandbox Code Playgroud)

Jetpack Compose 基本文本字段

如果这不可能通过BasicTextField,是否有其他方法来创建类似的视图?
我已经尝试过TextField,但存在几个问题,例如删除标签、高度、背景......

android android-jetpack-compose

15
推荐指数
2
解决办法
7448
查看次数

所有gms/firebase库必须使用完全相同的版本.找到版本15.1.0,15.0.2,15.0.1,15.0.0.

尝试在我的项目中实现Firebase.

Gradle文件:

apply plugin: 'com.android.application'

android {
compileSdkVersion 27
defaultConfig {
    applicationId "com.ghaleh.myapplication"
    minSdkVersion 16
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }


buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:support-media-compat:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-  core:3.0.2'
implementation 'com.google.firebase:firebase-messaging:15.0.2'
}
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

All gms/firebase libraries must use the exact same version specification (mixing versions can lead to runtime crashes). …
Run Code Online (Sandbox Code Playgroud)

android gradle firebase android-studio android-studio-3.0

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

如何修复 ViewPager2 中的“违反设计假设”错误?

我正在使用 ViewPager2、Kotlin 和 AndroidX。当适配器不在索引 0 处并且我更改适配器列表并将当前项设置为索引 0 时,将引发异常。

java.lang.IllegalStateException: Design assumption violated.
        at androidx.viewpager2.widget.ViewPager2.updateCurrentItem(ViewPager2.java:538)
        at androidx.viewpager2.widget.ViewPager2$4.onAnimationsFinished(ViewPager2.java:518)
        at androidx.recyclerview.widget.RecyclerView$ItemAnimator.isRunning(RecyclerView.java:13244)
        at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:515)
        at android.view.View.layout(View.java:15596)
Run Code Online (Sandbox Code Playgroud)

在 ViewPager2 的第 537 行中有一个 if 导致异常:

        // Extra checks verifying assumptions
        // TODO: remove after testing
        View snapView1 = mPagerSnapHelper.findSnapView(mLayoutManager);
        View snapView2 = mLayoutManager.findViewByPosition(snapPosition);
        if (snapView1 != snapView2) {
            throw new IllegalStateException("Design assumption violated.");
        }
Run Code Online (Sandbox Code Playgroud)

这是我更新适配器列表的方式:

adapter.list = newList
adapter.notifyDataSetChanged()
viewpager.setCurrentItem(0, true)
Run Code Online (Sandbox Code Playgroud)

它仅在smoothScroll设置为时发生true

我错过了什么?

编辑: 我使用androidx.viewpager2.widget.ViewPager2可用com.google.android.material:material:1.1.0-alpha08

android kotlin android-viewpager2

9
推荐指数
2
解决办法
3214
查看次数

在 ViewModel 中观察 LiveData 最佳实践

我正在寻找观察数据的最佳方法ViewModel

我正在使用 MVVM + 数据绑定。

存储库:

private val data = MutableLiveData<String>()

suspend fun getData(): LiveData<String> {
        return withContext(IO) {
            val response = apiRequest { api.getData() }
            data.postValue(response)
            data
        }
    }
Run Code Online (Sandbox Code Playgroud)

它从服务器请求数据并返回实时数据。ViewModel必须观察数据的变化。

视图模型:

    suspend fun getData() {
        val data = repository.getData()
        MediatorLiveData<String>().apply {
            addSource(data) {
                gotData(it)
                removeSource(data)
            }
            observeForever { }
        }
    }

    private fun gotData(data: String) {
        //use data
    }
Run Code Online (Sandbox Code Playgroud)

ViewModel 使用来观察来自存储库MediatorLiveData的更改。LiveData我已将数据添加为源以观察更改并在触发后将其删除,以防止在多次获取数据时多次触发事件。并且必须有一个假观察者来MediatorLiveData触发 onChange 方法MediatorLiveData

假设我只需要数据来隐藏/显示视图(或者甚至将数据填充到我的 recyclerview 的适配器)。然后我只需调用下面的代码并使用 Observable 和 DataBinding,如下所示: …

android mvvm viewmodel kotlin android-livedata

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

无法在 Kotlin 多平台中访问fixedRateTimer

我正在开发一个 Kotlin 多平台项目。我正在尝试使用计时器和倒计时器,但我无法访问kotlin.concurrent.fixedRateTimerimport kotlin.concurrent.timercommonMain模块中。

在此输入图像描述

但是kotlin.concurrent可以使用: 在此输入图像描述

这是根build.gradle

plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("kotlin-android-extensions")
}

// ...

kotlin {
    //...
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlin:kotlin-stdlib:1.4.10")
                implementation("org.jetbrains.kotlin:kotlin-reflect:1.4.10")
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
                //...
            }
        }
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在那里使用这些方法。如果没有,我如何在模块中编写计时器和倒计时器commonMain

我尝试使用Coroutines来实现相同的功能但失败了,因为它们不精确:

    fun doAfter(delay: Long, action: () -> (Unit)) = launch {
        delay(delay)
        action.invoke()
    }

    fun countdown(time: Long, tick: Long, onTick: () -> (Unit), onFinish: () -> (Unit)) = launch { …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-multiplatform

4
推荐指数
1
解决办法
1107
查看次数

共享元素过渡图像视图变为白色

我正在使用 RecyclerView 到 ViewPager 共享元素转换。问题是当viewpager被分页到另一个图像时,返回到recyclerview后,第一个动画的imageview是白色的。

在此处输入图片说明

启动viewpager:

FragmentTransaction fragmentTransaction = getSupportFragmentManager()
            .beginTransaction()
            .setReorderingAllowed(true)
            .addSharedElement(view, name)
            .hide(recyclerFragment)
            .add(R.id.main_frameLayout, viewpagerFragment, tag)
            .commit();
Run Code Online (Sandbox Code Playgroud)

回到 recyclerview 片段:

FragmentTransaction fragmentTransaction = getSupportFragmentManager()
            .beginTransaction()
            .setReorderingAllowed(true)
            .addSharedElement(view, name)
            .remove(viewpagerFragment)
            .show(recyclerFragment)
            .commit();
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,我知道位置并且我正在正确设置过渡名称。

android android-fragments shared-element-transition

2
推荐指数
1
解决办法
1513
查看次数