android-fragments 相关问题

片段表示Android应用中的可重用行为或用户界面的一部分。

Android 仅在应用程序中更改语言:某些字符串未正确翻译

(我在帖子底部添加了更新) 我目前正在开发一个支持多种语言的项目。我已经编写了所有语言的所有字符串。 我使用 BaseActivity、Applica...

回答 4 投票 0

如何在 Fragment 之间切换而不破坏它们?

我正在玩原生Android应用程序导航,使用BottomNavigationBar在Fragment之间切换: 公共类 MainActivity 扩展 AppCompatActivity { @覆盖 受保护无效 onCreate(

回答 3 投票 0

活动工具栏中的SearchView并过滤到片段

我已经在活动中使用自定义工具栏给出了SearchView,并且过滤器数据进入片段。当我单击搜索图标时,工具栏尺寸增大。该活动中使用了导航栏,可能是

回答 2 投票 0

如何像后退按钮一样使用Button来关闭当前fragment?

我尝试使用 Imagebutton 关闭当前片段。 我在 Fragment-A 中,当我单击按钮时,它会转到 Fragment-B。 当我点击 Fragment-B 处的按钮时,它会...

回答 14 投票 0

Fragment弹出在PopBackStack之后调用OnViewCreated

我有 1 个活动和 3 个片段。 (A、B 和 C)。所以, Activity -> FragmentContainerView 与片段 A 我有 1 个活动和 3 个片段。 (A、B 和 C)。所以, Activity -> FragmentContainerView 与片段 A <androidx.fragment.app.FragmentContainerView android:id="@+id/host_fragment" android:name="cl.gersard.shoppingtracking.ui.product.list.ListProductsFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:tag="ListProductsFragment" /> 片段 A 有一个按钮可以转到片段 B 片段 A -> 片段 B(使用 addToBackStack) 然后,我从片段B转到片段C 片段 B -> 片段 C(不带 addToBackStack) 我需要当我在片段C中保存项目时,返回到片段A,所以我不使用addToBackStack。 问题是我在片段 C 中使用时 requireActivity().supportFragmentManager.popBackStack() 或 requireActivity().onBackPressed() 片段 A 出现,但片段 C 中的 OnViewCreated 方法被调用,因此执行我在片段 C 中的验证。 我需要从片段 C 返回片段 A,而不调用片段 C 的 OnViewCreated 兴趣代码 主要活动 fun changeFragment(fragment: Fragment, addToBackStack: Boolean) { val transaction = supportFragmentManager.beginTransaction() .replace(R.id.host_fragment, fragment,fragment::class.java.simpleName) if (addToBackStack) transaction.addToBackStack(null) transaction.commit() } 片段 A(列出产品片段) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupRecyclerView() observeLoading() observeProducts() viewModel.fetchProducts() viewBinding.btnEmptyProducts.setOnClickListener { viewModel.fetchProducts() } viewBinding.fabAddPurchase.setOnClickListener { addPurchase() } } private fun addPurchase() { (requireActivity() as MainActivity).changeFragment(ScanFragment.newInstance(),true) } 片段B(扫描片段) override fun barcodeDetected(barcode: String) { if (processingBarcode.compareAndSet(false, true)) { (requireActivity() as MainActivity).changeFragment(PurchaseFragment.newInstance(barcode), false) } } 片段C(购买片段) private fun observePurchaseState() { viewModel.purchasesSaveState.observe(viewLifecycleOwner, { purchaseState -> when (purchaseState) { is PurchaseSaveState.Error -> TODO() is PurchaseSaveState.Loading -> manageProgress(purchaseState.isLoading) PurchaseSaveState.Success -> { Toast.makeText(requireActivity(), getString(R.string.purchase_saved_successfully), Toast.LENGTH_SHORT).show() requireActivity().supportFragmentManager.popBackStack() } } }) } 完整代码在这里https://github.com/gersard/PurchaseTracking 好的,我想我明白你的问题了。您有条件地将内容添加到后台堆栈,这使片段管理器处于奇怪的状态。 问题 您从 Main 开始,将扫描仪添加到后堆栈,但不添加产品。因此,当您按回键时,您会将 Scanner 从堆栈中弹出,但 Product 仍保留在 FragmentManager 中。这就是为什么每次扫描并返回时都会获取一个新实例的原因。我不清楚为什么会发生这种情况 - 看起来可能是 Android 错误?您正在替换片段,因此奇怪的是正在建立额外的实例。 一个解决方案 将您的 changeFragment 实现更改为有条件地 弹出堆栈,而不是有条件地向其中添加内容。 fun changeFragment(fragment: Fragment, popStack: Boolean) { if (keepStack) supportFragmentManager.popBackStack() val transaction = supportFragmentManager.beginTransaction() .replace(R.id.host_fragment, fragment,fragment::class.java.simpleName) transaction.addToBackStack(null) // Always add the new fragment so "back" works transaction.commit() } 然后反转当前调用 changeFragment 的逻辑:private fun addPurchase() { // Pass false to not pop the main activity (requireActivity() as MainActivity) .changeFragment(ScanFragment.newInstance(), false) } 还有... override fun barcodeDetected(barcode: String) { if (processingBarcode.compareAndSet(false, true)) { // Pass true to pop the barcode that's currently there (requireActivity() as MainActivity) .changeFragment(PurchaseFragment.newInstance(barcode), true) } } 我遇到了同样的问题,这很奇怪,有效地弹出一个片段会重新创建它以保存其状态。 不仅如此,即使在片段中使用生命周期感知函数和 isVisible 方法,即使代码明显不可见,仍然会执行代码。我有依赖于基本片段的片段,该片段在背面将片段从导航中弹出。 我的主要问题是在第一个片段上,即使它应该关闭(并且确实)应用程序,但片段的 onviewcreated 一旦被销毁就会再次被调用,导致一些不应该执行的逻辑(某些 API 调用就我而言,协程以奇怪的状态结束)我所做的是避免在该片段上调用 popBackStack ,而是直接调用 finish 活动,这似乎已经解决了

回答 2 投票 0

android 绑定:onClick 在片段内未被识别

在我的片段布局中,我绑定了片段类: 在我的片段布局中,我绑定了片段类: <androidx.constraintlayout.widget.ConstraintLayout 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/state" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FragmentSwitch"> 在片段中的某个时刻,我有一个带有 android:onClick="toggleSwitch" 的图像,现在我看到一条警告,通知我 FragmentSwitch 中缺少该方法,但事实并非如此。在我的 Fragment 类中,我用正确的签名定义了它 public void toggleSwitch(View view) { 如果我尝试点击 ImageView,应用程序就会崩溃。 Android Studio 似乎正在寻找具有相同签名的 void,仅在“活动”内部而不是在“片段”内部。但是如果在我的里面: @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 我添加以下内容: ImageView ivSwitch = view.findViewById(R.id.ivSwitch); ivSwitch.setOnClickListener(this::toggleSwitch); 在这种情况下,应用程序没有崩溃,并且该方法确实被正确调用。片段已正确加载到 ActivityMain 类中,但由于某种原因,我无法像处理活动那样在片段 XML 中定义方法。 这是因为 android:onClick 仅适用于 Activity 方法,不适用于 Fragment 方法 - 正如您已经发现的那样。这是因为onClick正在寻找当前Context中的方法,而Context是承载Fragment的Activity,而不是Fragment本身。片段不会创建上下文 - 它们附加到创建上下文的活动。 https://developer.android.com/reference/android/view/View#attr_android:onClick 单击视图时要调用的视图上下文中的方法名称。该名称必须对应于一种仅采用一个 View 类型参数的公共方法。例如,如果您指定 android:onClick="sayHello",则必须声明上下文(通常是您的 Activity)的 public void sayHello(View v) 方法。 要处理 Fragment 中的单击事件,您应该在 Java 或 Kotlin 代码中以编程方式设置单击侦听器,就像在 onViewCreated 方法中所做的那样。

回答 1 投票 0

AndroidX 中的自定义列表首选项

我已经自定义了我的Android应用程序设置页面,我使用API 21或26。我添加了一个继承自ListPreference的CustomListPreference java类并将其集成到

回答 2 投票 0

在activity中使用setFragmentResultListener

我的容器活动在某些情况下处理导航,如下所示: 有趣的导航(方向:NavDirections,额外内容:Navigator.Extras?= null){ extras?.let { navController.navigate(直接...

回答 1 投票 0

找不到实现监听器的Fragment

我一直在尝试从片段B调用片段A的回调,但是当我调用片段B的onAttach时,我似乎可以找到合适的片段A。 更具体地说,片段 A 文件: 班级

回答 1 投票 0

防止布局溢出超过屏幕尺寸

我在一个具有 3 列和 2 行的片段中有一个 GridLayout。第一个单元格中的文本长度有所不同。我将第一个单元格内的 TextView 设置为 maxLines=1 和 ellipsize=end。 我的问题是...

回答 3 投票 0

Android 测试无法使用 Dagger 提供的 ViewModel 执行 Fragment 检测测试,在 ViewModelProvider 参数所有者上遇到 NullPointerException

我有一个片段,其 ViewModel 实例由组件提供,范围仅限于主活动的导航图。 Dagger 应用程序组件被注入到单个 Main Activity 中,然后...

回答 1 投票 0

删除带有片段的底部导航视图

我有 2 个活动,其中有一个单独的 NavHostFragment,其中托管 3 个片段,然后这 3 个片段显示在我的活动的布局 ContainerView 中。 注意:我的 2 个活动具有相同的名称并且...

回答 4 投票 0

主题切换后,即使调用 onDestroyView(),片段 UI 仍可通过其他片段可见

这是一个奇怪的事情。我有一个标准应用程序,使用选项卡导航,其中包含一个 MainActivity 和四个 Fragment,每当用户单击底部选项卡时,这些片段就会交换。 这是碎片的方式...

回答 1 投票 0

最小化时关闭应用程序

我也有类似的问题。 启动时,我的应用程序会显示一个启动屏幕,并通过网络检查当前用户是否仍然是高级用户。 我的问题:我在睡觉前启动了我的应用程序,

回答 1 投票 0

错误java.lang.RuntimeException:无法销毁活动IllegalStateException:无法在onSaveInstanceState之后执行此操作

我是android开发新手。我正在开发一个小项目,遇到了一个错误,我已经尝试解决它近一天了。 所以我有两个活动: 登录页面活动前...

回答 1 投票 0

Android:使用ViewPager + Fragment方式,如何解决离屏Fragment参与RenderThread绘制?

Android使用ViewPager + Fragment的方式,如果Fragment1已经打开,然后切到Fragment2,那么Fragment1是离屏缓存的,在屏幕上不可见,但是RenderThread会...

回答 1 投票 0

从活动更改片段文本视图

我想从活动(而不是片段类)更改片段文本视图。我该怎么做?我正在使用这段代码: 公共无效开始聊天(){ FrameLayout布局 = (FrameLayout)findViewById(R.id.cont...

回答 2 投票 0

片段中的菜单未显示

我对上一个问题得到了非常有用的提示,我希望这次不会有所不同:)首先,让我解释一下情况。我有一个包含 2 个片段的活动。对于每个片段,我都有一个 xml m...

回答 17 投票 0

使用 android kotlin 关闭 Fragment 时遇到异常

我有一个主要活动,因为我有一个片段布局。根据条件,我想显示相应的片段。 因此,从主要活动中,我正在调用我正在做的课程

回答 1 投票 0

Google Pay AutoResolveHelper.resolveTask() 未在 Fragment 中调用 onActivityResult

我已经在应用程序中实现了 Google Pay 并发出 paymentData 请求,我正在使用 AutoResolveHelper 显示底部工作表,然后通过 onActivityResult 获取结果。我向 Fra 提出这个请求...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.