Android developer documentation for fragments이 말한다 :조각은 혼란
"참고 :. 당신이 레이아웃 XML 파일에 조각을 정의하여 활동 레이아웃에 조각을 추가 할 때, 당신은 런타임에 조각을 제거 할 수 없습니다 당신이 만약 사용자 이 (가) 상호 작용하는 동안 조각을 교환하려는 경우 다음 학습 에서처럼 활동이 처음 시작될 때 조각에 활동을 추가해야합니다.
그리고 부분적으로 있기 때문에 난 항상 (내가 런타임에 "핫 스왑"을 원하는하지 않은 경우에도) 내 사용자 인터페이스에/조각을 추가/제거 조각 관리자를 사용하는 습관을 가지고이의
. 나는 "하드 유선"XML 조각을 런타임에 제거하려고 시도했을 때 예외가 발생하여 응용 프로그램이 다운 된 것을 100 % 확신합니다.XML 조각을 몇 달 동안 사용해 보지 못했지만, 오늘은 피곤한 마음으로 놀기로 결심했습니다. XML 조각을 다른 조각으로 바꿀 수 있다는 것을 알았습니다 ... 작동합니까? 나는이 행동의 최근 변화에 대해 논하는 온라인을 찾을 수 없다. 그냥 작동합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fl_frag"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="mobappdev.demo.myapplication.MainActivity">
<fragment
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/frag"
android:name="mobappdev.demo.myapplication.BlankFragment"/>
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="@string/click_me"
android:onClick="clickMe"/>
</LinearLayout>
그리고 여기에 조각을 대체하는 코드입니다 :
내 레이아웃 코드는 여기
public void clickMe(View view) {
FragmentManager manager = getSupportFragmentManager();
BlankFragment newFrag = BlankFragment.newInstance();
Fragment oldFrag = manager.findFragmentById(R.id.frag);
Log.i("TESTING", "old frag is null: " + (oldFrag == null));
manager.beginTransaction()
.replace(R.id.fl_frag, newFrag)
.commit();
}
그것은 아무 문제없이 작동합니다. 나는 변형을 시도했다. (예를 들어, FrameLayout에 XML 조각을 넣는 것) 모두 잘 작동하는 것처럼 보인다. 나는 심지어 제거/추가 및 그냥 제거와 같은 변형을 시도하고 모든 문제없이 작동합니다.
그래서 나는 무엇을 놓치고 있습니까?
그것? – DeeV
글쎄, 그것은 버그가 아니었다. 그러나 비록 그들이 그것을 변경했다 할지라도, 현재의 문서 (위에 링크되어있다)는 여전히 할 수 없다고 말하고있다. –
그렇다면 어쨌든 지원이 아닌 일반 FragmentManager를 사용하여 시도해 보시고, 여전히 지원되는지 확인하십시오. 지원 FragmentManager는 결국 시스템의 모의목 일 뿐이므로 일을 다르게해야합니다. – DeeV