小编Sta*_*ool的帖子

隐藏导航组件中的工具栏或底部导航栏

我遵循了 android.developers 的指南navigation component在我的应用程序中实现了一个。当我需要一些屏幕带有或不带有工具栏/底部导航栏时,我偶然发现了一个问题。

Android 开发者示例的布局

  <androidx.appcompat.widget.Toolbar
        .../>

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"

        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        .../>
Run Code Online (Sandbox Code Playgroud)

强迫OnDestinationChanged在 MainActivity 的回调中隐藏/显示工具栏/底部导航栏:

navController.addOnDestinationChangedListener { _, destination, _ ->
                when (destination) {
                    R.id.topLevelDestination-> {
                        toolbar.visibility = View.GONE
                        bottomNav.visibility = View.VISIBLE
                    }
                    R.id.lowLevelDestination -> {
                        toolbar.visibility = View.VISIBLE
                        bottomNav.visibility = View.GONE
                    }
Run Code Online (Sandbox Code Playgroud)

而且,当然,如果我这样做,我会在看到新片段之前调整布局大小。我的意思是我看到底部导航如何在片段 A 上消失,并且当片段 A 仍在屏幕上时,我在底部导航栏所在的位置看到片段的 B 部分,在该片段之后,B 出现。

如何解决?我需要嵌套的导航图吗?


更新:添加了问题的 gif

在此处输入图片说明

视频描述:它是我屏幕的一部分。在视频中,您可以看到系统 UI、底部导航栏和带有按钮的主要片段。当我单击按钮导航图时,我将导航到没有底部导航栏的目的地。所以,当 OnDestinationChanged 时,我会执行 bottomNavBar.hide()。如您所见,在我实际导航之前,bottomNavBar 消失了,并且在bottomnavBar 消失后,您可以看到我的目标片段的一部分可见。那就是问题所在。

navigation android android-toolbar bottomnavigationview android-architecture-navigation

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

如何在 MotionLayout 中运行特定的过渡?

我有一个 MotionScene,其中有 4 个 ConstraintSet,代表屏幕的 4 个状态(加载状态),并且它们之间有 3 个转换。当我的应用程序状态从例如加载更改为处理时,我想运行转换 1 (set1 -> set2),当状态再次更改时,我想运行转换 2 (set2 -> set3)。我找不到办法做到这一点。

我接下来尝试:

设置当前转换

     motion_layout.setTransition(R.id.set1, R.id.set2)
     motion_layout.transitionToState(R.id.set2)
Run Code Online (Sandbox Code Playgroud)

只设置过渡

motion_layout.setTransition(R.id.set1)
Run Code Online (Sandbox Code Playgroud)

转换到某种状态:

motion_layout.transitionToState(R.id.set1)
Run Code Online (Sandbox Code Playgroud)

但是上述所有方法都运行我的所有集合,即使我使用 app:autoTransition="none" 。


我尝试将所有内容都放在一个 Transition 中并设置 app:progress = 0 on ,然后通过进度控制动画状态:

 motion_layout.setProgress(0.25f, 1.0f)
Run Code Online (Sandbox Code Playgroud)

它只是将所有动画运行到最后,或者我尝试过

motion_layout.progress = 0.25f
Run Code Online (Sandbox Code Playgroud)

它没有动画,它只向我显示 0.25 动画进度,没有任何动作。

如何控制动画的流向?如何运行特定的集合?使用进步会更好吗?如何解决?

PS我用

implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta7'
Run Code Online (Sandbox Code Playgroud)

animation android android-constraintlayout androidx android-motionlayout

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

如何为 material.Slider 视图创建绑定适配器?

我的目标是从我的视图模型将 2 路数据绑定 material.Slider 视图到 MutableLiveData:

   <com.google.android.material.slider.Slider
        ...
        android:value="@={viewmodel.fps}"
        ...
    />
Run Code Online (Sandbox Code Playgroud)

当然,这是行不通的,因为 androidx.databinding 库中没有用于 Slider 的数据绑定适配器

[databinding] Cannot find a getter for <com.google.android.material.slider.Slider android:value> that accepts parameter type <java.lang.Integer>. If a binding adapter provides the getter, check that the adapter is annotated correctly and that the parameter type matches.
Run Code Online (Sandbox Code Playgroud)

但是,他们有一个 SeekBar:/androidx/databinding/adapters/SeekBarBindingAdapter.java

据我了解,2路数据绑定应该只适用于“progress”属性,而1路数据绑定需要两个属性:“onChanged”和“progress”

我尝试为 Slider 调整 SeekBarBindingAdapter:

    @InverseBindingMethods({
            @InverseBindingMethod(type = Slider.class, attribute = "android:value"),
    })
    public class SliderBindingAdapter {
        @BindingAdapter("android:value")
        public static void setValue(Slider view, int value) {
            if (value …
Run Code Online (Sandbox Code Playgroud)

data-binding android slider kotlin android-binding-adapter

9
推荐指数
1
解决办法
1255
查看次数

如何摆脱嵌套的 RxJava 流?

我对互联网、数据库进行了一系列调用,结果我向用户显示收集到的信息。现在我有非常难看的三层嵌套 RxJava 流。我真的想让它变得流畅且易于阅读,但我真的很难坚持下去。

我已经阅读了有关 Map、flatMap、zip 等的所有内容。不能让这些东西一起工作。

代码:进行api调用。接收到的信息放入数据库中,在第一个流的 onSuccess 方法中订阅另一个流,并在第二个流的 onSuccess 方法中从数据库接收到的信息最终显示给用户。

达特·弗兰肯斯坦:

disposables.add(modelManager.apiCall()
                .subscribeOn(Schedulers.io())
                .observeOn(mainThread)
                .subscribeWith(new DisposableSingleObserver {

                  public void onSuccess(ApiResponse apiResponse) {

                        modelManager.storeInDatabase(apiResponse)
                       //level 1 nested stream:
                        disposables.add(modelManager.loadFromDatabas()
                                  .subscribeOn(Schedulers.io())
                                  .observeOn(mainThread)
                                  .subscribeWith(new DisposableSingleObserver{
                                    public void onSuccess(Data data) {
                                        view.showData(data);
                                    }
                                    public void onError(Throwable e) {
                                    }
                                }));
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                }));
    }
Run Code Online (Sandbox Code Playgroud)

java android retrofit rx-java2

5
推荐指数
1
解决办法
1082
查看次数