2016-05-31 116 views
0

我试图在Activity上使用多个Fragment s。我正在做的是: 1.将第一个Fragment添加到Activity。第一个Fragment在屏幕底部包含一个按钮。 2.用第二个Fragment替换它,将其添加到后台堆栈中。第一个片段上的按钮在用第二个片段替换时移出屏幕

当我点击第一个Fragment底部的按钮,它会自动向上滑动(我不知道为什么),并移动到第二Fragment

img1

当我回去第一Fragment通过按压后退按钮时,在第一Fragment按钮熄灭的视图:

img2

MainActivity

public class MainActivity extends AppCompatActivity implements UserDetailsFragment.UserDetailsFragmentListener, 
     PhotoFragment.PhotoFragmentListener, TestFragment.TestFragmentListener{ 

@Bind(R.id.container) 
FrameLayout frameLayout; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_create_profile); 
    ButterKnife.bind(this); 


    // However, if we're being restored from a previous state, 
    // then we don't need to do anything and should return or else 
    // we could end up with overlapping fragments. 
    if (savedInstanceState != null) { 
     return; 
    } 

    initView(); 
} 

private void initView() { 

    TestFragment testFragment = new TestFragment(); 

    FragmentUtil.replaceFragment(this,R.id.container, testFragment); 
} 

@Override 
public void onProfileDetailCompleted(UserModel userModel) { 
    PhotoFragment photoFragment = PhotoFragment.newInstance(userModel); 
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment); 
} 

@Override 
public void onPhotoUploaded(UserModel userModel) { 

} 

@Override 
public void onSkipPhotoClicked() { 
    PhotoFragment photoFragment = PhotoFragment.newInstance(null); 
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment); 
} 

@Override 
public void onTest() { 
    PhotoFragment photoFragment = PhotoFragment.newInstance(null); 
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment); 
} 

}

TestFragment.java

public class TestFragment extends BaseFragment { 


public TestFragment() { 
    // Required empty public constructor 
} 

public interface TestFragmentListener { 
    void onTest(); 
} 

private TestFragmentListener mListener; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_test, container, false); 
    ButterKnife.bind(this, view); 
    return view; 
} 

@OnClick(R.id.next_btn) 
public void onNextButtonClicked() { 
    //TODO validate view 


    if(mListener!=null) 
     mListener.onTest(); 
} 



@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof TestFragmentListener) { 
     mListener = (TestFragmentListener) context; 
    } else { 
     throw new RuntimeException(context.toString() 
       + " must implement TestFragmentListener"); 
    } 
} 

}

FragmentUtils.java

public class FragmentUtil { 

public static boolean hadFragment(AppCompatActivity activity) { 
    return activity.getSupportFragmentManager().getBackStackEntryCount() != 0; 
} 

public static void replaceFragment(AppCompatActivity activity, int contentId, BaseFragment fragment) { 
    FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 

    transaction.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out); 
    if (hadFragment(activity)) { 
     transaction.replace(contentId, fragment, fragment.getClass().getSimpleName()); 
    } else { 
     transaction.add(contentId, fragment, fragment.getClass().getSimpleName()); 
    } 

    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

public static void removeFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .remove(fragment) 
     .commit(); 
} 


public static void showFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .show(fragment) 
     .commit(); 
} 

public static void hideFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .hide(fragment) 
     .commit(); 
} 

public static void attachFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .attach(fragment) 
     .commit(); 
} 

public static void detachFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .detach(fragment) 
     .commit(); 
} 

}

如果我从第二Fragment移动到第三Fragment(这是与第一),在所述第二屏幕的底部的按钮将看起来很好。但第一个Fragment上的按钮仍然不起作用。该问题仅在第一个Fragment的视图中存在。请帮忙。

回答

0

我有点类似的问题。我正在使用appcompact主题,当我替换片段时,我的底部布局正在离开屏幕。然后我尝试了不同的主题,然后它完美地工作。所以,如果你也使用应用程序紧凑主题,然后尝试任何其他主题。希望它能解决你的问题。

相关问题