다음 방법을 사용하여 조각을 표시 / 숨겨서 (내 NavigationDrawer에서) 조각간에 전환합니다.
protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if ( lastTag != null && !lastTag.equals("")) {
Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
if ( lastFragment != null ) {
transaction.hide( lastFragment );
}
}
if ( fragment.isAdded() ) {
transaction.show( fragment );
}
else {
transaction.add( container, fragment, tag );
}
if ( addToBackStack ) {
transaction.addToBackStack( tag );
}
transaction.commit();
// set the active tag
activeFragTag = tag;
}
내가 명확하지 않은 것은 Fragments 수명주기의 어떤 메소드를 표시하거나 숨길 때 호출되는지입니다. (onShow () 또는 onHide ()와 같은 메소드가 없기 때문에 무엇을 사용 해야할지 모르겠습니다.) 특정 조각을 표시하고 숨길 때 특정 작업을 수행하고 싶습니다.
답변
액티비티 수명주기와 마찬가지로 Android는 조각이 표시되면 onStart ()를 호출합니다 . onStop()
일반적으로 조각이 보이지 않을 때 호출되지만 나중에 호출 될 수도 있습니다.
레이아웃에 따라 Android는 onStart()
Fragment가 아직 표시되지 않지만 표시되는 상위 컨테이너에 속할 때도 호출 할 수 있습니다 . 예를 들어, 메서드 android.support.v4.view.ViewPager
를 재정의해야하는 경우에 유효합니다 Fragment.setUserVisibleHint()
. 어쨌든 BroadcastReceivers 또는 다른 리스너를 등록 / 등록 해제해야하는 경우 onStart()
및 onStop()
메서드는 항상 호출되므로 안전하게 사용할 수 있습니다 .
참고 : 일부 조각 컨테이너는 보이지 않는 조각을 시작 상태로 유지할 수 있습니다. 이 상황을 처리하기 위해 Fragment.onHiddenChanged(boolean hidden)
. 문서 에 따르면 사용자가 볼 수 있도록 조각이 시작되고 표시 되어야합니다 (숨겨지지 않음) .
업데이트 : 사용 android.support.v4.widget.DrawerLayout
하면 서랍 아래의 조각이 시작된 상태로 유지되고 서랍이 열려 있어도 표시됩니다. 이 경우 및 콜백 을 사용 DrawerLayout.setDrawerListener()
하고 수신 해야합니다 .onDrawerClosed()
onDrawerOpened()
답변
이 방법을 @Override하고 내 문제를 해결합니다.
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
//do when hidden
} else {
//do when show
}
}
답변
물론 다음 메서드를 @Override하여 수행 할 수 있습니다.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Do your Work
} else {
// Do your Work
}
}
답변
뷰 페이저 동작의 조각은 일반 조각 컨테이너와 다릅니다.
이 코드를 시도하십시오.
boolean mIsVisibleToUser;
/**
* is visible to user
*/
public void show() {
//do when show
}
/**
* is invisible to user
*/
public void hide() {
//do when gone
}
@Override
public void onResume() {
super.onResume();
if (!mIsVisibleToUser && getUserVisibleHint()) {
mIsVisibleToUser = true;
show();
}
}
@Override
public void onPause() {
super.onPause();
if (mIsVisibleToUser && getUserVisibleHint()) {
mIsVisibleToUser = false;
hide();
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isResumed()) {
if (mIsVisibleToUser != isVisibleToUser) {
mIsVisibleToUser = isVisibleToUser;
if (isVisibleToUser) show();
else hide();
}
}
}
public boolean isVisibleToUser() {
return mIsVisibleToUser;
}
답변
이 코드를 시도하십시오.
@Override
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (visible && isResumed())
{
onResume();
}
}
@Override
public void onResume()
{
super.onResume();
if (!getUserVisibleHint())
{
return;
}
//Add your code this section
}
답변
‘onCreateView'(또는 ‘onActivityCreated’) 및 ‘onHiddenChanged’를 사용할 수 있습니다. 첫 번째 쇼에는 ‘onCreateView’를 사용하고 나중에는 ‘onHiddenChanged’를 사용하십시오. ‘setMenuVisibility’는 트랜잭션 제어에서 호출되지 않습니다.
@Override
public View OnCreateView() {
// fragment will show first
}
@Override
public void onHiddenChanged(boolean hidden) {
if (!hidden) {
// fragment will show
}
else {
// fragment will hide
}
}
답변
setUserVisibleHint () 에서 이것을 시도하십시오.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser && getView() != null){
isActive = true;
init();
}else if(isVisibleToUser && getView() == null){
isActive = false;
}else{
isActive = true;
}
}
그리고 onCreateView () 에서 다음 코드를 만듭니다 .
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(!isActive){
init();
}
}