2012-09-10 33 views
7

Tôi có bố cục có EditText và nút. Tôi <include> nó trong bố cục chính của tôi.Bố cục sao chép chính nó trên xoay màn hình

Tôi gặp sự cố lạ với bố cục và xoay vòng. Nó có vẻ trùng lặp chính nó khi thiết bị (vật lý) được xoay, làm rối tung văn bản và bố cục.

Dưới đây đó là ngày mở đầu tiên, sau khi tôi thêm một số cắt xén:

1

DSC_0013 là trong EditText về ra mắt của đoạn.

Sau đó, tôi xoay điện thoại và thêm một số cắt xén khác nhau:

2

Và bạn có thể thấy vấn đề này khá rõ ràng. Lúc đầu, tôi nghĩ rằng đó chỉ là EditText rối tung lên. Nhưng nếu tôi thêm đủ văn bản để thực hiện một dòng sản phẩm mới:

3

tôi có thể thấy rằng nút được điều sai lầm quá.

Tôi ghi đè onSaveInstanceState, nhưng trong đó tôi không chạm vào EditText hoặc giá trị của nó, nó được sử dụng nghiêm ngặt cho một thứ khác.

Điều gì đang xảy ra và cách khắc phục sự cố?

+0

Làm cách nào để đặt chế độ xem? 'setContentView' + XML? 'addView' độc quyền? – Eric

Trả lời

13

Đã sửa lỗi!

Hóa ra đó không phải là chế độ xem sao chép chính nó hoặc EditText hoặc Nút. Đó là toàn bộ mảnh vỡ.

Trong của onCreate Hoạt động của tôi, tôi thêm các mảnh vỡ để một layout xml:

private FileDetails fileDetailsFragment; 

public void onCreate(Bundle savedInstanceState) { 
     ... 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fileDetailsFragment = new FileDetails(fileData); 
     fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
     fragmentTransaction.commit(); 

onCreate đã được gọi mỗi khi tôi xoay điện thoại (như nó có nghĩa là). Vì vậy, tôi đặt trong một kiểm tra để xem nếu các hoạt động đang được chạy cho lần đầu tiên, và nó hoạt động tuyệt vời.

private FileDetails fileDetailsFragment; 

public void onCreate(Bundle savedInstanceState) { 
    ... 
    if (savedInstanceState == null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fileDetailsFragment = new FileDetails(fileData); 
     fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
     fragmentTransaction.commit(); 
    } else { 
     fileDetailsFragment = (FileDetails) getSupportFragmentManager().findFragmentById(R.id.DetailsHolder); 
    } 
+4

Hơn một năm sau đó và giải pháp này đã giúp tôi ra :) Cảm ơn rất nhiều vì đã đăng bài này! –

+0

Bây giờ hơn ba năm ^^ – 8m47x

+0

Câu trả lời vẫn rất hữu ích – user1111527

1

Bạn cũng có thể setRetainedInstance (true) trên mảnh của bạn, sau đó thử để có được những hình thức Fragment de FragmentManager.findFragmentById (int) hoặc FragmentManager.findFragmentByTag (String), và nếu nó trả về null nó có nghĩa là bạn phải tạo một phiên bản mới của Fragment của bạn.

private FileDetails fileDetailsFragment; 


public void onCreate(Bundle savedInstanceState) { 
... 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fileDetailsFragment = (FileDetails) getSupportFragmentManager().findFragmentById(R.id.DetailsHolder); 
    if (fileDetailsFragment == null) { 
     fileDetailsFragment = new FileDetails(FileData); 
    } 

    FragmentTransaction fragmentTransaction = fragmentManager 
      .beginTransaction(); 

    fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
    fragmentTransaction.commit(); 
} 
Các vấn đề liên quan