我正在检查如何使用空的返回堆栈启动活动,并遇到了该android:noHistory属性。它做了我想要的,但我仍然对文档中使用的术语“历史堆栈”感到好奇android:noHistory。我在 API 指南中没有注意到该术语的任何用法(例如任务 和 Back Stack),那么返回堆栈和历史堆栈之间是否有任何区别,或者它们只是同一件事?
更新
到目前为止,参考文献中使用了三个术语:
这个问题可能会开始变得挑剔,因为它们似乎都可以互换使用,但我仍然有兴趣知道它们之间的差异(如果有的话)。
Serializable使用深层链接时是否可以使用自定义对象作为片段参数?
我已经尝试了以下操作 - 在我的导航图 XML 文件中,我添加了以下几行:
<fragment
android:id="@+id/eventFragment"
android:name="com.myapp.EventFragment"
android:label="EventFragment">
<argument
android:name="event"
app:argType="com.myapp.EventId" />
<deepLink app:uri="myapp://event/{event}" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
EventId可序列化数据类在哪里:
data class EventId(val value: Long) : Serializable
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试使用 URL 运行应用程序时myapp://event/4002,会引发以下异常:
Caused by: java.lang.UnsupportedOperationException: Serializables don't support default values.
at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:834)
at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:787)
at androidx.navigation.NavType.parseAndPut(NavType.java:96)
at androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:99)
at androidx.navigation.NavDestination.matchDeepLink(NavDestination.java:366)
at androidx.navigation.NavGraph.matchDeepLink(NavGraph.java:79)
at androidx.navigation.NavController.handleDeepLink(NavController.java:540)
at androidx.navigation.NavController.onGraphCreated(NavController.java:499)
at androidx.navigation.NavController.setGraph(NavController.java:460)
at androidx.navigation.NavController.setGraph(NavController.java:425)
at androidx.navigation.NavController.setGraph(NavController.java:407)
at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:236)
Run Code Online (Sandbox Code Playgroud)
long用( )替换 typeapp:argType="long"解决了问题 - 没有例外,一切都按预期进行。
导航库似乎不知道如何将 URL 中的原始值转换为我的EventId类。是否可以以某种方式注册一个知道如何转换它的适配器?或者也许还有另一种解决方案?
android android-navigation android-architecture-navigation android-deep-link android-jetpack-navigation
我正在尝试实现来自 google 的新 Jetpack 导航框架,但遇到了问题。我想使用我的第一个片段作为登录页面,并且不希望其中有工具栏。如何从其中一个片段中删除工具栏,然后将其添加到后续片段中?
编辑:尝试查看 AppBarConfiguration,但这似乎只影响后退箭头是否显示
使用导航 UI 创建底部应用程序栏导航BottomNavigationView,FragmentContainerView类似于示例应用程序NavigationAdvancedSample。
请注意,NavigationAndvancedSample应用程序似乎没有使用文档中描述的相同实现,因为它有一个使用自定义扩展方法的解决方法实现setupWithNavController。
使用.在MainActivity.ktNavHostFragment中创建 时为 Null 。BottomNavigationViewFragmentContainerView
可重现的错误和完整的代码示例可在BottomNavigationViewSample存储库中找到。
\n\n\n2020-05-15 12:39:19.117 18747-18747/com.example.bottomnavigationviewsample E/AndroidRuntime: 致命异常: main\n 进程: com.example.bottomnavigationviewsample, PID: 18747\n java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.bottomnavigationviewsample/com.example.bottomnavigationviewsample.MainActivity}:kotlin.TypeCastException:null 无法转换为非 null 类型 androidx.navigation.fragment.NavHostFragment\n 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)\n 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)\n 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java :83)\n 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\n 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\n 在 android.app.ActivityThread$ H.handleMessage(ActivityThread.java:2016)\n 在 android.os.Handler.dispatchMessage(Handler.java:107)\n 在 android.os.Looper.loop(Looper.java:214)\n 在 android.app .ActivityThread.main(ActivityThread.java:7356)\n 在 …
android android-fragments android-navigation android-architecture-navigation android-bottomappbar
我在我的应用程序中遇到了一个问题,我发现自己以一种笨拙的方式在 Activity 之间共享数据 - 因此我决定尝试将应用程序的大部分内容切换到单个 Activity(以便跨屏幕使用单个 ViewModel),使用导航组件交换片段而不是更改活动。
似乎对于每个目的地,我都需要一个 xml 布局文件和一个片段类,如下所示:
class DestinationFragment: Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_destination_layout, container, false)
return view
}
}
Run Code Online (Sandbox Code Playgroud)
(我实际上使用的是 Java,但只能找到 Kotlin 示例。)
但是我不确定如何处理地图屏幕。我目前已将其作为自己的活动:
活动地图.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapsActivity">
<!-- Toolbar stuff -->
<FrameLayout android:id="@+id/container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/my_toolbar"
xmlns:android="http://schemas.android.com/apk/res/android">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapsActivity" />
</FrameLayout>
</RelativeLayout> …Run Code Online (Sandbox Code Playgroud) 我想在(活动)中单击 FAB 导航到新片段 1。
在我所有页面通用的主要活动中的代码 fab 按钮中。有人可以指导我吗?
活动.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation" />
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:navigationIcon="@drawable/ic_baseline_dashboard_24"
app:navigationContentDescription="Navigation icon"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_anchor="@id/bottomAppBar"
android:backgroundTint="@color/colorPrimary"
style="@style/Widget.App.FloatingActionButton"
app:srcCompat="@drawable/menu_bug" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
图.xml
<?xml version="1.0" encoding="utf-8"?>
<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_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.androidfeby.bugreport.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/navigation_report"
android:name="com.androidfeby.bugreport.ui.report.FragmentReport"
android:label="@string/title_dashboard"
tools:layout="@layout/fragment_report" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.androidfeby.bugreport.ui.history.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
要求:如果我点击 fab 按钮,只需导航到图中的片段“navigation_report”
android android-navigation android-jetpack android-architecture-navigation
因此,就像标题所说,我正在尝试根据我正在使用的文档从包中检索传递的参数var args = GameWonFragmentArgs.fromBundle(arguments!!)。但Android Studio建议使用以下代码:
var args = GameWonFragmentArgs.fromBundle(requireArguments())
我查找了 Fragment 的 Android 文档,发现它requireArguments()返回 @NonNull Bundle 或 IllegalStateException。为什么Android Studio建议使用它,两者有什么区别?
另外,我找不到有关 的相关文档fromBundle()。
我已经使用导航组件设置了底部导航,但是每当我在片段之间导航时,我都会看到白色闪烁。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
navController = Navigation.findNavController(this, R.id.dashboardNavHostFragment)
bottomNavigationView.setupWithNavController(navController)
}
Run Code Online (Sandbox Code Playgroud)
这就是我设置底部导航的方式。
android android-layout android-fragments android-navigation android-architecture-navigation
谷歌表示,在 Fragment 之间进行通信时,通过将其范围限定为 Activity 来使用 SharedViewModel。
在单个 Activity 应用程序中,这意味着该 Activity 将散布着可能不再需要的 ViewModel,并且它们将在整个生命周期中保留在那里。考虑一些示例,例如扩展的注册流程或考虑几个屏幕的示例。
推荐的一种方法是使用父片段作为范围,但这只有在存在父片段时才可能。它可以只是不同的片段。
我想出了以下解决方案,我想知道它有多可行或有多糟糕,是否有更好的方法?
考虑到我有两个名为ExampleOneFragmentand的片段ExampleTwoFragment,为了简单起见,我希望它们具有共享范围,而不实际将其范围限定到活动。假设我想更新其中的文本视图ExampleOneFragment,ExampleTwoFragment因此我为两者创建一个像这样的 SharedViewModel
因为ExampleOneFragment它将是:
private val mSharedViewModel by lazy {
ViewModelProvider(this).get(SharedViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)
因为ExampleTwoFragment我想出了这个:
private val mSharedViewModel by lazy {
ViewModelProvider(supportFragmentManager().findFragmentByTag(ExampleOneFragment.TAG) ?: this).get(SharedViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我不知道这会导致什么样的问题。
我发现了一些其他解决方案:根据@mikhehc这里,我们实际上可以创建我们自己的 ViewModelStore。这将使我们能够精细地控制 ViewModel 必须存在的范围。但我不明白如何让它适用于片段?
其次,仍然是将其范围限定为活动的黑客方法,但使用我在此处找到的相同密钥通过虚拟视图模型将其清除
谁能指导我什么是正确的方法?我无法转向 NavGraphs,因为它是一个已经启动并正在运行的项目,并且确定活动范围感觉是错误的。谢谢。
android android-fragments android-navigation android-viewmodel android-architecture-navigation
我已将导航框架从 2.3.5 更新到 2.4.0-alpha01 版本。我将它与 Safe Args gradle 插件一起使用。更新后,我开始出现'getActionId' overrides nothing错误'getArguments' overrides nothing。
我认为发生这种情况是因为 Safe Args在生成 Direction 类时不正确地覆盖了actionId和arguments字段。NavDirections
例如,这是正在生成的内容:
public override fun getActionId(): Int =
R.id.action_navigation_articles_to_articleReaderFragment
Run Code Online (Sandbox Code Playgroud)
这是应该生成的:
public override val actionId: Int = R.id.action_navigation_articles_to_articleReaderFragment
Run Code Online (Sandbox Code Playgroud)
如何获得安全参数来生成正确的构建器类?
android android-navigation android-architecture-navigation android-safe-args