program story

활동에서 조각이 생성되었을 때 null을 반환하는 getView

inputbox 2020. 12. 10. 19:56
반응형

활동에서 조각이 생성되었을 때 null을 반환하는 getView


현재 휴대폰에서도 작업을 시도중인 태블릿 응용 프로그램이 있습니다. 테이블에는 목록 조각과 세부 정보 조각이라는 두 개의 조각이 화면에 있습니다. 전화기에서 목록 조각이 나타나고 목록 항목을 누르면 새 활동이 생성됩니다. 이 활동은 단순히 onCreate()메서드 에서 조각을 만들고 다음과 같이 화면에 커밋합니다.

// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();

이것은 예상대로 작동하지만이 활동 내에서로드 및 표시 할 세부 정보를 조각에 알려야합니다. 내 DealDetailsFragment 클래스에는 updateDeal()다음과 같이 콘텐츠를 업데이트 하는 메서드가 있습니다.

if (deal==null) { // could be null if user presses the loading deals list item before it loads
    return;
}
this.deal=deal;
if (dealTitle==null) { // get the view objects only once
    holder = new ViewHolder();  
    holder.dealHeat=(TextView) getView().findViewById(R.id.dealDetails_heat_textView);
    holder.dealPrice=(TextView) getView().findViewById(R.id.dealDetails_price_textView);
    holder.dealRetailer=(TextView) getView().findViewById(R.id.dealDetails_retailer_textView);
    holder.dealTitle=(TextView) getView().findViewById(R.id.dealDetails_title_textView);
    holder.dealDesc=(TextView) getView().findViewById(R.id.dealDetails_desc_textView);
    holder.goToButton= (LinearLayout) getView().findViewById(R.id.dealDetails_goToDeal);
    holder.dealImage=(ImageView) getView().findViewById(R.id.dealDetails_imageView);
    holder.postedBy=(TextView) getView().findViewById(R.id.dealDetails_poster_textView);
    holder.datePosted=(TextView) getView().findViewById(R.id.dealDetails_date_textView);

getView() 응용 프로그램이 단일 조각 만 표시된 전화에서 실행될 때 null을 반환합니다.

어떤 아이디어? 불행히도 온라인에서 사용할 수있는 조각 예제가 많지 않습니다.


동안 실행될 메서드 호출을 이동 onCreateView하고 대신 참조를 위해 팽창중인 뷰를 사용합니다 getView(). 자세한 내용은 조각 수명주기를 참조하세요. https://developer.android.com/guide/components/fragments.html#Creating

그리고 그 문서는 getView()반환하기 전에 null을 onCreateView(LayoutInflater, ViewGroup, Bundle)반환하는 이유를 설명 합니다.

getView () 제공 되는 경우 조각의 레이아웃 (onCreateView (LayoutInflater, ViewGroup, Bundle)에서 반환 된 것 )에 대한 루트 뷰를 가져옵니다.

https://developer.android.com/reference/android/app/Fragment.html#getView ()


메서드를로 이동 onCreateView()해도 도움이되지 않았습니다. 전역 변수 만들기mView

 protected View mView;

그리고 onCreateView ()

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "oncreateView");
        super.onCreateView(inflater, container, savedInstanceState);

        View view = inflater.inflate(R.layout.activity_secure_cloud_drive_folder, container, false);
        this.mView = view;
        return view;
}

그리고 당신의 교체 getView()와 함께mView


onViewCreated()재정의해야하는 -method 안에 코드를 넣어서 수정할 수 있습니다 . 전화 super()하는 것을 잊지 마십시오 .


onAttach (...) 함수에서 null 인 이유를 이해하려면 Android Lifecycle을 확인해야합니다.

프래그먼트가 추가 될 때 호출되는 첫 번째 함수는 onAttach () 이지만 실제로는 뷰가 생성되지 않았습니다. 이것이이 호출 내에서 액세스하려고 할 때 null이 반환되는 이유입니다.

다음 함수는 onCreate ()입니다 ...하지만 아직 생성 된 뷰가 없습니다 !!!!

호출 된 세 번째 함수는 onCreateView () 이며 여기에서이 프래그먼트에 연결된 뷰를 나타내야합니다 .... 그리고 뷰 객체가 존재하고 액세스 할 수있는이 호출에서만 가능합니다.

여기 에서 전체 수명주기를 읽고 알아보십시오 .

인사말


onCreateView ()는 onCreateView () 전에 호출되기 때문에 onCreateView ()에서 뷰를 확장하든 그렇지 않든 상관없이 onCreate ()에서 getView ()를 통해 아무것도 얻지 못합니다. 그 당시에는 onCreate ()가 아직 호출되지 않았기 때문입니다. .

Android 수명주기


getview()뷰가 팽창되기 전에 호출 하기 때문에 기본적으로 null이됩니다 . 크리에이트 View개체를하고 사용하여 입력 inflater한 후 아래에 UI 요소를 참조 코드를 찾을 수

  View view = inflater.inflate(R.layout.fragment_albumslist, container, false);
        TextView t= (TextView)view.findViewById(R.id.txtTest);
        t.setText(strtext);
        return view;

참고 URL : https://stackoverflow.com/questions/9488595/getview-returning-null-when-fragment-has-been-created-from-an-activity

반응형