2016-06-07 4 views
-1

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 조각을 넣는 것) 모두 잘 작동하는 것처럼 보인다. 나는 심지어 제거/추가 및 그냥 제거와 같은 변형을 시도하고 모든 문제없이 작동합니다.

그래서 나는 무엇을 놓치고 있습니까?

+0

그것? – DeeV

+0

글쎄, 그것은 버그가 아니었다. 그러나 비록 그들이 그것을 변경했다 할지라도, 현재의 문서 (위에 링크되어있다)는 여전히 할 수 없다고 말하고있다. –

+0

그렇다면 어쨌든 지원이 아닌 일반 FragmentManager를 사용하여 시도해 보시고, 여전히 지원되는지 확인하십시오. 지원 FragmentManager는 결국 시스템의 모의목 일 뿐이므로 일을 다르게해야합니다. – DeeV

답변

1

조각 자체를 바꾸는 대신 그 조각 위에 새 조각을 추가합니다. ID가있는 작은 문제 일 뿐이지 만 조각 자체 (R.id.frag 대신 R.id.fl_frag) 대신 컨테이너 (LinearLayout)에서 FragmentManager를 사용하여 바꿉니다.

+0

정확합니다. 두 가지 이유가 분명하지 않았습니다. 먼저, 조각 관리자는 행복하게 이전 조각을 "제거"합니다. ID를 사용하여 더 이상 찾을 수 없으며 (findFragmentById는 null을 반환 함) 단편은 인터페이스에 남아 있습니다. 둘째, 이전 조각 위에 동일한 조각을 배치 했으므로 조각이 겹쳐져 있음을 알지 못했습니다. 나는 이전 조각을 다른 텍스트 메시지가있는 새 것으로 "대체"함으로써 더 잘 볼 수있었습니다. 서로 겹치는 두 개의 문자열을 볼 수 있기 때문에 훨씬 더 분명했습니다. –