片段表示Android应用中的可重用行为或用户界面的一部分。
知道如何修复这个可怕的代码,以便单个触摸监听器可以处理所有点击吗? // 设备 val devices = DeviceDAO(context).getDevicesByType(2) 适配器 =
从 Android Studio 中的片段将数据写入 Firebase
所以,我有一个片段类,我尝试使用 onCreateView() 方法中的以下代码将数据写入 Firebase Realtime 数据库, databaseReference = FirebaseDatabase.getInstance().getReference(&
如何使用 Hilt 为 viewpager 中的片段创建不同的视图模型实例(范围为父片段)
我有一个片段 HomeFragment,它是应用程序导航图的一部分。在 FragmentHome 中,我有一个 viewpager,其中包含 3 个同一类 ChildFragment 的片段实例。每个 ChildFragment 都需要一个
我的程序由一个MainActivity和两个fragment Activity组成。 我需要一个片段从用户那里获取一个字符串值并将其传递给第二个片段。 我正在努力把头转过来......
为什么我的 Android 应用程序中的 Fragments 屏幕在切换几次选项卡后会变成空白?
我的应用程序背后的想法很简单。只有两个选项卡:音乐闹钟和历史日历。 当用户使用底部导航栏在选项卡之间来回切换时,可能会经过两个或
FragmentContainerview 动画排序与 popUpTo 和 popUpToInclusive
这是主活动中的设置: 这是主活动中的设置: <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/main_nav_graph" /> 我有三个片段(A、B和C)。我从 A 导航到 B,从 B 导航到 C,并使用“从右侧滑入”动画,如下所示: <action android:id="@+id/a_to_b" app:destination="@id/b" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/nothing" app:popEnterAnim="@anim/nothing" app:popExitAnim="@anim/slide_out_right" /> 在 Fragment C 上有一个“X”按钮,可以取消流程并直接返回到 Fragment A,并在弹出后堆栈时使用向下滑动的动画: <action android:id="@+id/cancel" app:destination="@id/a" app:enterAnim="@anim/nothing" app:exitAnim="@anim/slide_out_bottom" app:popEnterAnim="@anim/nothing" app:popExitAnim="@anim/nothing" app:popUpTo="@id/a" app:popUpToInclusive="true" /> 除了取消操作之外的所有操作都工作正常。问题在于取消操作的顺序似乎是错误的。片段 A 绘制在片段 C 之上,因此您看不到滑出动画。我认为当发生弹出时,退出的片段应该绘制在输入的片段上。 有什么方法可以改变特定操作的这种行为吗? 这是我正在使用的动画: 没什么: <?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromYDelta="0%p" android:toYDelta="0%p" /> 向右滑入: <?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromXDelta="100%p" android:toXDelta="0" /> 滑出底部: <?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromYDelta="0%p" android:toYDelta="100%p" android:duration="300"/> 问题在于在操作中使用目的地,这似乎添加了一个新条目而不是仅仅返回。当删除目的地并将“popUpToInclusive”设置为“false”时,它会按预期工作: <action android:id="@+id/cancel" app:enterAnim="@anim/nothing" app:exitAnim="@anim/slide_out_bottom" app:popEnterAnim="@anim/nothing" app:popExitAnim="@anim/nothing" app:popUpTo="@id/a" app:popUpToInclusive="false" />
我试图替换放置在FrameLayouts中的片段中的TextView。因此,TextView 在设计中可见,但在虚拟设备上的应用程序中却看不到。 我试图替换片段中的TextView,这些片段放置在FrameLayouts中。因此,TextView 在设计中可见,但在虚拟设备上的应用程序中看不到。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="385dp" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".RegistrationContainerFragment" android:orientation="vertical" android:background="@drawable/auth_container_background" android:elevation="8dp" android:translationZ="4dp" android:layout_marginHorizontal="15dp"> <FrameLayout android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/username_and_email_input_container" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@+id/password_input_container" android:layout_width="match_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/primary_button_container" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:fontFamily="@font/montserrat_semibold_font" android:textSize="14sp" android:textColor="@color/text" android:text="Forgot password?"/> <FrameLayout android:id="@+id/line" android:layout_width="match_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/textAndLinkText" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"/> </LinearLayout> import android.os.Bundle import android.text.InputType import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction class LoginContainerFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_registration_container, container, false) val fragmentManager: FragmentManager = childFragmentManager val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction() val title = TitleFragment() title.setShowBackArrow(true) title.setTitleText("Log In") fragmentTransaction.add(R.id.title, title) val textInputFragment = InputFragment() textInputFragment.setInputType(InputType.TYPE_CLASS_TEXT) textInputFragment.setInputHint("Enter your email or username") fragmentTransaction.add(R.id.text_input_container, textInputFragment) val passwordInputFragment = InputFragment() passwordInputFragment.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD) passwordInputFragment.setInputHint("Enter your password") fragmentTransaction.add(R.id.password_input_container, passwordInputFragment) val primaryButtonFragment = PrimaryButtonFragment() primaryButtonFragment.setButtonText("next") fragmentTransaction.add(R.id.primary_button_container, primaryButtonFragment) val lineFragment = LineFragment() fragmentTransaction.add(R.id.line, lineFragment) val textAndLinkFragment = TextWithLinkFragment() textAndLinkFragment.setTextAndLinkText( getString(R.string.dont_have_an_account), getString(R.string.sign_in) ) fragmentTransaction.add(R.id.textAndLinkText, textAndLinkFragment) fragmentTransaction.commit() return view } } 我试图将 TextView 放在 FrameLayout 内,但没有帮助。 之后我试图为此制作一个片段TextView,但不知何故我的应用程序没有启动而是崩溃了。 我也尝试使用一些标签,如\<androidx.swiperefreshlayout.widget.SwipeRefreshLayout\>,但没有帮助。 使用了text_input_container,但它不存在于您的布局中 fragmentTransaction.add(R.id.text_input_container, textInputFragment)
Android 仅在应用程序中更改语言:某些字符串未正确翻译
(我在帖子底部添加了更新) 我目前正在开发一个支持多种语言的项目。我已经编写了所有语言的所有字符串。 我使用 BaseActivity、Applica...
我正在玩原生Android应用程序导航,使用BottomNavigationBar在Fragment之间切换: 公共类 MainActivity 扩展 AppCompatActivity { @覆盖 受保护无效 onCreate(
我已经在活动中使用自定义工具栏给出了SearchView,并且过滤器数据进入片段。当我单击搜索图标时,工具栏尺寸增大。该活动中使用了导航栏,可能是
如何像后退按钮一样使用Button来关闭当前fragment?
我尝试使用 Imagebutton 关闭当前片段。 我在 Fragment-A 中,当我单击按钮时,它会转到 Fragment-B。 当我点击 Fragment-B 处的按钮时,它会...
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 活动,这似乎已经解决了
在我的片段布局中,我绑定了片段类: 在我的片段布局中,我绑定了片段类: <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 方法中所做的那样。
我已经自定义了我的Android应用程序设置页面,我使用API 21或26。我添加了一个继承自ListPreference的CustomListPreference java类并将其集成到
在activity中使用setFragmentResultListener
我的容器活动在某些情况下处理导航,如下所示: 有趣的导航(方向:NavDirections,额外内容:Navigator.Extras?= null){ extras?.let { navController.navigate(直接...
我一直在尝试从片段B调用片段A的回调,但是当我调用片段B的onAttach时,我似乎可以找到合适的片段A。 更具体地说,片段 A 文件: 班级
我在一个具有 3 列和 2 行的片段中有一个 GridLayout。第一个单元格中的文本长度有所不同。我将第一个单元格内的 TextView 设置为 maxLines=1 和 ellipsize=end。 我的问题是...
我有一个片段,其 ViewModel 实例由组件提供,范围仅限于主活动的导航图。 Dagger 应用程序组件被注入到单个 Main Activity 中,然后...
我有 2 个活动,其中有一个单独的 NavHostFragment,其中托管 3 个片段,然后这 3 个片段显示在我的活动的布局 ContainerView 中。 注意:我的 2 个活动具有相同的名称并且...
主题切换后,即使调用 onDestroyView(),片段 UI 仍可通过其他片段可见
这是一个奇怪的事情。我有一个标准应用程序,使用选项卡导航,其中包含一个 MainActivity 和四个 Fragment,每当用户单击底部选项卡时,这些片段就会交换。 这是碎片的方式...