Android雜談--layout的橫豎屏處理

  橫豎屏處理是開發應用是比較基礎的一個要點,幾乎都會用到。網上有一大堆的橫豎屏切換的文章,可是翻了n頁之後發現居然清一色的是轉載,因此不想浪費時間到這個上面,仍是本身根據本身的需求與體會總結一下吧,也方便之後查閱html

1、layout-land和layout-prot的區別與使用java

默認狀況下,建立的Android項目裏只有一個layout文件夾,儘管這樣也能夠橫豎屏切換用,可是某些佈局橫屏事後閒的格外的醜,以下圖android

橫屏事後就顯示的不全了,有時候看着比較糾結。因此須要在橫屏的使用從新載入新的佈局文件app

解決辦法是:先把layout目錄刪除了,由於可能跟以後的產生衝突。而後新建兩個文件夾,一個layout-land,另外一個是layout-prot。eclipse

layout-land:存放橫屏佈局文件,如main.xml。佈局名字與layout-prot的同樣ide

layout-prot:存放豎屏佈局文件,名字與layout-land的同樣佈局

剩下的事情就能夠交由手機處理了,手機會自動處理橫豎屏時佈局之間的切換(前提是你的手機支持橫豎屏,而且:設置-顯示-自動旋轉屏幕)this

先看看兩個佈局文件吧,Activity能夠不用管spa

layout-land/main.xml.net

複製代碼
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" >     <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="20dip" android:paddingRight="20dip" >         <TextView android:text="cnblogs-花郎" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="20dip" android:textSize="24.5sp" />         <TableLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:stretchColumns="*" >             <TableRow>                 <Button android:text="吃飯" />                 <Button android:text="睡覺" />             </TableRow>             <TableRow>                 <Button android:text="旅遊" />                 <Button android:text="盜墓" />             </TableRow>         </TableLayout>     </LinearLayout> </LinearLayout>
複製代碼

layout-prot/main.xml

複製代碼
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#3500ffff" android:padding="30dip" android:orientation="horizontal" >     <LinearLayout android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_gravity="center" >         <TextView android:text="cnblogs-花郎" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="25dip" android:textSize="24.5sp" />         <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="吃飯" />         <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="睡覺" />         <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="旅遊" />         <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="盜墓" />     </LinearLayout> </LinearLayout>
複製代碼

下面有圖有真相,是橫屏時的佈局。

注:切換模擬器的命令式CTRL+F12

這裏有一點須要注意的是,橫豎屏切換的生命週期的問題。

在上面的那種狀況下,橫豎屏切換的時候,會銷燬Activity後而後再次建立。

在不加入任何設置的時候,它的生命週期是這樣的:

onCreate-onStart-onResume   開始運行時

onPause-onStop-onDestroy-onCreate-onStart-onResume   橫豎屏切換的時候都是這樣

當在AndroidManifest.xml中的activity標籤中加入了:

android:configChanges="orientation|keyboardHidden"

或者android:configChanges="orientation"後

橫豎屏切換就不須要從新載入了,也就是說不用銷燬Activity後再從新建立Activity了。

 

另一種橫豎屏切換時生命週期的樣子是另外的樣子,是與onConfigureChanges方法有關的,它的生命週期跟個人有些不一樣呢?

參考:http://hi.baidu.com/%C2%E4%C2%E4%E7%F7%E7%F7%B0%A1/blog/item/dcc19ce5a9c274cc2e2e2178.html

2、如何限定橫屏或者豎屏?

  有些人討厭玩手機的時候橫豎屏來回的切換,有些應用也限定了應用程序只使用橫屏或者只使用豎屏,即便手機設置了「自動切換橫豎屏」。好比「水果忍者」是不能豎屏的(雙人模式除外了)

解決辦法:只須要在AndroidManifest.xml的Activity標籤中加入:android:screenOrientation="landscape"

android:screenOrientation="landscape"表示橫屏
或
android:screenOrientation="protrait"表示豎屏

這樣,所設定的應用程序就只能是橫屏或者豎屏了

三,橫豎屏切換時關於Activity從新載入的問題(onConfigurationChanged()方法)

例如上面的那個例子,Activity每次橫豎屏切換的時候是從新載入的,可是好比咱們在玩遊戲的時候切換了一下屏幕,咱們不可能要從新玩起,因此須要有一種解決橫豎屏切換的時候保存當前狀態,不用從新載入的方法

