2012-05-07 27 views
5

Tôi có một ứng dụng với ViewPager chứa hai đoạn: một đoạn chính và một đoạn danh sách. Nếu một cái gì đó trong danh sách được chọn, một sự kiện được nêu lên được xử lý trong hoạt động. Hoạt động chuyển sang phân đoạn chính và gọi phương thức "setSelectedItem". Trong phương pháp này, Tôi sử dụng getView() để tìm một dạng xem cụ thể để thay đổi văn bản theo mục đã chọn.getView trong trả về mảnh đôi khi null

Hầu hết thời gian hoạt động, nhưng đôi khi getView trả về giá trị rỗng và tôi không biết tại sao.

Các pagerAdapter được tạo ra trong OnCreate của hoạt động:

this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager()); 
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setAdapter(this.mPagerAdapter); 

Adapter pager tạo ra thể hiện của cả hai mảnh trong constructor của nó:

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    this.main = MainFragment.newInstance(); 
    this.list = ListFragment.newInstance(); 
} 

Đây là phương pháp trong hoạt động này được gọi là khi một mục từ danh sách được chọn:

ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

Và cuối cùng là thứ là được dòng trong phương pháp setSelectedItem trong MainFragment mà nguyên nhân của vấn đề:

TextView s = (TextView)getView().findViewById(R.id.CurrentSelection); 

Tôi đã thử nhiều điều tôi đọc về nhưng vấn đề vẫn còn xảy ra đột xuất.

+0

Rất tiếc, tôi có cùng sự cố và không có giải pháp. Mã của tôi được rải rác nếu (getView() == null) trả về; ở những nơi khác nhau. Nếu bạn đã giải quyết được vấn đề bây giờ, tôi sẽ quan tâm. – StackOverflowed

+2

Bạn có thể chia sẻ mã nơi bạn thêm phân đoạn vào trình quản lý phân đoạn không? Có thể getView sẽ trả về null nếu onCreateView (một phần của vòng đời mảnh vỡ) đã không được gọi cho mảnh - tức là đoạn chưa hoàn toàn được thêm vào hoạt động. – PacificSky

+0

Bạn đang gọi "TextView s" ở đâu? Đây có phải là trong chế độ xem View công khai trong Phân đoạn không? –

Trả lời

0

Để bắt đầu, tôi không chắc chắn 100%, nhưng tôi có một vài điểm tôi cần đề cập đến. Đầu tiên, tôi không thích cách bạn đang sử dụng thissuper như vậy, chúng dường như mơ hồ, tôi tin rằng một cách tốt hơn là chính xác hơn khi xem xét trước khi biên dịch bạn nhận thức được giá trị của chúng. Tôi nghĩ rằng nếu bạn thay đổi mã của bạn như sau, nó sẽ giúp (chỉ là một linh cảm).

// No need for 'this' and 'super' here, you are within the activity 
mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setAdapter(mPagerAdapter); 

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    // No need for 'this' here, you are within the class 
    main = MainFragment.newInstance(); 
    list = ListFragment.newInstance(); 
} 

// No need for 'super' here, you are within the activity 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

// Here use 'getActivity()' instead of 'getView()' 
TextView s = (TextView)getActivity().findViewById(R.id.CurrentSelection); 

Hãy cho tôi biết những gì xảy ra, cổ vũ.

+0

Chủ đề này khá cũ và vẫn không có câu trả lời được chấp nhận.Have cùng một vấn đề và tìm kiếm giải pháp.Thông báo quan trọng: vấn đề là repro khi android giết chết hoạt động lưu trữ (ví dụ như trên bản ghi nhớ) .Android cố gắng khởi động lại hoạt động trong trường hợp này.Đối với một số lý do onCreateView không được gọi sau khi giải trí fragment thay vì được gọi trước (!) .Để chắc chắn tái tạo vấn đề, người dùng có thể đặt 'hủy mọi hoạt động ngay khi người dùng rời khỏi nó' trong' tùy chọn nhà phát triển'. ứng dụng bằng cách nhấn nút home và khôi phục nó. – undefined

Các vấn đề liên quan