6

Tôi có một số ViewPager với hai Fragments mà tôi khởi tạo trong onCreate trong số FragmentActivity của mình.Android - Viewpager và fragments, các phương thức không hoạt động

private List<Fragment> fragments = new Vector<Fragment>(); 

fragments.add(Fragment.instantiate(this,Frag_1.class.getName())); 
fragments.add(Fragment.instantiate(this,Frag_2.class.getName())); 
    this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments); 
    vPager = (ViewPager) super.findViewById(R.id.pager); 
    vPager.setAdapter(vPagerAdapter); 

My thứ hai Fragment có một phương thức bên trong mà tôi gọi để cập nhật của tôi ListView-refreshList():

public class Frag_2 extends Fragment { 

    private ListView list; 
    private ArrayList<data> data; 
    private boolean firstCreation=true; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setRetainInstance(false); 
    } 

    public void onAttach(Activity activity) { 
     // TODO Auto-generated method stub 
     super.onAttach(activity); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.layout, container, false); 
     list = (ListView) view.findViewById(R.id.lst); 
     //this.setRetainInstance(true); 
     return view; 
    } 


    public void refreshList(ArrayList <data> data){ 
     if(data!=null){ 
      ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); 
      list.setAdapter(adapter);} 
    } 
} 

gọi từ tôi FragmentActivity

//Something 
Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
if (fr.getView() != null) { 
    fr.refreshList(data); 
} 

Nó hoạt động tốt cho đến khi tôi thay đổi hướng của màn hình. Nếu tôi sai, nhưng tôi đã tìm kiếm hàng giờ và tôi không tìm được giải pháp hay giải thích tốt, thì FragmentActivity chỉ được tạo một lần và Fragments được gắn vào nó nhưng việc tái tạo Fragments về thay đổi cấu hình. Bây giờ, khi định hướng thay đổi, tôi không nhận được View từ onCreate vì vậy khi tôi cố gắng lấy số View từ số Fragment nó trả về giá trị rỗng và phương thức refreshList() của tôi không được gọi. Làm thế nào tôi có thể sửa lỗi này?

+0

Không ai biết làm thế nào để làm điều đó? – DLock

+0

Tôi đang gặp sự cố tương tự và không tìm thấy giải pháp. Tôi bắt đầu nghĩ rằng có một lỗi trong 'FragmentManager' hoặc một cái gì đó khác xem xét cả hai chúng tôi đang trải qua điều này. – adneal

+0

bố cục xml của bạn là gì? đây không phải là vấn đề đối với các đoạn tĩnh được khai báo trong bố cục của hoạt động nhưng đây không phải là trường hợp cho các đoạn động – chip

Trả lời

1

Tôi cố định vấn đề theo cách này: Trong onCreate của FragmentActivity

if(savedInstanceState!=null){ 
      frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); 
      frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); 
     } 
     else{ 
      frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); 
      frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); 
     } 
     fragments.add(frag1); 
     fragments.add(frag2); 


protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); 
     getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); 
    } 

Có lẽ nó không giải pháp tốt nhất trong vũ trụ, nhưng có vẻ như nó hoạt động ...

+0

Điều này không hoạt động, cũng điều chỉnh 'configChanges' trong các tác phẩm kê khai, nhưng tôi không nghĩ đây là những giải pháp vững chắc. Tôi cho rằng cách này sẽ làm việc trong trường hợp bạn có một hoặc hai mảnh vỡ, nhưng tôi thực sự có năm thứ đang bị ảnh hưởng bởi điều này. Tôi vui vì nó làm việc cho bạn mặc dù. – adneal

-1

Nếu bạn đang sử dụng phân đoạn động, bạn cần phải kiểm tra trước để ngăn việc tạo một phiên bản thứ hai của một đoạn.

Để kiểm tra xem hệ thống có đang tạo lại hoạt động hay không, hãy kiểm tra xem đối số Bundle có được chuyển đến hoạt động của bạn onCreate()null hay không.

Nếu không phải là null, hệ thống sẽ tạo lại hoạt động. Trong trường hợp này, hoạt động sẽ tự động khởi tạo lại các đoạn hiện có.

Nếu đó là null, bạn có thể nhanh chóng tạo phân đoạn động của mình một cách an toàn. Ví dụ:

public void onCreate(Bundle savedInstanceState) { 
    // ... 
    if (savedInstanceState != null) { 
    FragmentManager fragmentManager = getFragmentManager() 
    // Or: FragmentManager fragmentManager = getSupportFragmentManager() 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    ExampleFragment fragment = new ExampleFragment(); 
    fragmentTransaction.add(R.id.fragment_container, fragment); 
    fragmentTransaction.commit(); 
    } 
} 

Lớp Fragment hỗ trợ các phương pháp onSaveInstanceState(Bundle) (nhưng không phải là phương pháp onRestoreInstanceState()) theo cách tương tự như các lớp hoạt động.

  • Triển khai mặc định sẽ lưu trạng thái của tất cả các chế độ xem của đoạn có ID.
  • Bạn có thể ghi đè phương pháp này để lưu trữ thông tin trạng thái phân đoạn bổ sung.
  • Nếu hệ thống đang tạo lại phân đoạn từ trạng thái đã lưu trước đó, nó cung cấp tham chiếu đến Bundle chứa trạng thái đó theo phương thức onCreate(), onCreateView()onActivityCreated(); nếu không, đối số được đặt thành null.

Nếu bạn muốn có một thông tin chi tiết, here's một cuộc nói chuyện tốt bởi Ken Jones của Marakana

+0

Câu trả lời này không liên quan đến câu hỏi. @ DLock và tôi không sử dụng 'FragmentTransaction' hoặc tĩnh' Fragments' trong XML của chúng tôi. Chúng ta đang sử dụng 'ViewPager', nó gọi một' FragmentPagerAdapter'. – adneal

0

Khi u muốn làm mới Danh sách làm một cái gì đó như thế này:

public void setView() { 
    Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
    fragmentManager.beginTransaction().detach(fr).commit(); 
    fragmentManager.beginTransaction().attach(fr).commit(); 
} 
Các vấn đề liên quan