我打电话setOnApplyWindowInsetsListener给我的视图添加填充/边距。我的 XML 包含android:fitsSystemWindows="true"
setOnApplyWindowInsetsListener被调用两次后(第二次插入 0)。
为什么 Android 返回 insets 两次并且第二次 insets 值为零?为什么当我将其设置为第一个值时,我的填充不适用?
代码:
drawer.setOnApplyWindowInsetsListener((v, insets) -> {
profileButton.setPadding(
profileButton.getPaddingLeft(),
profileButton.getPaddingTop(),
insets.getSystemWindowInsetBottom(),
profileButton.getPaddingBottom()
);
Timber.d("Inset applied: %d", insets.getSystemWindowInsetBottom());
return insets;
});
Run Code Online (Sandbox Code Playgroud)
控制台输出:
D/MainActivity: Inset applied: 53
D/MainActivity: Inset applied: 0
Run Code Online (Sandbox Code Playgroud) android android-layout android-jetpack android-jetpack-navigation
我开始使用 Jetpack Compose,我对它非常满意。我替换了几个由@Composable函数在 xml 中定义的布局。
当我回到我的 Navigation-xml 时,我注意到每个屏幕内的预览都是通过tools:layout属性完成的。以及对 xml 中布局的属性引用。不是一个@Composable函数。
@Composable是否已经有一种方法可以从导航 xml 中引用函数,tools:layout以便整个流程的预览可见?
假设我的应用程序如下所示
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController, startDestination = Route.Home.route) {
/// other composes
composable("Home") { HomeCompose(navController) }
}
}
@Composable
fun HomeCompose(navController: NavHostController) {
ChildCompose(navController)
}
@Composable
fun ChildCompose(navController: NavHostController) {
navController.navigate("")
}
Run Code Online (Sandbox Code Playgroud)
我想访问嵌套可组合项中的 navController 进行导航,但我不想将 navController 从父可组合项传递到子可组合项,如上所述
无论如何,是否可以从 NavHost 内的任何位置访问 navController,而无需通过可组合层次结构传递它
编辑:现在,我可以使用 CompositionLocalProvider 访问嵌套组合中的 navController,如下所示
val AppNavController = compositionLocalOf<NavHostController>() { error("NavHostController error") }
@Composable
fun AppNavigation() {
val navController = rememberNavController()
CompositionLocalProvider(
AppNavController provides navController
) {
NavHost(navController, startDestination = Route.Home.route) {
/// other composes …Run Code Online (Sandbox Code Playgroud) android android-jetpack android-jetpack-navigation android-jetpack-compose
我正在使用 Jetpack Navigation 库并且在片段转换方面遇到问题,无论是淡入淡出还是幻灯片动画,它始终具有白色背景而不是前一个屏幕内容。
片段 A -> 片段 B,当动画正在运行而不是将背景视为片段 A 时,它是白色背景。
导航
<fragment
android:id="@+id/nav_page"
android:name="my.fragmenta"
tools:layout="@layout/fragment_a">
<action
android:id="@+id/action_to_b"
app:destination="@id/nav_b"
app:enterAnim="@anim/slide_in_up"
app:popExitAnim="@anim/slide_out_down"/>
</fragment>
Run Code Online (Sandbox Code Playgroud)
活动方式
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:statusBarColor">@color/statusBarColor</item>
</style>
Run Code Online (Sandbox Code Playgroud)
动画文件
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="100%p"
android:toYDelta="0"
android:duration="@android:integer/config_longAnimTime" />
Run Code Online (Sandbox Code Playgroud)
和
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="0"
android:toYDelta="100%p"
android:duration="@android:integer/config_longAnimTime" />
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何解决它?
android android-fragments android-navigation android-jetpack android-jetpack-navigation
我正在使用 Android 导航组件制作应用程序。但是我遇到了一个非常基本的问题,它可能会导致我的应用程序的整个开发出现问题。
情景
我有这个片段,onViewCreated我在其中观察我的视图模型中的一个字段。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this).get(EventDetailsViewModel::class.java)
viewModel.init(context!!,eventId)
viewModel.onEventDetailsUpdated().observe(this, Observer {
setEventDetails(it)
})
}
Run Code Online (Sandbox Code Playgroud)
在该setEventDetails方法中,我使用数据设置了 recyclerviews。
问题
这个片段是一个带有卷轴的长片段。假设我向下滚动到一个部分,然后单击一个按钮,将我带到另一个片段。
但是当我回到这个片段时,它再次将我带到顶部并完成它在第一次加载时所做的一切。这可能令人不安。它有点像重新创建整个片段而不是保持其旧状态。
我试过的
我搜索了很多问题。并经历了This Github Query,This SO question,Another Git ......但我无法解决我的问题。
请帮助,提前致谢。
android android-fragments android-jetpack android-architecture-navigation android-jetpack-navigation
我正在使用导航组件版本2.1.0-rc01,我使用 3 个屏幕之间来回导航
Navigation.findNavController(it).navigate(R.id.action_participants)
第二次通过相同的屏幕后,我可以看到第二个片段,但我收到一个异常。我在 FragmentManager 上启用了日志,似乎没有附加相同片段的不同实例,导致错误
关于为什么导航组件创建另一个未附加的片段实例的任何想法?获取附加片段的任何解决方法?
2019-08-15 16:59:30.895 30041-30041/com.app.debug D/FragmentManager: mName=3-2131361912 mIndex=-1 mCommitted=false
2019-08-15 16:59:30.895 30041-30041/com.app.debug D/FragmentManager: mEnterAnim=#7f01001e mExitAnim=#7f01001f
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager: mPopEnterAnim=#7f010020 mPopExitAnim=#7f010021
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager: Operations:
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager: Op #0: REPLACE StaffBookingDetailsFragment{82e8301 (97f79b28-d8c1-432a-9e1c-3a781dd42434) id=0x7f0a01c5}
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager: enterAnim=#7f01001e exitAnim=#7f01001f
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager: popEnterAnim=#7f010020 popExitAnim=#7f010021
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager: Op #1: SET_PRIMARY_NAV StaffBookingDetailsFragment{82e8301 (97f79b28-d8c1-432a-9e1c-3a781dd42434) id=0x7f0a01c5}
2019-08-15 16:59:30.897 30041-30041/com.app.debug D/FragmentManager: enterAnim=#7f01001e exitAnim=#7f01001f
2019-08-15 16:59:30.897 30041-30041/com.app.debug D/FragmentManager: popEnterAnim=#7f010020 popExitAnim=#7f010021
2019-08-15 16:59:31.935 …Run Code Online (Sandbox Code Playgroud) android android-fragments android-jetpack android-architecture-navigation android-jetpack-navigation
我正面临着使用 Android 导航组件重新创建片段的问题。我已经集成了底部导航并将其与 android 导航组件结合起来。因此,每次单击底部栏上的选项卡时,都会重新创建片段并且不会保留旧状态。
即使我转到其他选项卡并返回,我也想保留片段的状态。我没有在任何地方找到任何解决方案。
除了底部导航,我使用navController.navigate()方法在不同的片段之间导航。
android android-fragments android-jetpack android-architecture-navigation android-jetpack-navigation
我有 3 个底部导航选项卡,称为Home, Dashboard, Profile.
Home,我有Fragment1和Fragment2,Dashboard,我有Fragment3和Fragment4Profile,我有MyProfile和EditProfile。现在,在 中Fragment2,一个按钮changeAvatar可以EditProfile在 stack 中打开Profile。因为EditProfile应该在 tab 中Profile,所以如果我不想包含EditProfile到navGraphof 中Home,我该如何实现这种行为?
navigation android android-architecture-navigation android-jetpack-navigation
导航撰写版本2.4.0-alpha06
我有一个导航抽屉Scaffold,其中部分项目是由 ViewModel 动态生成的。
示例项目有
其中 A、B、C... 都共享相同的Screencalled Category,只是传递了不同的参数(例如 Category/A、Category/B)。
在我的里面Scaffold
...
val items = viewModel.getDrawerItems()
// This gives something like
// ["Home", "Category/A", "Category/B", "Category/C", ..., "Settings"]
// where each String represents "route"
...
val backstackEntry = navController.currentBackStackEntryAsState()
val currentScreen = Screen.fromRoute(
backstackEntry.value?.destination?.route
)
Log.d("Drawer", "currentScreen: $currentScreen")
items.forEach { item ->
DrawerItem(
item = item,
isSelected = currentScreen.name == item.route,
onItemClick = {
Log.d("Drawer", "destinationRoute: ${item.route}") …Run Code Online (Sandbox Code Playgroud) android kotlin android-jetpack-navigation android-jetpack-compose android-jetpack-compose-scaffold
为什么导航可组合项调用两次?如果我在文本上设置断点,应用程序运行时我将停止两次。谢谢您的回答。
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
var i: Int = 0
NavHost(navController = navController, startDestination = "s1") {
composable("s1") {
i++
Text("$i")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) android-jetpack-navigation ×10
android ×9
android-architecture-navigation ×4
android-jetpack-compose-scaffold ×1
kotlin ×1
navigation ×1