2012-10-25 24 views
6

Tôi đã thiết lập hoạt động để xử lý các thay đổi cấu hình và hoạt động, nghĩa là được gọi khi định hướng thay đổi.onConfigurationChanged không được gọi khi setRequestedConfiguration đã được sử dụng

Hoạt động có nút để thay đổi hướng rõ ràng. Khi được nhấp, nó được gọi là setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT).

Sau đó, hướng được đặt không thể thu hồi và không được gọi nữa.

Làm cách nào để thay đổi hướng khi người dùng nhấp vào nút trong khi không mất gọi lại?

Trả lời

4

này là cách tôi giải quyết nó. Tôi biết nó là tái phát minh bánh xe nhưng nó đáp ứng yêu cầu của tôi và tôi đã không tìm thấy một cách thích hợp để xử lý này với các công cụ sdk tiêu chuẩn.

Đầu tiên, tạo một lớp OrientationManager mà nghe định hướng thay đổi

public class OrientationManager extends OrientationEventListener{ 
private static final String TAG = OrientationManager.class.getName(); 

private int previousAngle; 
private int previousOrientation; 
private Context context; 
private OrientationChangeListener orientationChangeListener; 
private static OrientationManager instance; 
private OrientationManager(Context context) { 
    super(context); 
    this.context = context; 
} 

public static OrientationManager getInstance(Context context){ 
    if (instance == null){ 
     instance = new OrientationManager(context); 
    } 
    return instance; 
} 

public int getOrientation(){ 
    return previousOrientation; 
} 

public void setOrientation(int orientation){ 
    this.previousOrientation = orientation; 
} 


@Override 
public void onOrientationChanged(int orientation) { 
    if (orientation == -1) 
     return; 
    if(previousOrientation == 0){ 
     previousOrientation = context.getResources().getConfiguration().orientation; 
     if (orientationChangeListener != null){ 
      orientationChangeListener.onOrientationChanged(previousOrientation); 
     }   
    } 
    if (previousOrientation == Configuration.ORIENTATION_LANDSCAPE && 
      ((previousAngle > 10 && orientation <= 10) || 
      (previousAngle < 350 && previousAngle > 270 && orientation >= 350))){ 
     if (orientationChangeListener != null){ 
      orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_PORTRAIT); 
     } 
     previousOrientation = Configuration.ORIENTATION_PORTRAIT; 
    } 

    if (previousOrientation == Configuration.ORIENTATION_PORTRAIT && 
      ((previousAngle <90 && orientation >= 90 && orientation <270) || 
      (previousAngle > 280 && orientation <= 280 && orientation > 180)) ){ 
     if (orientationChangeListener != null){ 
      orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_LANDSCAPE); 
     } 
     previousOrientation = Configuration.ORIENTATION_LANDSCAPE; 
    } 
    previousAngle = orientation; 
} 

public void setOrientationChangedListener(OrientationChangeListener l){ 
    this.orientationChangeListener = l; 
} 

public interface OrientationChangeListener{ 
    public void onOrientationChanged(int newOrientation); 
} 
} 

Sau đó, trong hoạt động của bạn thực hiện OrientationChangeListener và ghi đè onOrientationChanged():

public class MyActivity extends Activity implements OrientationChangeListener{ 

    private OrientationManager orientationManager; 

    @Override 
    public void onCreate(Bundle b){ 
     orientationManager = OrientationManager.getInstance(this); 
     orientationManager.setOrientationChangedListener(this); 

    } 

@Override 
public void onOrientationChanged(int newOrientation) { 
    orientation = newOrientation; 
    if (newOrientation == Configuration.ORIENTATION_LANDSCAPE){ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     setLandscapeConfig(); 
    }else{ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     setPortraitConfig(); 
    } 
} 

Vì vậy, tôi không sử dụng onConfigurationChanged nữa nhưng giữ dòng sau trong Tệp kê khai: android: configChanges = "orientation | screenSize"

+0

Triển khai giải pháp của bạn nhưng onOrientationChanged không bao giờ được gọi khi tôi xoay thiết bị. Bất kỳ ý tưởng? – Codebeat

+0

Được rồi, phải gọi orientManager.enable() trong hàm tạo hoạt động! – Codebeat

1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) 

Điều này làm cho onConfigurationChang ngừng hoạt động. Nếu bạn muốn nó để làm việc, hãy thử thêm này để biểu hiện của bạn trong phạm vi hoạt động:

android:configChanges="orientation|screenSize" 

Thuộc tính screensize chỉ dành cho 13 + API vì vậy nếu bạn dưới đây đó, bạn không cần nó

+0

nó đã có trong tệp kê khai, nếu không onConfigurationChanged sẽ không hoạt động ở tất cả – znat

+0

@NathanZ Bạn đã giải quyết được vấn đề đó, tôi cũng gặp phải vấn đề tương tự. – dreamtale

+0

Vâng tôi đã làm. Xem câu trả lời của tôi – znat

2

Gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); sẽ kích hoạt lại onConfigurationChanged. Bạn có thể thiết lập một bộ đếm thời gian như thế này:

// Force orientation to portrait 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 

// Reactivate sensor orientation after delay 
Timer mRestoreOrientation = new Timer(); 
mRestoreOrientation.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
    } 
}, 2000); 

Chúng tôi chỉ có thể giả sử người dùng sẽ xoay điện thoại một mình để định hướng buộc trong sự chậm trễ, và điều này có thể dẫn đến kinh nghiệm người dùng xấu.

+0

ActivityInfo.SCREEN_ORIENTATION_SENSOR đã làm việc cho tôi. – Harry

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