2012-02-20 47 views
6

Ứng dụng này là một bài tập học tập cho tôi sử dụng các đoạn, trong số những thứ khác. Nó có một hoạt động duy nhất quản lý một số phân đoạn khác nhau. Đầu tiên là một ListFragment (A), hiển thị khi ứng dụng bắt đầu và tải các mục danh sách từ một con trỏ. Nhấp vào một mục danh sách sẽ thông báo cho hoạt động để thay thế ListFragment bằng một DetailFragment (B) cho mục đó. Nếu khi nhìn vào (B) Tôi xoay màn hình, tôi thấy (B) trên đầu trang của (A), như thế này:Các đoạn Android chồng chéo sau khi xoay màn hình

http://postimage.org/image/uhy016ds7/

đoán tốt nhất của tôi là nó đã làm với Android phá hủy và tái tạo hoạt động trên thay đổi cấu hình. Tôi tự hỏi giải pháp sạch nhất cho vấn đề này là gì. Một số đoạn mã theo sau, hãy cho tôi biết nếu có điều gì khác tôi nên đăng.

res/layout/home.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/fragment_place_list" 
     android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </fragment> 
</FrameLayout> 

MyActivity.onCreate

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
      R.id.fragment_place_list); 

} 

MyActivity.showDetailPane

public void showDetailPane(String id, String reference) { 
    placeDetailFragment = PlaceDetailFragment.newInstance(id, reference); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.addToBackStack(null); 
    ft.hide(placeListFragment); 
    ft.replace(R.id.fragment_container, placeDetailFragment); 
    ft.show(placeDetailFragment); 
    ft.commit(); 
} 
+0

bạn đã xem xét 'tài nguyên thay thế' chưa? http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources –

+0

Vâng, tôi đang tập trung vào màn hình điện thoại vào lúc này.Bố trí cho ListFragment sẽ không có bất kỳ khác nhau trong cảnh quan anyway. Trong thực tế, không có bố cục xml cho ListFragment vì tất cả nó hiện có là ListView tích hợp sẵn. – Karakuri

Trả lời

4

Đó là vì bạn sử dụng bố cục khung làm vùng chứa. Nó sẽ không trùng lặp với các bố cục khác.

Và đối với những gì bạn muốn đạt được thực hành tốt nhất là tạo một tệp XML vào bố cục/thư mục của bạn nơi chỉ sử dụng danh sách liệt kê của bạn. Trong bố trí đất của bạn/bạn đặt một tập tin XML với cả hai mảnh được sử dụng và sắp xếp.

Sau đó, hệ thống sẽ xử lý tất cả việc tạo. mảnh vỡ. Và hoạt động của bạn về cơ bản giảm xuống một cuộc gọi setContentView().

Trên mục danh sách, hãy nhấp vào bạn, sau đó kiểm tra với người quản lý phân đoạn xem phân đoạn chi tiết của bạn có được tạo hay không. Nếu nó được tạo ra, bạn gọi hàm public trong phần chi tiết để thiết lập dữ liệu.

Nếu không được tạo, bạn tạo ý định với hoạt động mới.

Tôi biết 2 hướng dẫn hay: trang phân đoạn trên trang dành cho nhà phát triển Android và vogella.de đều sẽ cung cấp cho bạn một ví dụ/hướng dẫn chi tiết.

+0

Cảm ơn bạn đã chỉ ra rằng đó là FrameLayout. Tuy nhiên, tôi đang cố gắng không bắt đầu một hoạt động khác vì hoạt động này đang thực hiện một số công việc hậu trường khác. Điều đó nói rằng, bạn đã cho tôi một hoặc hai ý tưởng để làm việc xung quanh, vì vậy cảm ơn. – Karakuri

2

Điều này phù hợp với tôi.

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    .... 
    fragment = getFragmentManager().findFragmentByTag(TAG); 
    if(fragment == null) fragment = new Fragment(); 
    .... 

} 
3

Thay đổi FrameLayout cho LinerLayout và sự cố sẽ được giải quyết.

Đây là sự cố liên quan đến FrameLayout.

+1

Điều này làm việc cho tôi mà không phải thay đổi kiến ​​trúc của tôi. – BeccaP

5

Theo Android dev page, trong phương thức onCreate của Activity, bạn nên kiểm tra xem savedInstanceState có rỗng không trước khi thêm phân đoạn vào hoạt động. Đoạn mã của phương thức onCreate hoạt động từ this page nói rằng.

// However, if we're being restored from a previous state, 
// then we don't need to do anything and should return or else 
// we could end up with overlapping fragments. 
if (savedInstanceState != null) { 
    return; 
} 
+0

Cảm ơn, hoạt động hoàn hảo, đã cứu tôi sau 2 giờ đấu tranh với nó – Mal

+0

đơn giản và điều này làm việc. – iCrus

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