FindFragmentById即使使用容器ID也返回null

时间:2018-06-18 03:08:42

标签: android xml android-fragments fragmenttransaction fragmentmanager

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

我试图这样做,以便活动不会响应按下对应于SAME片段的按钮,因此不会执行动画或其他不必要的计算。

问题是BOTH 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>

任何朝着正确方向的推动都会很棒!因为被困在如此轻微的事情上,我感到非常愚蠢。

1 个答案:

答案 0 :(得分:0)

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);
                }
            }
        });
    }