2011-08-01 45 views
7

có thể phát hiện xoay màn hình không? Ý tôi là - chỉ xoay vòng, có thể phân biệt rõ ràng với việc khởi tạo hoạt động từ một hoạt động khác?Tôi làm cách nào để phát hiện chế độ xoay màn hình?

Các phương pháp OnXXX dường như không có ích cho điều này, tôi đã cố gắng thêm/gỡ bỏ một flag từ starting Intent (các loại bỏ có vẻ như không được phản ánh, trên xoay cờ là có), và đã cố gắng thêm android: configChanges = "orientation" cho hoạt động trong tệp kê khai, tuy nhiên phương thức onConfigurationChanged dường như được gọi là mỗi vòng quay thứ hai ... có dây.

Tôi đoán tôi đang thiếu thứ gì đó ... nhưng chưa tìm thấy giải pháp rõ ràng trong các chủ đề liên quan khác.

Bất kỳ ý tưởng nào?

+0

bạn có nghĩa là nếu nó chuyển từ chế độ ngang sang dọc hoặc ngược lại? – Pengume

+0

không phải là chủ đề này giống nhau không? : http://stackoverflow.com/questions/4843809/how-do-i-detect-screen-rotation – Viren

+0

Trong phương thức onConfigurationChanged, bạn có thể phát hiện loại ConfigurationChanged nào xảy ra, như xoay màn hình. – mikepenz

Trả lời

11

Manifest:

<activity android:name=".MyActivity" android:configChanges="screenSize|orientation|screenLayout|navigation"/> 

Hoạt động:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

thử liên kết này cũng

How do I detect screen rotation

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, tôi đã thử nó, trước khi đăng câu hỏi, và điều này không làm việc cho tôi, không có ý tưởng tại sao, nhưng onConfigurationChanged không được gọi là mọi lúc. Nó được gọi chỉ khi định hướng đang trở thành giống như bản gốc (mỗi lần thứ hai). – MerlinBG

+0

bạn đang thử nghiệm ở đâu? Bạn có thể gửi mã của bạn? Vì tôi đã thử nghiệm nó trên điện thoại và nó hoạt động – Finuka

+0

Tôi đang thử nghiệm nó trên trình mô phỏng và nhìn vào khung nhìn LogCat. Mã này là 100% giống như đăng ở trên, nếu không có sự kiểm tra định hướng: android:configChanges="orientation|keyboard" trong manifest (chỉ dành cho hoạt động này) và @Override \t public void onConfigurationChanged(Configuration newConfig) { \t \t super.onConfigurationChanged(newConfig); \t \t \t \t Log.d(" - ", "onConfigChanged"); // TODO remove \t } trong lớp hoạt động ... – MerlinBG

0

Tại sao bạn không thử loại này?

trong onCreated có được định hướng của điện thoại:

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
myOrientation = display.getOrientation(); 

sau đó, ghi đè lên các phương pháp onConfigurationChanged và kiểm tra xem các định hướng đã thay đổi:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    if(newConfig.orientation != myOrientation) 
     Log.v(tag, "rotated"); 
    super.onConfigurationChanged(newConfig); 
} 

Đừng quên thêm vào tệp kê khai android:configChanges="orientation" trong hoạt động.

1

Sử dụng onConfigurationChế độ thay đổi để phát hiện xoay màn hình không phải là ý tưởng hay. Thay đổi cấu hình trong hoạt động này sẽ không hoạt động chính xác khi người dùng xoay màn hình.

Vì vậy, tôi sử dụng giải pháp này để giải quyết vấn đề này.

public class SampleActivity extends AppCompatActivity { 
    public static final String KEY_LAST_ORIENTATION = "last_orientation"; 
    private int lastOrientation; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     if (savedInstanceState == null) { 
      lastOrientation = getResources().getConfiguration().orientation; 
     } 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     checkOrientationChanged(); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     lastOrientation = savedInstanceState.getInt(KEY_LAST_ORIENTATION); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(KEY_LAST_ORIENTATION, lastOrientation); 
    } 

    private void checkOrientationChanged() { 
     int currentOrientation = getResources().getConfiguration().orientation; 
     if (currentOrientation != lastOrientation) { 
      onScreenOrientationChanged(currentOrientation); 
      lastOrientation = currentOrientation; 
     } 
    } 

    public void onScreenOrientationChanged(int currentOrientation) { 
     // Do something here when screen orientation changed 
    } 
} 

Nhưng mã vẫn chưa đủ để sử dụng trong dự án của tôi, vì vậy tôi đã áp dụng mã này vào thư viện của riêng mình (https://github.com/akexorcist/ScreenOrientationHelper).

compile 'com.akexorcist:screenorientationhelper:<latest_version>' 

Bạn có thể tạo lớp hoạt động cơ sở như thế này

public class BaseActivity extends AppCompatActivity implements ScreenOrientationHelper.ScreenOrientationChangeListener { 
    private ScreenOrientationHelper helper = new ScreenOrientationHelper(this); 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     helper.onCreate(savedInstanceState); 
     helper.setScreenOrientationChangeListener(this); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     helper.onStart(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     helper.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     helper.onRestoreInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onScreenOrientationChanged(int orientation) { 

    } 
} 

Sau đó, mở rộng hoạt động với lớp cơ sở này

public class MainActivity extends BaseActivity { 

    ... 

    @Override 
    public void onScreenOrientationChanged(int orientation) { 
     // Do something when screen orientation changed 
    } 
} 

Xong!

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