我正在使用导航组件,并且当用户点击通知时,我尝试触发到由片段表示的特定目的地的显式深度链接。
根据文档,可以像这样创建待定意图:
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
突然,我的应用程序中的导航突然无法正常工作(昨天确实有效)。
这是一个示例:当我从 导航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
我在 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
我使用导航组件和底部导航栏,并为了处理选项卡栏导航,请调用以下代码
绑定.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
我想从撰写导航到片段。我在 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
我正在创建一个应用程序,它需要所有活动的相同导航抽屉.为此,我创建了一个扩展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) 我正在开发一些应用程序,我有一个问题.
我有:1.在FrameLayout中使用ListFragment的活动A(导航抽屉模式):xml:
<FrameLayout
...>
</FrameLayout>
<LinearLayout
...>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
如何通过保存ListFragment的UI从活动B返回(使用导航按钮)到活动A(如果我使用Home Back返回,则重新创建活动).顺便说一句,如果我按下手机上的后退按钮,活动就不会重新创建并返回之前的状态.
android android-fragments android-activity android-navigation android-savedstate
我正在开发一个应用程序,我想了解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
我有在浏览器中打开 URL 的简单代码:
startActivity(Intent(
Intent.ACTION_VIEW, Uri.parse(resources.getString(R.string.application_url))
))
Run Code Online (Sandbox Code Playgroud)
如何将其转换为导航组件项?
我是否需要为此构建自定义导航器,或者导航组件为这种情况内置了一些东西?
我正在开发一个用户可以创建事件的应用程序。我想这样做,以便在他们创建事件后,后退按钮不会将他们带到创建流程,而是在创建流程之前带到屏幕。就像是:
主屏幕 -> 创建流程 -> 事件摘要
然后如果他们按下后退按钮我希望它去
事件摘要(后退按钮)主屏幕
我已经接近:
<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