2012-04-05 20 views
6

Tôi đã tạo một thử nghiệm project có hai đoạn khác nhau được hiển thị trong cùng một hoạt động. Một mảnh là dành cho cảnh quan và phần còn lại cho chân dung.Đoạn khác nhau không được tải khi định hướng thay đổi (android)

# My unique activity 
public class MainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

# First Fragment 
public class LandscapeFragment extends Fragment { 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false); 
     v.setText("LANDSCAPE"); 
     return v; 
    } 
} 

# Other Fragment 
public class PortraitFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false); 
     v.setText("PORTRAIT"); 
     return v; 
    } 
} 

Và tôi có hai tệp main.xml, một trong sơ đồ bố trí/và tệp kia trong bố cục đất /. Mỗi tệp main.xml trỏ đến đúng Fragment được sử dụng.

<!-- layout-land/main.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:name="br.luckcheese.test.LandscapeFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" /> 

<!-- layout/main.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:name="br.luckcheese.test.PortraitFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" /> 

<!-- layout/fragment.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" /> 

Khi tôi mở ứng dụng ở chế độ ngang, LandscapeFragment được hiển thị và khi tôi mở trong Portrait PortraitFragment được hiển thị. Càng xa càng tốt.

Nhưng nếu tôi mở ở chế độ ngang và xoay thiết bị thành dọc thì LandscapeFragment sẽ được tải lại và hiển thị. Đó không phải là hành vi được dự đoán. PortraitFragment đã được tải.

Và điều tương tự cũng xảy ra theo cách khác, nếu thiết bị bắt đầu theo hướng dọc và sau đó xoay nó thành ngang: PortraitFragment vừa được tải lại, thay vì phải tải LandscapeFragment.

Tôi đang làm gì sai?

Trả lời

2

Hãy chắc chắn rằng bạn không có: android:config="orientation" trong manifest.xml bạn

+0

Không, dòng duy nhất tôi thêm vào manifest mặc định là 'android: screenOrientation = "sensor"' cho hoạt động – Luckcheese

+0

Bạn có cố gắng tạo điểm ngắt trong onCreate() hoạt động của mình để xem liệu phương pháp này có được gọi khi bạn xoay thiết bị không? –

+0

Có. Nó được gọi là. Tôi đã thêm thông điệp tường trình trên onCreate cho hoạt động của tôi và cho từng đoạn. Và khi tôi xoay thiết bị, onCreate của đoạn sai được gọi sau khi hoạt động của onCreate. – Luckcheese

1

Vấn đề là trong 2 bố trí của bạn, id đoạn đều giống nhau. Chỉ cần thay đổi các id đoạn, như:

fragmentportrait cho layout/main.xml

fragmentlanscape cho bố trí đất/main.xml. (Và thay đổi thêm: Fragment frag = getSupportFragmentManager() findFragmentById (R.id.fragment);

frag.setRetainInstance (false); .)

+0

Ok, công nhân đó. Nhưng tôi đã không hiểu tại sao cần thêm các id khác nhau? Bởi vì trên mã của tôi, tôi phải kiểm tra cả hai để thiết lập frag.setRetainInstance (false). Nhưng, tôi cũng hoàn thành công việc tạo bố cục duy nhất với FrameLayout và thêm các đoạn mã theo mã sau khi kiểm tra hướng hiện tại của getResource(). GetConfiguration(). Orientation! – Luckcheese

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