Android 螢幕旋轉(configuration)

螢幕是在configuration這個類中,
其包含設備上的鍵盤keyboard、touchscreen等

如果希望監聽系統設定的變化
例如按下什麼鍵、螢幕旋轉等,需要:
  1. 要Override onConfigurationChanged這個方法
  2. 在AndroidManifest.xml中宣告Activity處理的類型
本來在AndroidManifest要宣告螢幕變化如下:





<activity
...
android:configChanges="orientation">

現在3.0以上要加上screenSize:

<activity
...
android:configChanges="orientation|screenSize">

如此才可以實現監聽。



本案相當簡單,不過我在操作螢幕旋轉的變化用了2個方法:
  1. 原始的偵測,抓出現在螢幕的狀態
    如果現在是直的,那就轉橫,或著相反
  2. 另一個是抓出現在螢幕的大小,如果X軸大於Y軸
    表示現在是橫的,那就轉直,如果不是就相反
個人比較喜歡第二個,但第二個有個缺點就是手機本身
的螢幕長寬相同,那就怎麼也抓不到(不過應該不會有正方型的手機…)




程式碼:

public static class PlaceholderFragment extends Fragment {
 EditText et;
 public PlaceholderFragment() {
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  View rootView = inflater.inflate(R.layout.fragment_main, container,
    false);   
  et = (EditText) rootView.findViewById(R.id.editText1);
  Button btn =(Button) rootView.findViewById(R.id.button1);
  btn.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    if(getActivity().getRequestedOrientation() == -1){
     //抓不到,提示訊息
     Toast.makeText(getActivity(),
       "無法取得目前系統螢幕方向", Toast.LENGTH_SHORT).show();
    }else{
     /*
     if(getActivity().getRequestedOrientation()==  //如果現在狀態是平的
       ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
      
      getActivity().setRequestedOrientation(    //就改成直的
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      
     }else if(getActivity().getRequestedOrientation()== //如果現在狀態是直的
       ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
      
      getActivity().setRequestedOrientation(  //就改成正的
        ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      
     }
     */ 
     //取得目前螢幕的大小
     Display display = getActivity().getWindowManager().getDefaultDisplay();
     Point point = new Point();
     display.getSize(point);
     
     //如果X>Y,
     if(point.x > point.y){
      //表示目前是橫的,就改成直
      getActivity().setRequestedOrientation(
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     }else{
      //如果不是表示目前是直的,就改成橫
      getActivity().setRequestedOrientation(
        ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     }      
    }
    
   }
  });
  return rootView;
 }
 //要監聽務必要覆寫onConfigurationChanged這個方法
 @Override
 public void onConfigurationChanged(Configuration newConfig) {
  Toast.makeText(getActivity(), "系統螢幕發生變化", Toast.LENGTH_SHORT).show();
  updateEditText();
  super.onConfigurationChanged(newConfig);
 }
 
 public void updateEditText(){
  switch (getActivity().getRequestedOrientation()) {
  case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
   et.setText("目前狀態:LANDSCAPE");
   break;
  case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
   et.setText("目前狀態:PORTRAIT");
   break;
  }
 }
}

AndroidManifest

 <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
 <!-- 要加uses-permission中的 CHANGE_CONFIGURATION-->
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.sample_12_1.MainActivity"
            android:label="@string/app_name" 
            android:screenOrientation="portrait"
            android:configChanges="orientation|screenSize">
            <!-- configChanges中除了原本的orientation要加上screenSize-->
            
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

留言

熱門文章