2011-09-07 2 views
5

안드로이드 호환성 패키지를 사용했지만 다음과 같은 문제가 발생했습니다. 응용 프로그램에서 내부 정적 클래스로 Fragment를 만들고 해당 액티비티를 시작하려고 할 때마다 다음 오류를 표시합니다.안드로이드 호환성 패키지 내부 정적 클래스로서의 조각

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment org.wr.CreditCardHolderActivity.CreditCardHolderFragment: make sure class name exists, is public, and has an empty constructor that is public 

그리고 조각과 활동을 분리하면 모든 사람이 그 이유를 알 수 있습니까? 어떻게 해결할 수 있습니까?

감사합니다.

+0

조각이 컨테이너에 어떻게로드되고 있습니까? 레이아웃 XML 또는 코드를 통해? 나는 전 (前者)을 시도하지 않았지만 후자를 가진 정적 내부 조각 클래스에 아무런 문제가 없었다. BTW 나는 compat lib의 v1을 사용하고 있습니다. – PJL

+0

나는 내부 클래스의 이름과 함께 분명히 태그를 포함하고있는 조각을 가진 레이아웃을 가지고있다. – Necronet

+1

API 데모에서 FragmentLayoutSupport 예제를 살펴 보았습니까? ** PJL

답변

7

당신은 같은 내부 클래스의 조각이있는 경우 :

public class SomethingFragment extends Fragment {  
    public static final class TypeFragment extends BaseFragment 
    { 

    public static Fragment newInstance() 
    { 
     return new TypeFragment(); 
    } 

    private View mRootView; 
    private ListView mListView; 

    /** 
    * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, 
    *  android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     mRootView = inflater.inflate(R.layout.fragment_category_list, container, false); 
     mListView = (ListView) mRootView.findViewById(R.id.fragment_listview); 
     return mRootView; 
    } 
    } 
} 

는 FragmentActivity이 조각을 재개 시도는 그것을 처리 할 구상 클래스에서 호출하지 않는 경우 귀하의 한정자가 공공을 있는지 확인 추상 FragmentActivity에서, 그리고 내부 클래스 Fragment가 private 인 경우 Activity에 onSaveState, onRestoreState, initialise 등의 참조가 없습니다.

private ~ public 고정되어 있습니다!

업데이트 :

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/app/Fragment.java

(조각이 완전히 파괴되었다) 저장된 상태에서 Fragment을 복원하려고 할 때 instantiate 방법은 newInstance() 호출에서보세요.

메서드는 클래스에 공개적으로 액세스 할 수 있어야하므로 내부 클래스로 정의 할 경우 적절한 경우 publicstatic이어야합니다.

희망 사항은 향후의 몇 가지 질문을 해결합니다.

+1

답을 수락하지 못했습니다. 잊어 버렸습니다 ... – Necronet

+0

: 이해할 수 없습니다 : 왜입니까? 파편이 공개되는 것이 중요합니까? 예외가 발생합니까? 그렇다면 어떤 경우에? 조각을 사용하는 유일한 클래스가 활동 인 경우 개인 정적 클래스로 설정하지 않는 이유는 무엇입니까? viewPager에 대해서만 fragment를 사용한다면 private로 설정할 수 있습니까? –

+1

@androiddeveloper 잘'Fragment'의 활동을 유지하는'FragmentManager'입니다. 소스 코드를 확인해야하지만, 모든 조각은 공용 빈 생성자를 검사합니다. 조각 관리자가 조각을 만들 필요가있을 때 인스턴스화 할 것입니다. 따라서 조각이 'FragmentManager'와 다른 범위에있는 경우 이것은 물론 불가능합니다. (추측 컨데 https://developer.android.com/reference/java/lang/Class.html#newInstance()를 호출 할 것입니다. –

관련 문제