标签: android-architecture-navigation

资源目录导航无效

在添加导航目录时显示错误无效的资源目录.

处理命令'〜/ 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

2
推荐指数
1
解决办法
310
查看次数

无法实例化片段 androidx.navigation.fragment.NavHostFragment

错误

无法实例化片段 androidx.navigation.fragment.NavHostFragment:确保类名存在,是公共的,并且有一个公共的空构造函数。

活动布局

 <fragment
        android:id="@+id/my_nav_host_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/app_nav" />
Run Code Online (Sandbox Code Playgroud)

活动

class HomeActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
    }
}
Run Code Online (Sandbox Code Playgroud)

分段

class MovieListFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_movie_list, container, false)
    }
}
Run Code Online (Sandbox Code Playgroud)

使用的依赖:

implementation('android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha07') {
    exclude group: "com.android.support"
}
implementation('android.arch.navigation:navigation-ui-ktx:1.0.0-alpha07') {
    exclude group: "com.android.support"
}
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-jetpack android-architecture-navigation

2
推荐指数
2
解决办法
3019
查看次数

无法解决:添加导航后的片段

当我尝试添加依赖项时出现此错误 Navigation

无法解决:片段

我添加了这些行:

implementation "android.arch.navigation:navigation-fragment-ktx:$navigationVersion"
implementation "android.arch.navigation:navigation-ui-ktx:$navigationVersion"
Run Code Online (Sandbox Code Playgroud)

在项目 gradle 这是我添加的内容:

ext{
    navigationVersion = '1.0.0-alpha09'
}
repositories {
    google()
    jcenter()
}
Run Code Online (Sandbox Code Playgroud)

我试图使缓存无效并重新启动,但没有奏效。

旁注我已经迁移到androidx没有问题,但在我尝试添加Navigation库后,出现此错误

android android-architecture-components android-architecture-navigation

2
推荐指数
1
解决办法
1938
查看次数

android导航图中的全局动作和目的地特定动作之间的区别?

在android导航图中,我们有全局动作目的地内的动作

使用全局动作,多个目的地可以重用一个动作。那么在目的地内使用动作有什么好处呢?
换句话说,在整个导航图中使用全局动作的缺点是什么?

android android-architecture-navigation

2
推荐指数
1
解决办法
1137
查看次数

Navigation.createNavigateOnClickListener 来自 onBindViewHolder?

我想在 中设置一个 onclicklisteneronBindViewHolder以便导航到不同的片段并将一些数据发送到该片段。

对于我的生活,我似乎无法找到让它发挥作用的方法。非常感谢任何和所有帮助!

适配器类:

class ListAdapter(private val list: List<Workout>): RecyclerView.Adapter<WorkoutViewHolder>() {

    override fun getItemCount(): Int{
        return list.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        return WorkoutViewHolder(layoutInflater, parent)
    }

    override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
        val workout: Workout = list[position]
        holder.itemView.setOnClickListener{
            Toast.makeText(holder.itemView.context, "TEST", Toast.LENGTH_LONG).show()
            val id = workout.workoutId
            val bundle = Bundle()
            bundle.putInt("workoutId", id)
            Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment)
        }
        holder.bind(workout)
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以让吐司弹出,所以 onclicklistener 似乎正在工作。但是,导航部分不起作用。如果我只是在托管 recyclerview 的片段内设置一个按钮并添加button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment))它可以很好地导航。所以问题似乎是从 onbindviewholder 内的 onclicklistener 内部调用导航功能

android kotlin android-recyclerview android-architecture-navigation

2
推荐指数
1
解决办法
1066
查看次数

如何使用 Android Jetpack 的导航组件禁用后退导航并删除 Fragment 上的后退箭头?

我正在将 Google 推荐的单一活动模式与 Android Jetpack 的导航组件一起使用。

片段 1 是身份验证屏幕。在用户通过身份验证并导航到 Fragment 2 后,我想按下 Android 后退按钮关闭应用程序,并删除应用程序栏中的后退箭头。

我已经找到了一些方法,例如onBackPressedDispatcher从后按添加/删除功能,但没有任何方法可以删除后退箭头。

app:popUpTo="@+id/firstFragment"从 Fragment 1 导航到 Fragment 2 时,我也尝试过,但这也不起作用。

这应该可以用一行代码来指定。还在努力寻找。有小费吗?

android android-fragments android-architecture-navigation

2
推荐指数
1
解决办法
6201
查看次数

导航组件 - 模拟导航控制器图

我正在使用导航组件,并且正在尝试Fragment使用仪器测试来测试我的组件。该片段具有onViewCreated由扩展函数在方法中初始化的自定义工具栏。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    tbBlack.init()
}


