【问题标题】:FindFragmentById returns null even with container id即使使用容器 ID,FindFragmentById 也会返回 null
【发布时间】:2018-06-18 03:08:42
【问题描述】:

我有一个活动,其唯一目的是在框架布局中显示 5 个不同的片段。共有 5 个按钮,每个按钮对应于可以在框架布局中显示的 5 个片段之一。

我正在尝试使活动不会响应按下与 SAME 片段对应的按钮的按钮,从而不会执行动画或其他不必要的计算。

问题在于 findFragmentByIdfindFragmentByTag 都返回 null,即使 我相信我传递了 container view 的正确参数,即框架布局。

这是我在响应按钮按下时动态切换片段的方式:

    private void viewProfile(){
    profile_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Fragment profile = new ProfileFragment();
            beginFragment(profile, "profile");
        }
    });
}
    private void beginFragment(Fragment fragment, String tag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.setCustomAnimations(android.R.animator.fade_in,
            android.R.animator.fade_out);
    fragmentTransaction.replace(R.id.fragment_display, fragment, tag);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

这是我尝试确定容器中显示的片段的方法:

    private void launchEvents(){
    final Fragment current_frag = getSupportFragmentManager()
            .findFragmentById(R.id.fragment_display);
    events_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!current_frag.getTag().equals("events")) {
                Fragment events = new EventsFragment();
                beginFragment(events, "events");
                events.setArguments(location_info);
            }
        }
    });
}

这是我的 XML 文件,以防我在布局层次结构中遇到问题:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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/home_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#323272"
tools:context=".HomeScreen">


<FrameLayout
    android:id="@+id/fragment_display"
    android:layout_width="match_parent"
    android:layout_height="527dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    tools:background="#323272:color/background_dark">

</FrameLayout>

任何朝着正确方向轻推都会很棒!我为被困在如此微不足道的事情上而感到很愚蠢。

【问题讨论】:

  • 您的代码不完整。目前尚不清楚您是否在尝试通过fragmentTransaction.replace(R.id.fragment_display, fragment, tag); 替换片段之前创建并附加了片段此外,您的 xml 不包含片段定义(请参阅此处的 xml:developer.android.com/training/basics/fragments/creating)。请注意,在您的代码中,您试图通过 id 检索片段,但 id 属于 FrameLayout 元素?考虑先查看一些示例以了解核心概念。

标签: android xml android-fragments fragmenttransaction fragmentmanager


【解决方案1】:

findFragmentById 移至onClick 方法中,如下所示,检查标签的即时检查instanceof if 片段

  private void launchEvents(){

        events_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             Fragment current_frag = getSupportFragmentManager()
                .findFragmentById(R.id.fragment_display);
                if (!(current_frag  instanceof EventsFragment)) {
                    Fragment events = new EventsFragment();
                    beginFragment(events, "events");
                    events.setArguments(location_info);
                }
            }
        });
    }

【讨论】:

  • 上帝保佑你。关于“最终”类型的事情是否会搞砸?
  • 不,当您单击按钮时,您将获得片段的旧值,因为您的代码用于在片段外部查找片段,并且在单击按钮时不会执行,因此它始终返回旧值跨度>
  • 啊!!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2017-03-20
  • 2020-11-29
  • 2018-05-29
  • 2014-06-14
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多