我有一项活动,其唯一目的是在框架布局中显示5个不同的片段。有5个按钮,每个按钮对应于可以在框架布局中显示的5个片段中的一个。
我试图这样做,以便活动不会响应按下对应于SAME片段的按钮,因此不会执行动画或其他不必要的计算。
问题是BOTH findFragmentById
和findFragmentByTag
返回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>
任何朝着正确方向的推动都会很棒!因为被困在如此轻微的事情上,我感到非常愚蠢。
答案 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);
}
}
});
}