fun androidx.appcompat.widget.Toolbar.init(
    menuId: Int? = null
) {
    title = ""
    menuId?.let {
        inflateMenu(it)
    }

    findNavController().let {
        it.graph.let { graph ->
            val configuration = AppBarConfiguration(graph)
            setupWithNavController(it, configuration)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的仪器测试中的场景初始化期间,由于null导航控制器上的图形导致测试崩溃。

导航控制器在测试中被模拟,以及如下图:

@RunWith(AndroidJUnit4::class)
class LoginFragmentTest {
    @Test
    fun testEmptyFields() {
        val mockNavController = mock(NavController::class.java)
        val mockGraph = mock(NavGraph::class.java)
        mockNavController.graph = mockGraph

        val scenario = launchFragmentInContainer(themeResId = R.style.AppTheme) {
            LoginFragment().also { fragment -> …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-espresso android-architecture-navigation

2
推荐指数
1
解决办法
1044
查看次数

Navigation.findNavController(it) 和 NavHostFragment.findNavController() 有什么不同?

Navigation.findNavController(it)我想知道和之间的区别NavHostFragment.findNavController(this)。基本上两者都在做同样的事情,但不知道这些方法必须使用的确切位置。

android android-architecture-navigation

2
推荐指数
1
解决办法
2668
查看次数

无法使用 NavigationUI 设置 optionMenu

我有片段,我想添加选项菜单。我已经尝试了很多但没有找到任何解决方案。

这是我的代码。

package com.code2hack.milkledger.fragment

import android.app.AlertDialog
import android.os.Bundle
import android.view.*
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.code2hack.milkledger.BaseActivity
import com.code2hack.milkledger.MainActivityViewModel
import com.code2hack.milkledger.R
import com.code2hack.milkledger.actionmode.ActionModeCallback
import com.code2hack.milkledger.adapter.CustomerAdapter
import com.code2hack.milkledger.dialog.AddUserDialog
import com.code2hack.milkledger.handler.ItemClickListener
import com.code2hack.milkledger.model.Customer
import com.code2hack.milkledger.util.Event
import com.google.android.material.card.MaterialCardView
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_customer_list.*

class CustomerListFragment : BaseFragment() {
    private val baseActivity: BaseActivity by lazy { activity as BaseActivity };
    private var selectMode = false
    val …
Run Code Online (Sandbox Code Playgroud)

android fragment android-architecture-navigation android-jetpack-navigation

2
推荐指数
1
解决办法
576
查看次数

Resources$NotFoundException 包含动态导航图

我有一个动态功能模块,它有自己的嵌套导航图。我还有一个动态功能模块,它只是一个片段。如果您有一个带有自己的导航图的动态功能模块,我知道您需要使用include-dynamic标签。当我构建应用程序并将应用程序部署到 Play 商店进行内部测试时,动态模块下载正确。但是,如果我在本地构建/运行 - 当我尝试导航到包含导航图的动态功能模块时,应用程序会崩溃。我以为在本地运行时一切都被捆绑了?有什么我想念的吗?

我得到的错误是 android.content.res.Resources$NotFoundException: com.xyz.app_name.two:navigation/two_navigation

main_navigation_graph

<!-- this works locally. module does not contain a nav graph -->
<fragment
    android:id="@+id/OneFragment"
    android:name="com.xyz.app_name.one.OneFragment"
    android:label="{nickname}"
    app:moduleName="one"
    tools:layout="@layout/one_fragment">
    <argument
        android:name="nickname"
        app:argType="string" />
</fragment>

<!-- this doesn't work locally -->
<include-dynamic
    android:id="@+id/two_graph"
    app:graphPackage="com.xyz.app_name.two"
    app:graphResName="two_navigation"
    app:moduleName="two" />
Run Code Online (Sandbox Code Playgroud)

feature_two_graph

<?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/two_graph"
    app:moduleName="two"
    app:startDestination="@id/twoFragment">

    <fragment
        android:id="@+id/twoFragment"
        android:name="com.xyz.app_name.two.TwoFragment"
        android:label="{nickname}"
        tools:layout="@layout/two_fragment">
        <argument
            android:name="nickname"
            app:argType="string" />
        <action
            android:id="@+id/action_twoFragment_to_dialogFragment"
            app:destination="@id/dialogFragment" />
    </fragment>

    <dialog
        android:id="@+id/dialogFragment"
        android:name="com.xyz.app_name.two.ui.DialogFragment"
        android:label="bottom_sheet"
        tools:layout="@layout/bottom_sheet" />

</navigation>
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-architecture-navigation android-jetpack-navigation dynamic-feature-module

2
推荐指数
1
解决办法
336
查看次数