解決方案:可使用onConfigurationChanged方法,該方法能夠在用戶切換橫豎屏的時候就不用從新執行onCreate方法了

提醒:這個方法的使用場景好比播放影音的時候轉換了一下屏幕,若是是分別設置了兩個佈局的話,那麼橫豎屏要對應不一樣佈局,也意味着仍是要執行onCreate方法,因此佈局最好是一個(不知對不對,求高手指點)

一、須要在AndroidManifest.xml中的對應的activity標籤里加入

android:configChanges="orientation|keyboardHidden"

這條語句的意思是:橫豎屏切換或者實體鍵盤推出合上的時候配置信息的改變

二、須要在AndroidManifest.xml中加入權限

<uses-permission android:name="andorid.permission.CHANGE_CONFIGURATION"/>

三、須要在橫豎屏切換時共用的那個Activity裏覆蓋onConfigurationChanged方法,以下

複製代碼
@Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub         super.onConfigurationChanged(newConfig);
        if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
        {
            Toast.makeText(getApplicationContext(), "切換爲橫屏", Toast.LENGTH_SHORT).show();
        }else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
        {
            Toast.makeText(getApplicationContext(), "切換爲豎屏", Toast.LENGTH_SHORT).show();
        }
    }
複製代碼

這裏須要說的事,代碼中的if語句是判斷當前設備是橫屏仍是豎屏,而後有其對應的操做。以前居然在屏幕切換的時候設置不一樣的佈局,雖然可以顯示不一樣的佈局,可是這個方法就已經毫無心義了,由於橫豎屏切換到不一樣的佈局咱們能夠用上面的第一種方法,而這種最好只是對應一個佈局吧,而後在裏面進行橫豎屏時候的其餘操做,防止了從新載入

下面仍是看一個例子吧,下面的是一個播放rtsp流的的例子

複製代碼
package com.loulijun.demo07;import android.app.Activity;import android.content.res.Configuration;import android.net.Uri;import android.os.Bundle;import android.view.Window;import android.view.WindowManager;import android.widget.Toast;import android.widget.VideoView;public class Demo07Activity extends Activity {
    private VideoView video;
    private String rtspUrl = "rtsp://218.205.231.149:554/mobile/1/2CBE124B67C85A59/48f313651199829e.sdp?id=guest&t=1305313158&en=f2ed024c7963e179f65c65689fdd9887&rs=wap";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        video = (VideoView)findViewById(R.id.play);
        video.setVideoURI(Uri.parse(rtspUrl));
        video.requestFocus();
        video.start();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub         super.onConfigurationChanged(newConfig);
        if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
        {
            Toast.makeText(getApplicationContext(), "切換爲橫屏", Toast.LENGTH_SHORT).show();
        }else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
        {
            Toast.makeText(getApplicationContext(), "切換爲豎屏", Toast.LENGTH_SHORT).show();
        }
    }
    
    
}
複製代碼

main.xml

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <VideoView 
        android:id="@+id/play"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />

</LinearLayout>
複製代碼

這裏須要說一下VideoView的全屏顯示的問題,橫屏後右邊老是空出一塊黑色區域,即便經過WindowManager的方式也不能解決,索性只能設置佈局爲居中顯示了,至少好看些

因此只是在清單文件中加入了樣式:android:theme="@android :style/Theme.NoTitleBar.Fullscreen"

這種方式在播放視頻的時候不能全屏,但願大牛們能夠提出本身的解決方案
AndroidManifest.xml

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.loulijun.demo07"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden"  android:theme="@android :style/Theme.NoTitleBar.Fullscreen"             android:name=".Demo07Activity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    <uses-permission android:name="andorid.permission.CHANGE_CONFIGURATION"/>  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  <uses-permission android:name="android.permission.INTERNET"/> </manifest>
複製代碼

看看運行效果吧

      

文章精選:

http://www.blogjava.net/zh-weir/archive/2010/01/24/310617.html

http://www.cnblogs.com/hibraincol/archive/2010/09/18/1829862.html

http://hi.baidu.com/gaogaf/blog/item/6ef7184c3b20bff6d72afc2a.html

分類:  Android雜談
相關文章
相關標籤/搜索