我在用bottom navigation。
在切换的屏幕中,还有打开dialog fragment.
我也为此使用了导航。
这是因为,一旦dialog完成,data就必须传递到打开对话框的屏幕。
我用的safe args是这个。
但我遇到了与标题相同的错误。
我知道错误在哪里,但我不知道为什么会发生。
根据Stack Overflow上的搜索,有人遇到了和我一样的问题,但似乎并不是一个确切的解决方案,因为情况不同。
导航图
<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/nav_graph"
app:startDestination="@id/calendar">
<fragment
android:id="@+id/calendar"
android:name="com.example.writeweight.fragment.CalendarFragment"
android:label="fragment_calendar"
tools:layout="@layout/fragment_calendar" >
</fragment>
<fragment
android:id="@+id/list"
android:name="com.example.writeweight.fragment.WorkoutListFragment"
android:label="fragment_workout_list"
tools:layout="@layout/fragment_workout_list" />
<fragment
android:id="@+id/write"
android:name="com.example.writeweight.fragment.WritingRoutineFragment"
android:label="WritingRoutineFragment"
tools:layout="@layout/fragment_writing_routine">
<action
android:id="@+id/action_write_to_bodyPartDialog"
app:destination="@id/bodyPartDialog" />
<argument
android:name="title"
app:argType="string"
android:defaultValue="Write" />
</fragment>
<dialog
android:id="@+id/bodyPartDialog"
android:name="com.example.writeweight.fragment.BodyPartDialogFragment"
android:label="BodyPartDialogFragment"
tools:layout="@layout/fragment_body_part_dialog">
<action
android:id="@+id/action_bodyPartDialog_to_write"
app:destination="@id/write">
</action>
</dialog>
</navigation>
Run Code Online (Sandbox Code Playgroud)
主要活动
class MainActivity : AppCompatActivity() {
private lateinit var bottomNav: BottomNavigationView
private …Run Code Online (Sandbox Code Playgroud) 在添加导航目录时显示错误无效的资源目录.
处理命令'〜/ 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
我正在使用喷气背包导航从片段过渡到细节片段。
我需要帮助在显示它的片段上呈现细节片段。
请参阅下面的照片以了解我想要实现的目标:
我还在导航图中的动画上使用基本的淡入/淡出作为输入退出。
这是我得到的结果:
如何设置过渡以便细节片段显示在呈现视图上?
这是我所有的进展:
底部导航菜单
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/fragment_tab1"
android:title="Tab 1"/>
<item
android:id="@+id/fragment_tab2"
android:title="Tab 2"/>
<item
android:id="@+id/fragment_tab3"
android:title="Tab 3"/>
</menu>
Run Code Online (Sandbox Code Playgroud)
导航图
<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/nav_graph"
app:startDestination="@id/fragment_tab1">
<fragment android:id="@+id/fragment_tab1" android:name="com.example.navgraphfragmentmodal.Tab1" android:label="fragment_tab1"
tools:layout="@layout/fragment_tab1">
<action android:id="@+id/toModal" app:destination="@id/modalFragment"/>
</fragment>
<fragment android:id="@+id/fragment_tab2" android:name="com.example.navgraphfragmentmodal.Tab2" android:label="fragment_tab2"
tools:layout="@layout/fragment_tab2"/>
<fragment android:id="@+id/fragment_tab3" android:name="com.example.navgraphfragmentmodal.Tab3"
android:label="fragment_tab3" tools:layout="@layout/fragment_tab3"/>
<fragment android:id="@+id/modalFragment" android:name="com.example.navgraphfragmentmodal.ModalFragment"
android:label="fragment_modal" tools:layout="@layout/fragment_modal"/>
</navigation>
Run Code Online (Sandbox Code Playgroud)
主活动.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.navigation_host_fragment) as NavHostFragment?
NavigationUI.setupWithNavController(bottom_navigation_view, navHostFragment!!.navController)
supportActionBar?.setDisplayShowHomeEnabled(true)
} …Run Code Online (Sandbox Code Playgroud) android android-fragments android-navigation android-transitions android-jetpack
我正在使用 Jetpack Navigation 来处理底部导航控制器。效果很好;但是,我正在寻找一种改进用户体验的方法。
是否可以禁用用户当前导航到的选项卡?
我可以“垃圾邮件”底部导航中的当前选项卡,这会不必要地重新加载数据和 UI。如果这种行为(重新点击当前选项卡)是有意的,有没有办法保留片段的状态,以便在导航离开时不会重新创建?
我如何处理底部导航:
navController = NavHostFragment.findNavController(navigation_host_fragment)
NavigationUI.setupWithNavController(bottom_navigation_view, navController)
Run Code Online (Sandbox Code Playgroud) 我正在尝试向应用程序的工具栏添加一个菜单
我的应用基于单活动多片段
我正在使用导航组件,我的应用程序样式是:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我在 MainActivity 的 onCreate 方法中像这样配置 grapp:
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController,appBarConfiguration)
Run Code Online (Sandbox Code Playgroud)
我的问题是如何为不同的片段添加不同的自定义菜单项?另外,我添加了后退按钮如何处理它的点击并将其隐藏在第一个片段上?
免责声明:我已经检查了文档,因为2.1.0导航组件支持对话框片段。(https://developer.android.com/jetpack/androidx/releases/navigation#2.1.0)
DialogFragment尝试从 a 转到my时出现此错误Start Destination:
java.lang.IllegalStateException: Fragment PostDistressDialog{829f5d1} (bbbc4926-684b-491b-9772-e0f0ffebe0af)} not associated with a fragment manager.
PostDistressDialog是使用导航组件DialogFragment调用的JournalEntryFragment(可以在下面的地图中看到)。PostDistressDialog不是 的内部类JournalEntryFragment。它属于自己扩展的一类DialogFragment
public class PostDistressDialog extends DialogFragment implements ISaveDatabase {
...
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
if (getArguments()!=null) {
...
// Set up the Alert Dialog
AlertDialog.Builder alertDialog = new AlertDialog.Builder(getContext());
alertDialog.setTitle(R.string.distressed_levels);
alertDialog.setMessage(R.string.distressed_how_feel_post);
// Inflate and set the layout for …Run Code Online (Sandbox Code Playgroud) android android-fragments android-navigation android-navigationview
我已经实现了一个在 nav_graph 中的片段之间传递的参数,但是当我尝试在原始片段中设置参数时,NavDirections 找不到该参数。
请注意,在尝试传递参数之前,导航工作正常。
如果我执行 Clean Project,我会丢失 NavDirections。如果我进行重建,我将失去论点。
摇篮:应用程序
//Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
apply plugin: "androidx.navigation.safeargs.kotlin"
Run Code Online (Sandbox Code Playgroud)
导航图.xml
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails" />
<argument
android:name="fltData"
app:argType="string" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
在我的 Home Fragment 中,我收到错误“Unresolved reference: fltData”
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails()
actionDetails.fltData ( flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
Run Code Online (Sandbox Code Playgroud)
flightData 是一个数据类
data class FlightDTO(
var airlineName: String, var faCode: String, var fltNo: String, var aircraft: String,
var …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,其中有一个活动和大约 29 个片段nav_graph,其中两个片段用于身份验证,我需要使用 a 在这两个片段之间共享数据,shared view model但不与其他片段共享数据。
因此,我创建了我的并使用库的一部分ViewModel在两个片段中实例化了它。viewModels()fragment-ktx
private val viewModel: AuthViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
但是,一旦我使用导航到第二个片段,findNavController().navigate()我就会丢失其中的所有数据AuthViewModel
AuthViewModel.kt
class AuthViewModel @ViewModelInject constructor(
private val authRepository: AuthRepository
) : BaseViewModel()
Run Code Online (Sandbox Code Playgroud)
我这里还缺少任何其他步骤吗?
编辑
onViewCreated我正在从该方法访问数据
android android-studio android-navigation android-viewmodel android-architecture-navigation
我创建了一个 Android 应用程序,并从 Gallery 添加了“导航抽屉活动”,我删除并重命名了菜单项。当我单击抽屉活动中的任何菜单项时启动应用程序后,我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()' on a null object reference
at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.java:78)
at androidx.navigation.ui.NavigationUI$3.onNavigationItemSelected(NavigationUI.java:453)
at com.google.android.material.navigation.NavigationView$1.onMenuItemSelected(NavigationView.java:215)
at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)
at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)
at com.google.android.material.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:416)
at android.view.View.performClick(View.java:7448)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Run Code Online (Sandbox Code Playgroud)
主要活动代码:
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var navView: NavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initView()
} …Run Code Online (Sandbox Code Playgroud) 我使用navigation和SafeArgs到switch screens和pass data。
当在屏幕上选择数据时A,数据在屏幕切换的同时传输。
但是,有时屏幕会在没有任何操作的情况下A切换到屏幕B。
null我决定在这种情况下发送。
但我不断收到以下错误:
\nE/AndroidRuntime: FATAL EXCEPTION: main\n Process: com.example.lightweight, PID: 9555\n java.lang.RuntimeException: java.lang.reflect.InvocationTargetException\n at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\n Caused by: java.lang.reflect.InvocationTargetException\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\xc2\xa0\n Caused by: java.lang.reflect.InvocationTargetException\n at java.lang.reflect.Method.invoke(Native Method)\n at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54)\n at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35)\n at com.example.lightweight.fragment.WriteRoutineFragment.getArgs(WriteRoutineFragment.kt:20)\n at com.example.lightweight.fragment.WriteRoutineFragment.onViewCreated(WriteRoutineFragment.kt:44)\n at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2985)\nRun Code Online (Sandbox Code Playgroud)\n导航.xml
\n<fragment\n android:id="@+id/writeRoutine"\n android:name="com.example.lightweight.fragment.WriteRoutineFragment"\n android:label="fragment_write_routine"\n tools:layout="@layout/fragment_write_routine" >\n <action\n android:id="@+id/action_writeRoutineFragment_to_workoutListTabFragment"\n app:destination="@id/workoutListTabFragment" />\n …Run Code Online (Sandbox Code Playgroud) android android-navigation android-safe-args android-navigation-graph
android ×10
kotlin ×3
android-architecture-navigation ×2
android-architecture-components ×1
androidx ×1
menuitem ×1