android - 뜻fragment 응용 프로그램이 종료되고 복원 된 후 숨겨진 조각이 겹쳐집니다.




3 Answers

나는 또한이 문제를 안고있다. 한 가지 가능한 해결책은 각 조각이 자신의 상태를 숨겨 놓았는지 여부를 저장 한 다음 onCreate에서 숨기는 것이다.

@Override
public void onSaveInstanceState(Bundle bundle) {
    super.onSaveInstanceState(bundle);
    if (this.isHidden()) {
        bundle.putBoolean("hidden",  true);
    }
}

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    if (bundle != null) {
        if (bundle.getBoolean("hidden",  false)) {
            getFragmentManager()
                .beginTransaction()
                .hide(this)
                .commit();
        }
    }
}
fragment 안드로이드

마지막 단편을 숨기고 새로운 단편을 추가 하여 단편 사이를 전환합니다 (아래 코드 참조). 다시 단편에도 추가 하십시오. 이렇게하면 사용자는 조각 데이터를 다시로드하지 않고도 조각 사이를 신속하게 전환 할 수 있습니다.

이 기능은 앱이 종료 될 때까지 잘 작동합니다 (시나리오 : 사용자가 여러 개의 다른 앱을 사용하고 내 앱이 지속되고 종료 됨).

사용자가 앱을 열면 복원 되고 모든 조각이 서로 겹쳐져 표시됩니다.

질문 : 복원 된 조각을 어떻게 숨겨진 상태로 복원 할 수 있습니까? 아마도 나는 깃발이없는 것일까? 어딘가에? 아마도 데이터를 다시로드하지 않고 조각 사이를 빠르게 전환하는 더 나은 솔루션이 있을까요?

조각 추가의 샘플 코드 - 어딘가를 클릭하면 여러 조각으로 여러 번 호출됩니다.

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.hide(lastFragment);
fragmentTransaction.add(newFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
lastFragment = newFragment;



나는 같은 문제가 있었고 setRetainInstance(true); 설정하여 해결했습니다 setRetainInstance(true); 각 조각의 onCreate() 메소드에서.




프래그먼트가 처음부터 다시로드되는 것에 신경 쓰지 않으므로 의도를 사용하지 않고 메인 프래그먼트 작업을 다시 시작하는 것이 어떻겠습니까?

나는 여러분이 언급 한 것과 같은 문제에 직면 해 있습니다. 여기서 조각들은 서로 중첩되어 있습니다. 나는 전체를 쳐다 보면서이 특별한 문제가 논의 된이 스레드만을 발견했다. Walt가 제공 한 솔루션을 시도했지만 예상대로 작동하지 않았습니다.

아래의 해결 방법은 적어도 나를 위해 작동하므로 누군가가이 시나리오로 끝나는 경우 공유

부모 조각의 onSaveInstanceState 에서 마커를 설정하여 묶음에 저장된 내용이 있는지 확인합니다.

public void onSaveInstanceState(Bundle outState) 
{
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);

    outState.putString(TAG, "Get ready to be terminated");
};

그리고 onCreate 안에는 저장된 인스턴스 상태가 null이 아닌 경우 Intent를 사용하여로드 할 클래스를 지정할 수 있습니다.

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

    if(savedInstanceState != null)
    {   
        Intent myIntent = new Intent(this, your.class);

        // Closing the parent fragment
        finish();

        this.startActivity(myIntent);
    }
    else
    {
        // your main code
        ...........
        ...........
    };
};

그러면 조각이 처음부터 다시 만들어집니다.

필자의 경우 사용자가 내 앱을 열었을 때 로그인 화면이 있었고 이미 "로그인되어있는"경우 프래그먼트 화면으로 리디렉션됩니다.

kill 프로세스 중에 앱이 포 그라운드로 오면 사용자를 로그인 페이지로 리디렉션합니다. 그리고 이미 존재하는 코드는 새로 작성된 프래그먼트 화면으로 사용자를 다시 안내합니다.

참고 : onCreateView 에서 자식 조각의 끝이 느슨하지 않은지 확인해야합니다.




Related