标签: android-navigation

支持与导航组件的隐式和显式深度链接

我正在使用导航组件,并且当用户点击通知时,我尝试触发到由片段表示的特定目的地的显式深度链接。

根据文档,可以像这样创建待定意图:

val bundle = bundleOf("id" to "1234")

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.myDestination)
    .setArguments(args)
    .createPendingIntent()
Run Code Online (Sandbox Code Playgroud)

其中 nav_graph 定义如下:

<fragment 
   android:id="@+id/myDestination"
   android:name="MyFragment">

   <argument
      android:name="id"
      app:argType="string" />

   <deepLink app:uri="myApp://myFragment?id={id}" /> // Removing this line it works fine

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

然后,我将使用以下方法在通知中使用pendingIntent NotificationCompat.Builder

.setContentIntent(pendingIntent) 
Run Code Online (Sandbox Code Playgroud)

当我点击通知时,实际上打开了正确的目的地,但该值args.id将为“null”(不是null,而是一个具有“null”值的字符串。在我的片段中,我有

private val args by navArgs<MyFragmentArgs>()

...

override fun onCreate(saveInstanceState: Bundle?) {
   args.id // The string value is "null". 
} 
Run Code Online (Sandbox Code Playgroud)

<deepLink>但是,如果我从片段中删除它,那么它就会起作用。问题是我需要隐式和显式的深层链接。有没有办法通过导航组件同时支持两者?

android android-fragments android-navigation android-architecture-navigation android-navigation-graph

5
推荐指数
1
解决办法
8667
查看次数

导航不再工作,错误:忽略 popBackStack 到目的地,因为在当前返回堆栈上找不到它

突然,我的应用程序中的导航突然无法正常工作(昨天确实有效)。

这是一个示例:当我从 导航userLoggedInFragment到 时userLoggedOutFragment,使用参数app:popUpTo="@id/userLoggedOutFragment" app:popUpToInclusive="true",然后单击后退按钮,即使我使用了 popUpTo,它仍然会将我导航回 userLoggedInFragment。然后我得到信息:

I/NavController: Ignoring popBackStack to destination com.example.app:id/userLoggedOutFragment as it was not found on the current back stack
Run Code Online (Sandbox Code Playgroud)

这是我的片段代码

用户登录片段

@AndroidEntryPoint
class UserLoggedInFragment : Fragment() {
    private var _binding: FragmentUserLoggedInBinding? = null
    private val binding: FragmentUserLoggedInBinding get() = _binding!!
    private val viewModel: LogoutViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentUserLoggedInBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-jetpack android-architecture-navigation

5
推荐指数
1
解决办法
6590
查看次数

导航图中的 ClassNotFoundException android

我在 firebase 上看到了这个崩溃,并且在相同操作系统的模拟器中无法重现。不知道是什么原因造成的。三星 M32 OS 11 发生崩溃。

崩溃是

Caused by java.lang.RuntimeException: java.lang.ClassNotFoundException: com.octave.data.offer.Classes
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/offer_nav_graph"
app:startDestination="@id/offersFragment">

<fragment
    android:id="@+id/availableOfferDetailFragment"
    android:name="com.octave.offers.available.detail.AvailableOfferDetailFragment"
    android:label="fragment_available_offer_detail"
    tools:layout="@layout/fragment_available_offer_detail">
    <action
        android:id="@+id/action_availableOfferDetailFragment_to_applyOfferFragment"
        app:destination="@id/applyOfferFragment">
        <argument
            android:name="classes"
            app:argType="com.octave.data.offer.Classes[]" />
        <argument
            android:name="paymentPlans"
            app:argType="com.octave.data.offer.PaymentPlan[]" />
        <argument
            android:name="offerName"
            app:argType="string" />
    </action>
</fragment></navigation>
Run Code Online (Sandbox Code Playgroud)

我的数据类如下

@Parcelize
data class Classes(
val id: Int,
val name: String,
val totalEquity: Int,
val reservedEquity: Int,
val expectedReturn: Float,
val subscribed: Int
):Parcelable

@Parcelize
data class PaymentPlan(
val id: String?=null,
val name: String,
var payment: Int,
val …
Run Code Online (Sandbox Code Playgroud)

android classnotfoundexception kotlin android-navigation android-navigation-graph

5
推荐指数
1
解决办法
656
查看次数

使用 setupWithNavController:2.5.0-alpha01 导致每次调用 OnViewCreated

我使用导航组件和底部导航栏,并为了处理选项卡栏导航,请调用以下代码

绑定.bottomNavigationView.setupWithNavController(navController)

在上一个版本之前,我在使用 setupWithNavController() 时保存每个片段的状态时遇到了一个大问题,但是由于最新版本的导航 API(>=:2.4.0),它支持多个返回堆栈,我可以轻松在选项卡之间导航,无需担心再次加载所有数据。

但我发现每次导航每个选项卡时,都会调用 OnViewCreated 函数!这给我带来了一些问题。

例如,OnViewCreated是一个使用repeatOnLifeCycle来收集流量的地方,而OnViewCreated的这种重复调用导致了很多流量的订阅者!

甚至在文件中说:

最佳实践是在生命周期初始化时调用此函数。例如,Activity 中的 onCreate 或 Fragment 中的 onViewCreated。否则,可能会创建多个重复执行相同操作的协程并同时执行。

它假定 OnViewCreated 是一个被调用一次的地方!

明显的问题是,首先,这种行为是一个问题还是预期的?如果是预期的话,我们可以在哪里收集流量?请详细说明为什么会发生这种情况?

android android-navigation android-bottomnav android-navigation-graph

5
推荐指数
1
解决办法
624
查看次数

从撰写导航到片段

我想从撰写导航到片段。我在 compose 中定义了一个 NavHost:

NavHost(
   navController = navController,
   startDestination = DrawerScreen.Screen2.route
) {
   composable(DrawerScreen.Screen1.route) {
      navController.navigate(R.id.screen_one)
   }
   composable(DrawerScreen.Screen2.route) {
      Screen2(
         openDrawer = {
            openDrawer()
         }
      )
   }
}
Run Code Online (Sandbox Code Playgroud)

简单片段:

@AndroidEntryPoint
class ScreenOneFragment: Fragment() {

   @Nullable
   override fun onCreateView(
      inflater: LayoutInflater,
      @Nullable container: ViewGroup?,
      @Nullable savedInstanceState: Bundle?
   ): View {
      val view: View = inflater.inflate(R.layout.screen_one, container, false)
      return view
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试导航时,出现以下异常:

java.lang.IllegalArgumentException: Navigation action/destination com.test/screenOne cannot be found from the current destination Destination(0x2b264dff) route=ScreenOne
Run Code Online (Sandbox Code Playgroud)

这是我的导航 xml:

<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" …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-architecture-navigation android-jetpack-compose

5
推荐指数
1
解决办法
5121
查看次数

适用于所有活动的Android父级导航抽屉

我正在创建一个应用程序,它需要所有活动的相同导航抽屉.为此,我创建了一个扩展Activity(需要子类)的类,并在那里编写了Navigation Drawer的代码.

public class NavigationDrawerClass extends Activity {
    String [] names = new String[]{"Rohan", "Muthu","Rishi"};
    private ActionBarDrawerToggle mDrawerToggle;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.navigation_drawer_class);
        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        ListView list = (ListView) findViewById(R.id.left_drawer);
        list.setAdapter(new ArrayAdapter<String>(NavigationDrawerClass.this, android.R.layout.simple_list_item_1, names));
        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(
                NavigationDrawerClass.this,                  /* host Activity */
                drawerLayout,         /* DrawerLayout object */
                R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret …
Run Code Online (Sandbox Code Playgroud)

inheritance android navigation-drawer android-navigation

4
推荐指数
1
解决办法
3248
查看次数

Android - 从活动到片段的导航

我正在开发一些应用程序,我有一个问题.

我有:1.在FrameLayout中使用ListFragment的活动A(导航抽屉模式):xml:

    <FrameLayout
        ...>

    </FrameLayout>

    <LinearLayout
        ...>

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
  1. 活动B,显示ListFragment中ListView的详细数据.

如何通过保存ListFragment的UI从活动B返回(使用导航按钮)到活动A(如果我使用Home Back返回,则重新创建活动).顺便说一句,如果我按下手机上的后退按钮,活动就不会重新创建并返回之前的状态.

android android-fragments android-activity android-navigation android-savedstate

4
推荐指数
1
解决办法
4326
查看次数

GnssStatus.CallBack onSatelliteStatusChanged()不起作用

我正在开发一个应用程序,我想了解gps卫星的数量.我正在使用"onSatelliteStatusChanged"方法,但它不起作用.我看到的下面使用的代码片段.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            gnssStatusCallBack = new GnssStatus.Callback() {
                @Override
                public void onSatelliteStatusChanged(GnssStatus status) {

                        satelliteCount = status.getSatelliteCount();
                }
            };
            locManager.registerGnssStatusCallback(gnssStatusCallBack);
 } else {
      locManager.addGpsStatusListener(this);
 }
}
Run Code Online (Sandbox Code Playgroud)

注意:我在外面测试过.

gps android satellite-navigation android-navigation android-gps

4
推荐指数
1
解决办法
6202
查看次数

Android导航组件打开url

我有在浏览器中打开 URL 的简单代码:

startActivity(Intent(
    Intent.ACTION_VIEW, Uri.parse(resources.getString(R.string.application_url))
))
Run Code Online (Sandbox Code Playgroud)

如何将其转换为导航组件项?

我是否需要为此构建自定义导航器,或者导航组件为这种情况内置了一些东西?

android android-navigation android-architecture-navigation

4
推荐指数
1
解决办法
1318
查看次数

不要使用 Android 导航组件在后台堆栈中包含片段

我正在开发一个用户可以创建事件的应用程序。我想这样做,以便在他们创建事件后,后退按钮不会将他们带到创建流程,而是在创建流程之前带到屏幕。就像是:

主屏幕 -> 创建流程 -> 事件摘要

然后如果他们按下后退按钮我希望它去

事件摘要(后退按钮)主屏幕

我已经接近:

<fragment
    android:id="@+id/createMeetFragment"
    android:name=".CreateMeetFragment"
    android:label="CreateMeetFragment" >
    <action
        android:id="@+id/action_createMeetFragment_to_meet_detail_graph"
        app:destination="@id/meet_detail_graph"
        app:popUpTo="@+id/mainFragment" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

这很有效,因为它会弹出到主屏幕。我还没有发现太多的文档,这些弹出行为的选项只是这个

我对这个解决方案的问题是,据我所知,它会一直弹出,直到我们到达 MainScreen,无论用户如何创建事件。我更喜欢在创建流程之前弹出屏幕的解决方案,允许创建流程的多个入口点。

android android-fragments android-navigation android-architecture-navigation

4
推荐指数
1
解决办法
4383
查看次数