2012-10-18 36 views
8

Tôi đang phát triển một ứng dụng Android chỉ nên chạy ở chế độ dọc do bố cục không phù hợp trên màn hình ngang của điện thoại. Trên máy tính bảng và netbook, tuy nhiên, tôi muốn ứng dụng chỉ chạy ở chế độ ngang.setRequestedOrientation trước khi hiển thị ProgressDialog dẫn đến sự cố

Tôi hiện đã cố gắng kiểm tra xem ứng dụng có đang chạy trên thiết bị máy tính bảng hay không và đặt định hướng được yêu cầu tương ứng thông qua setRequestedOrientation.

Vấn đề là ứng dụng đổ vỡ ngay bây giờ khi thiết bị chưa được giữ theo hướng tôi đang yêu cầu, vì tôi hiển thị tiến trìnhDialog ngay sau cuộc gọi đến setRequestedOrientation, có vẻ như sẽ rò rỉ một cửa sổ.

Logcat nói:

10-18 21:15:30.698: E/WindowManager(653): Activity has leaked window [email protected] that was originally added here 
10-18 21:15:30.698: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window com.android.internal.policy[email protected] that was originally added here 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
10-18 21:15:31.888: E/WindowManager(653): Activity has leaked window [email protected] that was originally added here 
10-18 21:15:31.888: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window [email protected] that was originally added here 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:599) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:336) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:151) 

tôi có thể làm gì để ngăn chặn tai nạn này? Mọi trợ giúp sẽ được đánh giá cao.

EDIT: Vì tôi không thể giải quyết vấn đề này, cuối cùng tôi đã chỉnh sửa Bố cục của mình để bây giờ cho phép sử dụng ở chế độ dọc và ngang.

Trả lời

11

Bạn có bất kỳ mã nguồn nào mà bạn có thể hiển thị không? Điều đó có thể giúp xác định vấn đề.

Tôi thực sự có cùng một vấn đề. Nhưng nó chỉ xảy ra cho một số hoạt động của tôi.

Khi hướng màn hình thay đổi, Android thực sự phá hủy và tạo lại hoạt động.

Vì vậy, tôi đã có mã trông như thế này.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     setContentView(R.layout.displayscreen); 

     bottomButton = (Button) findViewById(R.id.bottomButton); 
     bottomButton.setOnClickListener(bottomButtonClick); 
     bottomButton.setTypeface(font); 
     bottomButton.setTextSize(16); 
} 

Xem điều gì đang xảy ra là chế độ xem không được đính kèm chính xác vào trình quản lý cửa sổ. Vì vậy, tôi quyết định rằng oncreate có lẽ không phải là nơi tốt nhất để làm điều này.

Thay vào đó, tôi đã thêm nó vào Tiếp tục và hoạt động. Giống như vậy:

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

     bottomButton = (Button) findViewById(R.id.bottomButton); 
     bottomButton.setOnClickListener(bottomButtonClick); 
     bottomButton.setTypeface(font); 
     bottomButton.setTextSize(16); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

Thật không may điều này cũng khiến hoạt động vẫn bị phá hủy và được tạo lại. Gọi onCreate và onResume hai lần ... Không tốt phải không?

Vì vậy, để khắc phục vấn đề này. Bạn phải thêm phần này vào tệp kê khai Android cho hoạt động của mình.

android:configChanges="keyboardHidden|orientation" 

Một thí dụ:

<activity 
    android:name="com.Test.Info.DisplayInfo" 
    android:configChanges="keyboardHidden|orientation" 
    android:label="@string/info"> 
</activity> 

Mã này ngăn ngừa sự phá hủy/tái tạo chu kỳ.

Hy vọng điều này sẽ hữu ích!

Cheers

+1

Cảm ơn bạn đã viết câu trả lời dài như vậy, nhưng tiếc là nó không giải quyết được vấn đề của tôi. –

+0

Không sao cả. Xin lỗi nó đã không giúp bạn. Lần tới nếu bạn thêm một số mã nguồn, nó sẽ giúp theo dõi vấn đề cụ thể của bạn. Tôi đã có một vấn đề tương tự, và điều này làm việc cho vấn đề cụ thể của tôi. Vui vì bạn đã làm nó mặc dù. – Dave

+1

Cảm ơn, câu trả lời của bạn đã cứu tôi Dave! Trên thực tế, bạn chỉ cần đặt 'android: configChanges =" orientation "' trong tệp kê khai và gọi 'setRequestedOrientation()' ở đầu 'onCreate()';) –

9

Nếu bạn sử dụng

setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR); 

tạm khóa, và

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

để mở khóa xoay màn hình, có thể bạn chạy vào problem sau.

Nếu bạn sử dụng phương pháp này để khóa hướng màn hình và thiết bị không theo hướng mặc định, thiết bị sẽ chuyển sang hướng mặc định, hủy và tạo hoạt động của bạn. Ứng dụng của bạn sẽ gặp sự cố, do thực tế là bạn đang cố gắng cập nhật một số tiến trình destDed.

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