Android:是不是可以将两个全屏片段链接到一个活动(只使用一个,但选择正确的一个有逻辑)?

Posted

技术标签:

【中文标题】Android:是不是可以将两个全屏片段链接到一个活动(只使用一个,但选择正确的一个有逻辑)?【英文标题】:Android: Is it possible to link two full screen fragments to one activity (useing just one, but choose the right one with logic)?Android:是否可以将两个全屏片段链接到一个活动(只使用一个,但选择正确的一个有逻辑)? 【发布时间】:2021-04-13 09:22:07 【问题描述】:

我昨天有一个想法,我想问你这是否有效以及如何。 所以我使用一个表单来获取用户输入并将其保存到数据库中。 我为此任务使用了一个活动: https://i.stack.imgur.com/zZMOi.png 现在我想添加另一个具有相同布局但逻辑不同的任务。 用户应该能够编辑数据(相同的布局,但编辑数据库中的信息而不是创建新对象)。

我的想法: 当用户想要启动创建或编辑功能时,应该打开DataActivityDataActivity 包含两个全屏片段,应该能够启动正确的片段。 是否可以将两个全屏片段链接到一个活动?

【问题讨论】:

我建议你改进你的问题,特别是尽量不要添加图片,看这里=>Why not upload images of code/errors when asking a question? 【参考方案1】:

您可以执行以下操作,

添加两个按钮,saveedit,使用 onClickListeners 打开 save_fragmentedit_fragment,并在 edit_fragment 中确保有一个 Spinner 将数据库中的条目加载到 edit_fragment

这涉及到一点编码

因此,更好的方法是使用Room 创建数据库,在您各自的Dao 中,您可以为更新方法指定replace 冲突策略,该策略用新数据覆盖/更新旧数据

@Dao
interface YourDao

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(formData : FormData)

查看官方文档以获取有关Room 和onConflict Strategies 的更多信息

【讨论】:

感谢您的回答!这个解决方案听起来不错。我正在使用Room。片段的布局是相同的。我可以只使用一个片段但像这样设置一个 if 语句吗?带有信息的意图字符串:编辑或创建对象,如果其编辑字符串选项=意图...; if(option=="edit") (这里我在 DAO 中使用 replace 方法) if(option == "create") (在 DAO 中使用 create 方法) 我想你可以,在你的实体类中使用titleprimarykey,在同一个片段中,只需一个按钮从dao 调用insert。如果对象具有相同的primarykey,则它会被更新,否则它会第一次被创建【参考方案2】:

您的问题“是否可以将两个全屏片段链接到一个活动?”的简单答案是可以,您可以根据需要附加任意数量的片段到同一个活动,只要你在宿主活动中正确处理这些片段。

有很多与该主题相关的示例和用法。我建议你看看这个指南:https://developer.android.com/guide/fragments,这样你就可以大致了解片段的使用方式。

以下是与您在问题中提到的案例相关的非常简单代码示例:

MainActivity.kt

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction


class MainActivity : AppCompatActivity() 


    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        showProperFragment()
    

    private fun showProperFragment() 

        var fragmentToShow: Fragment

        // todo: modify your condition here to decide whether showing fragment1 or fragment2
        if (true) 
            fragmentToShow = Fragment1.newInstance("something1", "something2")
         else 
            fragmentToShow = Fragment2.newInstance("something1", "something2")
        

        val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()

        transaction.replace(R.id.fragment_container, fragmentToShow)
        transaction.addToBackStack(null)

        transaction.commit()
    

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:layout_
    android:layout_
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_
        android:layout_/>

</androidx.constraintlayout.widget.ConstraintLayout>

当然 Fragment1Fragment2 是两个示例空白片段。

【讨论】:

谢谢你的回答,我会试试这个解决方案!

以上是关于Android:是不是可以将两个全屏片段链接到一个活动(只使用一个,但选择正确的一个有逻辑)?的主要内容,如果未能解决你的问题,请参考以下文章

提交带有全屏片段的片段事务

状态栏在全屏对话框片段android中将其颜色更改为黑色

如何通过单击 Android 中的按钮使 VideoView 全屏显示?

将相同的图库图像加载到两个不同的活动片段中 Android Picasso

如何在android Fragment中为webview显示全屏加载微调器?

带有透明状态栏的全屏片段(以编程方式)