我遵循了 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
我有一个 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
我的目标是从我的视图模型将 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) 我对互联网、数据库进行了一系列调用,结果我向用户显示收集到的信息。现在我有非常难看的三层嵌套 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) android ×4
android-architecture-navigation ×1
androidx ×1
animation ×1
data-binding ×1
java ×1
kotlin ×1
navigation ×1
retrofit ×1
rx-java2 ×1
slider ×1