标签: android-architecture-components

按下返回键始终使用喷气背包导航返回起始目的地

所以,我BottomNavigationView与 Jetpack Navigation 联系在一起。假设我有 4 个底部导航菜单,片段 A、B、C 和 D,A 作为起始目的地。从片段 A 转到片段 B,然后转到片段 C。然后,我按下硬件后退按钮。我期望它返回到片段 B,相反,它返回到片段 A(这是起始目的地)。

这是代码:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment
navController = navHostFragment.navController

binding.navView.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这种行为?

谢谢~

编辑:我遵循 Zain 的答案,行为已经符合预期。但是,还有另一个问题。假设我有另一个片段 A1,它不是BottomNavView片段的一部分。我可以从片段 A 导航到片段 A1。下面是导航图:

<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/mobile_navigation"
    app:startDestination="@+id/navigation_a">

    <fragment
        android:id="@+id/navigation_a"
        android:name="com.example.FragmentA"
        android:label=""
        tools:layout="@layout/fragment_a">
        <action
            android:id="@+id/action_navigation_a_to_navigation_a1"
            app:destination="@id/navigation_a1"
            app:launchSingleTop="true" />
    </fragment>
    <fragment
        android:id="@+id/navigation_a1"
        android:name="com.example.FragmentA1"
        android:label=""
        tools:layout="@layout/fragment_a1" />
    <fragment
        android:id="@+id/navigation_b"
        android:name="com.example.FragmentB"
        android:label=""
        tools:layout="@layout/fragment_b" />
    <fragment
        android:id="@+id/navigation_c"
        android:name="com.example.FragmentC"
        android:label=""
        tools:layout="@layout/fragment_c" />
    <fragment
        android:id="@+id/navigation_d"
        android:name="com.example.FragmentD"
        android:label=""
        tools:layout="@layout/fragment_d" …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-architecture-components android-jetpack-navigation

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

android架构组件与即时应用程序

我想让我的应用程序为即时应用做好准备.我创建了一个app模块,基本模块和一个功能模块.如果我在这个配置中运行我的项目一切都很好.

当我在我的基本模块Gradle文件中实现以下行.

annotationProcessor "android.arch.lifecycle:compiler:1.0.0"
api "android.arch.lifecycle:extensions:1.0.0"
Run Code Online (Sandbox Code Playgroud)

Gradle构建成功但我丢失了默认活动,无法运行项目.默认活动位于我的基本模块清单中.

如果我用实现更改扩展行.

implementation "android.arch.lifecycle:extensions:1.0.0"
Run Code Online (Sandbox Code Playgroud)

发生以下错误:

错误:任务':app:preDebugBuild'的执行失败.

Android依赖项'android.arch.lifecycle:runtime'具有不同版本的编译(1.0.0)和运行时(1.0.3)类路径.您应该通过DependencyResolution手动设置相同的版本

有谁知道问题是什么?

android module android-gradle-plugin android-instant-apps android-architecture-components

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

Android体系结构组件-从房间中删除旧数据

目前,我正在研究Android应用架构,我无法理解Github Repo Sample中的一件事。我们可以决定使用速率限制器或null检查来获取新数据,但是在这种情况下,我们只是将新值插入数据库中,而不会从数据库中删除旧值。例如,如果数据库中的旧结果之一从服务器中删除(用户删除的存储库)?它将仍在数据库中吗?我们如何消除这些价值?我是否缺少某些东西,或者这是未处理的案件?

android android-room android-architecture-components

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

无法解析:android.arch.persistence.room:runtime:1.0.0-alpha1

我无法编译以下内容gradle

compile 'android.arch.persistence.room:runtime: 1.0.0-alpha1'
Run Code Online (Sandbox Code Playgroud)

错误信息 :-

Error:(26, 13) Failed to resolve: android.arch.persistence.room:runtime: 1.0.0-alpha1
Run Code Online (Sandbox Code Playgroud)

以文件显示以项目结构显示 dialog

如果有人可以帮忙在这里帮助我,那将是有帮助的!

android android-gradle-plugin android-architecture-lifecycle android-architecture-components

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

androidTest中的Android LiveData返回null

我正在运行androidTest检测测试,我有一个方法,使用Room从DAO对象返回LiveData.

我正在调用这样的方法:

val animal = roomDatabase.animalsDao().getAnimal(1)
animal.observeForever(mMockObserver)
assertNotNull(animal.value)
Run Code Online (Sandbox Code Playgroud)

我用Mockito嘲笑观察者:

@Mock
private lateinit var mMockObserver = Observer<Animal>
Run Code Online (Sandbox Code Playgroud)

这应该返回包含动物ID为1的LiveData实例,但它为null.我的理解是,为了让LiveData返回任何东西,必须有一个观察者.我错误地设置了吗?

