当前位置: 首页 > 知识库问答 >
问题:

从不同线程的活动更新片段

燕光熙
2023-03-14

我对Android很陌生,我试图弄清楚片段和活动应该如何协同工作。我有一个非常丑陋的布局。1个活性和1个“根”片段。当用户单击左侧菜单时,片段被片段管理器替换。

expandableList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
    @Override
    public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {

        LeftMenuItem group = groups.get(i);
        String fragmentTag = group.getFragmentTag();
        if (fragmentTag.equals(Fragment1.TAG)) {
            Fragment1 fragment = (Fragment1) currentFragmentManager.findFragmentByTag(Fragment1.TAG);
            if (fragment == null) {
                fragment = new Fragment1();
            }
            FragmentTransaction ft = currentFragmentManager.beginTransaction();
            ft.replace(R.id.root_frame, fragment, Fragment1.TAG);
            ft.commitAllowingStateLoss();

        } else if (fragmentTag.equals(Fragment2.TAG)) { 

我假设上面的代码应该用新的片段替换当前片段。片段实际上总是空的。我不知道为什么。

在onCreateView的RootFrament Fragment1是默认创建的。

    if (savedInstanceState == null) {
        Log.d(TAG, "savedInstanceState is null, creating Framgent1");

        Fragment1 fragment = new Fragment1();
        FragmentTransaction ft = currentFragmentManager.beginTransaction();
        ft.replace(R.id.root_frame, fragment, Fragment1.TAG);
        ft.commitAllowingStateLoss();
    }

在rootFragment的onCreateView中,rootFragment用另一个Fragment1替换了自己,这在我看来非常难看。它是众所周知的Android图案还是糟糕的设计?

让我们假设我使用Volley从MyActive的onCreateView发送httpRequest。收到响应后,我需要从回调更新Fragment1 UI。我怎么做?

>

  • 我是否应该尝试在活动中使用findFragmentByTag查找片段并直接更新UI?http截击响应是否在同一线程中?如果没有,可以从不同的线程更新UI吗?

    我应该使用处理程序类将消息从活动发送到片段吗?

  • 共有1个答案

    孔彭祖
    2023-03-14
    1. 我应该尝试在我的活动中使用findFragmentByTag查找片段并直接更新UI吗?超文本传输协议的截击响应是否在同一个线程中?如果没有,可以从不同的线程更新UI吗?

    findFragmentByTag将不再有用,因为一旦调用replace,就会销毁之前的片段。如果您只需要切换几个片段,可以使用以下解决方案:

    如何在两个片段之间切换,而不每次都重新创建片段?

    对问题1第二部分的答复:

    Volley响应总是在主线程上调用,以便在回调时更新UI。您永远不应该在除MAIN/UI线程之外的任何线程上更新UI元素。

    您可以选择通过处理程序发送消息,但如果通常android留档建议通过回调在活动和附加片段之间发送通信

    https://developer.android.com/training/basics/fragments/communicating.html

     类似资料:
    • 问题内容: 我要在我的下一个Android项目中使用Retrofit 2.1.0。我想使用设计模式,因此为每个REST调用创建单独的类,即 IBalanceService.java BalanceRestClient.java BalanceActivity.java 如何通过onResponse()更新活动/片段中的UI? 附加信息: 最小SDK:19个 目标SDK:23个 使用OkHttp和g

    • 我有一个带有一些线程的简单应用程序,我需要从一些线程更新SWING GUI(我正在使用Netbean)。 这是我需要更新的主要表单: 现在我有一些线程: 在其他班级,我有: 代码的每个部分都位于不同的文件(类)中。我如何在这里实现 Swing 工作人员,以便能够在我的主 GUI 窗体上显示文本?

    • 我有以下方法将播放器添加到数据库或更新它,如果它已经存在: 这个方法有时由两个不同的线程调用,因此几乎同时执行两次。有时我会得到以下异常: org . H2 . JDBC . jdbcsqlintegrityconstraintviolationexception:唯一索引或主键冲突:" PUBLIC。PUBLIC上的PRIMARY_KEY_B42。玩家(ID)值3”; 这对我来说是有意义的,因为

    • JavaFX场景图表示JavaFX应用程序的图形用户界面,它不是线程安全的,只能从UI线程(也称为JavaFX应用程序线程)访问和修改。 https://docs.oracle.com/javase/8/javafx/get-start-tutorial/jfx-architecture.htm#A1107438 任何“实时”场景,即作为窗口一部分的场景,都必须从该线程访问。场景图可以在后台线程中

    • 问题内容: 我托管了5个片段,在每个片段上我都需要填写一些字段。 我想从中获取这些字段的值。我尝试了类似的东西: AddActivity.java FragPagerAdapter.java OtherFragment.java 公共类OtherFragment扩展Fragment {Button btn; 更新 的问题我总是得到EditText(而其他字段要获得)的问题等于null如果它们位于片

    • 我已经完成了导航,现在进入第一个片段。在第一个片段中有两个按钮,我需要通过按下这些按钮来切换到一个新的活动。我不明白如何正确地实施它。我犯了一个错误。 代码,eror