2012-05-17 24 views
13

Tôi đang phát triển một ứng dụng mà về cơ bản có ActionBar. Khi ứng dụng của tôi bắt đầu, Hoạt động sẽ tạo các đoạn và đính kèm chúng vào mỗi tab, vì vậy khi tôi chuyển đổi, tôi có các chế độ xem khác nhau.Những mảnh vỡ Android tái tạo về biến đổi định hướng

Những vấn đề nảy sinh khi tôi cố gắng xoay thiết bị. Sau một số cuộc đấu tranh, tôi nhận thấy rằng Android tự động tạo lại các đoạn đã thêm trước đây như sau:

SummaryFragment.onCreate(Bundle) line: 79 
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795 
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032 
FragmentManagerImpl.moveToState(int, boolean) line: 1014  
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864 
... 

và sau đó tôi tạo lại các mảnh như bình thường. Vì vậy, tôi có các mảnh "thực" mà tôi mong đợi hoạt động chính xác và các đối tác được tạo bởi Android "ẩn" khiến ứng dụng của tôi gặp sự cố. Làm cách nào để tránh hành vi này? Tôi đã cố gắng gọi setRetainInstance (false) trong SummaryFragment.

Cảm ơn bạn

Trả lời

35

Bạn cần kiểm tra saveInstanceState [chỉnh sửa: trong hoạt động gốc của bạn] và nếu có, không tạo đoạn của bạn.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (savedInstanceState == null) { 
     // Do your oncreate stuff because there is no bundle 
    } 
// Do stuff that needs to be done even if there is a saved instance, or do nothing 
} 
+1

không chắc chắn nếu nó cùng một vấn đề OP đã có, nhưng điều này là vô cùng hữu ích cho tôi. Cảm ơn. – ssmy

+0

Cảm ơn rất nhiều giải pháp @Barak chỉ hoạt động sau một tuần –

0

Nếu bạn có ui tương tự (không có tập tin bố trí đất cụ thể) cho cả hai định hướng bạn có thể đặt android:configChanges="keyboardHidden|orientation" để hoạt động trong file manifest của bạn.

Nếu không cung cấp xin vui lòng các mã nguồn mà bạn đang thêm các mảnh vỡ để các tab, và tôi sẽ cố gắng giúp bạn với những cải tiến.

+0

Được giải quyết một phần bằng câu trả lời của bạn. Vì hầu hết các bản vẽ được thực hiện động, tôi xóa tất cả các chế độ xem và chuyển tiếp chúng theo hướng mới. Thành thực mà nói, tôi không nghĩ rằng đó là một giải pháp làm sạch nhưng tôi không thể để ngăn chặn hệ thống để dữ dội tạo ra mảnh vỡ cho tôi ... – Luke47

+0

này đã giúp tôi vì tôi tiếp tục lãng quên để cập nhật các file bố trí đất của tôi sau khi tôi thay đổi bức chân dung. Nó đã nhận tôi khoảng 5 lần rồi. – buster

+3

Những điều khó hiểu sẽ xảy ra khi cắm thiết bị vào đế cắm xe hoặc TV hoặc bất kỳ thay đổi cấu hình nào khác: các mảnh vỡ sẽ vẫn được tạo lại. android: configChanges là ác, trừ khi bạn thực sự biết những gì bạn đang làm. – personne3000

0

Khi bạn tạo hoạt động của bạn, hãy kiểm tra để chắc chắn rằng nó không tồn tại. Nếu nó tồn tại, không phải làm gì cả ... Android sẽ tạo lại nó cho bạn.

private void initFragment() { 
     FragmentManager fragMgr = getSupportFragmentManager(); 
     if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; } 
     frag = new HdrLeaderboardFragment(); 
     FragmentTransaction ft = fragMgr.beginTransaction(); 
     ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.commit(); 
    } 
+1

Làm như vậy nó vẫn còn thêm hai mảnh ... cái mà tôi đã có (theo cách bạn gợi ý) cộng với một số khác có nghĩa là khiến tôi phát điên. Nó sẽ có được như vậy dễ dàng để thiết lập lại các FragmentManager giữa định hướng thay đổi ... – Luke47

0

Tôi không chắc chắn nếu có giải pháp tốt hơn, nhưng đây là những gì tôi đã làm trong chương trình mới nhất.

Khi đoạn được tạo tự động bởi hệ thống về thay đổi hướng và nếu bạn muốn theo dõi chúng trong hoạt động của máy chủ, hãy bắt chúng trong phương thức OnAttachFragment() của hoạt động lưu trữ. Và họ nhận được các đối số theo mặc định, vì vậy bạn có thể sử dụng chúng để tìm ra phân đoạn đó là gì.

public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 
    if (fragment != null) { 
     if(fragment.getArguments() != null) { 
      switch (fragment.getArguments().getString(ARG_PARAM1)) { 
       case FragmentATag: 
        if (myFragmentA != fragment) { 
         myFragmentA = (FragmentA) fragment; 
        }      
        break; 
       case FragmentBTag: 
        if (myFragmentB != fragment) { 
         myFragmentB = (FragmentB) fragment; 
        }       
        break;     
      } 
     } 
    } 
    } 
Các vấn đề liên quan