注意:如果我在DAO中更改getAnimal()的签名以直接返回Animal,而不是LiveData,那么它可以工作,所以我知道它与LiveData有关.

android kotlin android-room android-livedata android-architecture-components

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

资源目录导航无效

在添加导航目录时显示错误无效的资源目录.

处理命令'〜/ Android/Sdk/builds-tools/27.0.3/aapt'以退出值1结束.

的build.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.crushcoder.testapp"
        minSdkVersion 15
        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"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'android.arch.lifecycle:extensions:1.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'
}
Run Code Online (Sandbox Code Playgroud)

我在目录res/navigation/nav_graph.xml下创建了导航文件

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

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

旋转后重新创建ViewModel; 如果直接注射dagger2

可能重复

我正在用dagger2探索android注射api.所以,在我的示例应用程序中,我ViewModel直接注入了活动; 看看下面的代码片段.

class SampleApp : Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity> =
            dispatchingAndroidInjector

    override fun onCreate() {
        super.onCreate()

        DaggerApplicationComponent.builder()
                .application(this)
                .build()
                .inject(this)
    }
}
Run Code Online (Sandbox Code Playgroud)
@Component(modules = [
    AndroidInjectionModule::class,
    ActivityBindingModule::class,
    AppModule::class
    /** Other modules **/
])
@Singleton
interface ApplicationComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): ApplicationComponent
    }

    fun inject(sampleApp: SampleApp)
}
Run Code Online (Sandbox Code Playgroud)
@Module
public abstract class ActivityBindingModule {

    @ContributesAndroidInjector(modules = MainModule.class)
    public abstract MainActivity contributeMainActivityInjector();
} …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger-2 android-mvvm android-architecture-components

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

我应该让AsyncTask成为LiveData还是Repository类的成员-作为Loader的替换

LiveData/ ViewModel是复杂的很好的替代品Loader

基于https://medium.com/google-developers/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4

AsyncTask是的成员LiveData

public class JsonLiveData extends LiveData<List<String>> {

  public JsonLiveData(Context context) {

    loadData();
  }


  private void loadData() {
    new AsyncTask<Void,Void,List<String>>() {

    }.execute();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,根据Lyla Fujiwara演讲

在此处输入图片说明

我应该成为班级AsyncTask成员Repository吗?

android android-livedata android-architecture-components android-jetpack

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

viewmodel在屏幕方向上进行网络调用更改android

我是android体系结构组件的新手,我对它一点也不困惑viewmodel。我正在构建一个从服务器获取项目列表并在布局中显示为列表的应用程序。我已经在Repository课堂上实现了网络通话。

Repository.java:

//Get list of top rated movies
    public LiveData<NetworkResponse> getTopRatedMovies() {
        final MutableLiveData<NetworkResponse> result = new MutableLiveData<>();
        ApiService api = retrofit.create(ApiService.class);
        Call<MovieData> call = api.getTopRateMovies("api_key");
        call.enqueue(new Callback<MovieData>() {
            @Override
            public void onResponse(Call<MovieData> call, Response<MovieData> response) {
                result.postValue(new NetworkResponse(response.body()));
            }

            @Override
            public void onFailure(Call<MovieData> call, Throwable t) {
                Log.e(TAG, t.getLocalizedMessage());
                result.postValue(new NetworkResponse(t));
            }
        });
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

现在在ViewModel课堂上我正在这样做:

public class MovieListViewModel extends ViewModel {


    public LiveData<NetworkResponse> result, topRatedMovies;
    public LiveData<List<MovieEntity>> favoriteMovies;

    private Repository repository; …
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-viewmodel android-architecture-components android-jetpack

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

在GC之后不会触发Room返回的实时数据

我们的团队正在利用Android Jetpack开发一个项目。

有演示代码显示了我们面临的问题。这些代码可以在https://github.com/viseator/TestRoomLivedata中找到

我创建一个UserDao

@Dao
interface UserDao {
    @Query("SELECT * FROM user WHERE uid = :uid LIMIT 1")
    fun findUserById(uid: String?): Single<User>

    @Query("SELECT * FROM user WHERE state = 1 LIMIT 1")
    fun findLoginUserWithObserve(): LiveData<User>

    @Query("SELECT * FROM user WHERE state =1 LIMIT 1")
    fun findLoginUser(): Single<User>

    @Update
    fun update(vararg user: User)
}
Run Code Online (Sandbox Code Playgroud)

我还创建了一个kotlin对象来管理用户状态。

我正在观察返回的实时数据,findLoginUserWithObserve()以便在登录用户更改时得到通知:

object AccountManager {
    private const val DATA_BASE_NAME = "users"
    val TAG = "AccountManager"
    fun init(context: Application) {
        sDb = …
Run Code Online (Sandbox Code Playgroud)

android android-room android-architecture-components android-jetpack

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