2012-07-18 5 views
12

활동에 작업 표시 줄을 사용하고 있습니다. 각 탭마다 다른 레이아웃을 보여주고 있습니다. 레이아웃이 너무 무거 우므로. 그래서 나는 각 레이아웃을보기로 팽창시키고있다. 그래서 각 탭에 그래서 지금은 탭을 두 번 선택하면android get activity returns null

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (mView == null) { 
     mView = LayoutInflater.from(mAct).inflate(mLayout, null); // mAct is Activity reference 
    } 
    mAct.setContentView(mView); 
    for (int i = 0; i < mFrags.length; i++) { 
    mFrags[i] = (LutronFragment) mAct.getFragmentManager() 
     .findFragmentById(mIds[i]); 

    if (mFrags[i] != null) { 
     mFrags[i].setupHeader(); 
     } 
    } 
} 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    for (Fragment f : mFrags) { 
    try { 
     if (f != null) { 
     ft.remove(f); 
     } 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

을 선택하고 해당 탭에 대한 몇 가지 작업을 수행 응용 프로그램은 getActivity에 추락 얻을. (NullPointerException이) 몇 가지 다른 방법이있는 경우

제안하십시오 캐시 무거운 레이아웃.

+0

당신은 'mAct'가 null이된다는 말을 듣고 있습니까? 또한 레이아웃을 캐싱 할 필요가 없습니다. 백그라운드에서 레이아웃로드가 발생하는 동안 포어 그라운드에는 진행 대화 상자 나 중간 사용자 상호 작용 가능 화면과 같은 사용자 인터페이스가 있어야합니다. 마지막으로, 레이아웃의 가중치를 줄이거 나 요청에 따라 요소를로드하는 것을 고려하십시오. 실제로 레이아웃이 무거운 지 확인하기 위해 레이아웃 xml을 게시 할 수 있습니까? – gaara87

답변

36

문제는 활동에서 분리 된 이전 조각을 사용하고있는 것일 가능성이 큽니다.

따라서 처음으로 단편을 생성하면 해당 단편이 활동에 첨부됩니다. 모두 좋은. 그런 다음 탭을 변경하면 조각이 활동에서 분리되거나 분리되지 않을 수 있습니다. 다시 탭하면 이전 조각이 액티비티에서 분리되어 getActivity()이 null을 반환합니다.

FragmentManager을 통해 액세스하지 않고 단편에 대한 참조를 유지하려는 경우 이러한 일이 발생할 수 있습니다.

어댑터가 새 조각이 아닌 조각에 대한 참조를 반환하는 경우에도 발생할 수 있습니다. 나는이 함정에 빠졌습니다.

편집

은 아마 this을보고 그들이 어떻게 자신의 액션 바 리스너를 추가 생성이 (당신이 당신의 조각 도움이 될 생성 코드를 게시). 활동 범위가 필요합니다. 그들이하는 일은 (인터페이스 구현을 통해) Activity/Fragment에 리스너를 정의한 다음 Tab에 연결하는 것입니다. 이것은 당신에게 범위를 줄 것이고 아마 일을하는 더 안정된 방법 일 것입니다.

+0

질문을 편집하여 하단에 추가하십시오. 이것을 읽으려고 힘든 일입니다. –

+0

어디에서이 코드를 호출합니까? 그것은 당신의 활동에서 호출 될 것 같습니다. 그렇다면 귀하의 활동에 귀하의 활동에 대한 참고서를 보관하는 이유는 무엇입니까? 왜 그냥'mAct.setContentView (mView)'가 아닌'setContentView (mView)'를 호출하지 않는가? –

+0

Plz 편집 된 질문보기 –

5

getActiviy()을 호출하는 조각 안에 익명 개체를 만드는 경우 이러한 문제가 발생할 수 있습니다. 조각이 조각 스택에서 팝핑 된 후 익명 개체에서 getActivity()이 호출되면 getActivity()은 null을 반환합니다. 이 시점에서 프래그먼트는 더 이상 활동과 연관되지 않습니다.