成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Activity橫豎屏切換-創(chuàng)新互聯(lián)

默認(rèn)情況下,當(dāng)“屏幕方向”或“鍵盤顯示隱藏” 變化時(shí)都會(huì)銷毀當(dāng)前Activity,創(chuàng)建新的Activity。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出嶧城免費(fèi)做網(wǎng)站回饋大家。

如果不希望重新創(chuàng)建Activity實(shí)例,可以按如下配置Activity:

<activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation">

注意Android3.2橫豎屏幕切換時(shí)以上配置configChanges要加上screenSize,要不還會(huì)調(diào)用onCreate

<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize"/>

上面的android:configChanges屬性指定了要捕獲“屏幕方向”和“鍵盤顯示隱藏”變化,

當(dāng)捕獲到這些變化后會(huì)調(diào)用Activity的onConfigurationChanged()方法。

默認(rèn)情況下(沒有配置android:configChanges屬性):

豎屏切橫屏,銷毀當(dāng)前Activity之后,創(chuàng)建一個(gè)新Activity實(shí)例。

橫屏切豎屏,銷毀當(dāng)前Activity之后,創(chuàng)建一個(gè)新Activity實(shí)例,新的Activity實(shí)例很快就被銷毀,接著又會(huì)創(chuàng)建一個(gè)新Activity實(shí)例。如果只希望創(chuàng)建一個(gè)實(shí)例,可以配置android:configChanges="orientation"

  <activity

    android:screenOrientation="portrait"  //豎屏

    android:screenOrientation="landscape"  //橫屏

  />

上述修改也可以在Java代碼中通過(guò)類似如下代碼來(lái)設(shè)置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

android:screenOrientation屬性

他有以下幾個(gè)參數(shù):

  "unspecified":默認(rèn)值 由系統(tǒng)來(lái)判斷顯示方向.判定的策略是和設(shè)備相關(guān)的,所以不同的設(shè)備會(huì)有不同的顯示方向.

  "landscape":橫屏顯示(寬比高要長(zhǎng))

  "portrait":豎屏顯示(高比寬要長(zhǎng))

  "user":用戶當(dāng)前選的方向

  "behind":和該Activity下面的那個(gè)Activity的方向一致(在Activity堆棧中的)

  "sensor":有物理的感應(yīng)器來(lái)決定。如果用戶旋轉(zhuǎn)設(shè)備這屏幕會(huì)橫豎屏切換。

  "nosensor":忽略物理感應(yīng)器,這樣就不會(huì)隨著用戶旋轉(zhuǎn)設(shè)備而更改了("unspecified"設(shè)置除外)。

APP的橫豎屏切換手動(dòng)觸發(fā)

  由上面描述可知,當(dāng)android:screenOrientation為默認(rèn)值"unspecified"或"sensor"等時(shí),就會(huì)有系統(tǒng)根據(jù)設(shè)備的旋轉(zhuǎn)情況來(lái)觸發(fā)橫豎屏的切換,那么有沒有方法我們手動(dòng)在程序中觸發(fā)橫豎屏的變換呢,顯然上面為我們提供的setRequestedOrientation就是系統(tǒng)提供的一個(gè)入口,下面我們給出一個(gè)按鍵的方式來(lái)觸發(fā)的案列:

  public class MainActivity extends Activity implements OnClickListener {

    private Button mBtnLandscape;

    private Button mBtnPortrait;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      mBtnLandscape = (Button) findViewById(R.id.but_landscape);

      mBtnPortrait = (Button) findViewById(R.id.but_portrait);

      mBtnLandscape.setOnClickListener(this);

      mBtnPortrait.setOnClickListener(this);

    }

    @Override

    public void onClick(View v) {

      if(v == mBtnLandscape){

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

      }else{

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

      }

    }

    @Override

    public void onConfigurationChanged(Configuration newConfig) {

      super.onConfigurationChanged(newConfig);

      String message=newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE ? "屏幕設(shè)置為:橫屏" : "屏幕設(shè)置為:豎屏";

      Toast.makeText(this, message, Toast.LENGTH_LONG).show();

    }

  }

  需要注意的是,手動(dòng)調(diào)用時(shí),無(wú)視AndroidManifest中關(guān)于screenOrientation的設(shè)置;另外上述代碼中的onConfigurationChanged要被調(diào)用到也是需要條件的,在這里,只給代碼,不做討論,后面再給出一個(gè)相關(guān)的補(bǔ)充說(shuō)明。

重啟Activity的橫豎屏切換

  在上面的案列中,缺省狀態(tài)下,Activity每次橫豎屏切換(包括用setRequestedOrientation調(diào)用)都會(huì)重新調(diào)用一輪onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,從而銷毀原來(lái)的Activity對(duì)象,創(chuàng)建新的Activity對(duì)象,這是因?yàn)橥ǔG闆r下軟件在橫豎屏之間切換,界面的高寬會(huì)發(fā)生轉(zhuǎn)換,從而可能會(huì)要求不同的布局。具體的布局切換可以通過(guò)如下兩種方法來(lái)實(shí)現(xiàn):

  1)在res目錄下建立layout-land和layout-port目錄,相應(yīng)的layout文件名不變,比如都為main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時(shí)模擬器自動(dòng)尋找main.xml文件。

  2)假如布局資源是不一樣又不按照如上設(shè)置,則需要通過(guò)java代碼來(lái)判斷當(dāng)前是橫屏還是豎屏然后來(lái)加載相應(yīng)的xml布局文件(比如mainP為豎屏mainL為橫屏)。因?yàn)楫?dāng)屏幕變?yōu)闄M屏的時(shí)候,系統(tǒng)會(huì)重新呼叫當(dāng)前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來(lái)檢查當(dāng)前的方向,然后可以讓你的setContentView來(lái)載入不同的layout xml。

  @Override

  protected void onCreate(Bundle icicle) {

   super.onCreate(icicle);

   int mCurrentOrientation = getResources().getConfiguration().orientation;

   if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {

     Log.i("info", "portrait"); // 豎屏

     setContentView(R.layout.mainP);

   } else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {

     Log.i("info", "landscape"); // 橫屏

     setContentView(R.layout.mainL);

   }

   init();//初始化,賦值等操作

   findViews();//獲得控件

   setListensers();//設(shè)置控件的各種監(jiān)聽方法

  }

  上面只是對(duì)布局切換做了描述,實(shí)際上由于重啟Activity在未加處理的情況下必然導(dǎo)致數(shù)據(jù)的丟失和重新獲取,這樣用戶體驗(yàn)會(huì)非常差。為此就要在切換前對(duì)數(shù)據(jù)進(jìn)行保存,切換重啟后對(duì)數(shù)據(jù)進(jìn)行恢復(fù),具體操作的步驟如下:

  重寫Activity.onRetainNonConfigurationInstance(),用戶橫豎屏切換前保存數(shù)據(jù)

  @Override

  public Object onRetainNonConfigurationInstance() {

    final MyDataObject data = collectMyLoadedData();

    return data;

  }

  在onCreate()函數(shù)中調(diào)用getLastNonConfigurationInstance(),獲取onRetainNonConfigurationInstance()保存的數(shù)據(jù)

  @Override

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();

    if (data == null) {

      data = loadMyData();

    }

    ...

  }

非重啟Activity的橫豎屏切換

  雖然重啟Activity為我們提供了保存數(shù)據(jù)和讀取數(shù)據(jù)的方式,但是如此一來(lái)程序會(huì)顯得有些繁瑣,所以有時(shí)候程序員往往就不想讓Activity重啟,Android也為我們提供了解決方案,就是通過(guò)onConfigurationChanged攔截橫豎屏變換,從而進(jìn)行必要的重新布局和切換操作。操作步驟如下:

  首先,manifest中為相應(yīng)的Activity設(shè)置android:configChanges屬性,從而讓Activity不延續(xù)上述的重建流程,具體如下:

  Andorid 3.2以前的SDK可以使用如下配置

  android:configChanges="orientation|keyboardHidden"

  而Adnroid 3.2以后的SDK必須添加一個(gè)screenSize屬性,具體如下

  android:configChanges="keyboardHidden|orientation|screenSize"

  或者

  android:configChanges="orientation|screenSize"

  其次,在Activity或View的onConfigurationChanged(Configuration newConfig)函數(shù)中獲取當(dāng)前橫豎屏參數(shù)。至于其調(diào)用順序跟touch事件的傳遞順序相似,不過(guò)他沒有消費(fèi)事件的概念,會(huì)順次調(diào)用到每一個(gè)onConfigurationChanged函數(shù)。下面是重寫Activity的例子:

  //布局分別在layout-land和layout-port目錄中的同名main.xml時(shí)

  @Override

  public void onConfigurationChanged (Configuration newConfig){

    super.onConfigurationChanged(newConfig);

    setContentView(R.layout.main);

    //注意,這里刪除了init(),否則又初始化了,狀態(tài)就丟失

    findViews();

    setListensers();

  }

  //布局為不按照l(shuí)ayout-land和layout-port目錄,而自定義名字時(shí)

  @Override

  public void onConfigurationChanged (Configuration newConfig){

    super.onConfigurationChanged(newConfig);

    int mCurrentOrientation = getResources().getConfiguration().orientation;

    if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {

      setContentView(R.layout.mainP);

      //注意,這里刪除了init(),否則又初始化了,狀態(tài)就丟失

      findViews();

      setListensers();

    } else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {

      setContentView(R.layout.mainL);

      //注意,這里刪除了init(),否則又初始化了,狀態(tài)就丟失

      findViews();

      setListensers();

    }

  }

  當(dāng)然有時(shí)候連布局都不用更改的話,就可以直接對(duì)原有控件進(jìn)行調(diào)用操作了,比如:

  public class MainActivity extends Activity {

    private TextView textView;

    @Override

    public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

      Log.i("--Main--", "onCreate");

      textView=(TextView)findViewById(R.id.tv_id);

    }

    @Override

    public void onConfigurationChanged(Configuration newConfig) {

      super.onConfigurationChanged(newConfig);

      Log.i("--Main--", "onConfigurationChanged");

      if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

        textView.setText("當(dāng)前屏幕為橫屏");

      }else{

        textView.setText("當(dāng)前屏幕為豎屏");

      }

    }

  }

  需要注意的是,onConfigurationChanged函數(shù)中只能獲得橫豎屏切換后的參數(shù),在該函數(shù)中獲取不到新的Layout和控件的尺寸位置信息,如果要處理尺寸和位置信息,必須通過(guò)消息異步或者延時(shí)調(diào)用,下面是一個(gè)App在橫豎屏切換時(shí)需要重新設(shè)置popupWindow位置的代碼:

  @Override

  protected void onConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

    //View中不用創(chuàng)建Handler,可直接調(diào)用post操作

    //new Handler().postDelayed(new Runnable() {

    //   @Override

    //   public void run() {

    //     updatePopup();

    //   }

    //}, 500);

    postDelayed(new Runnable() {

      @Override

      public void run() {

        updatePopup();    //

      }

    }, 500);//如果不在post中,而是直接調(diào)用,那么彈出位置就會(huì)有問(wèn)題

  }

  雖然上面沒有看到對(duì)布局的顯式調(diào)用進(jìn)行重新布局,照理控件的對(duì)象沒有被銷毀,但是控件在橫豎屏切換時(shí)應(yīng)該是需要進(jìn)行重新layout和measure,然后再進(jìn)行重繪的,否則不會(huì)引發(fā)彈出框位置的變化,至于如何調(diào)用重新layout、measure和Draw操作,在這里就不多展開了。

自適應(yīng)橫豎屏

如果想讓它啟動(dòng)的時(shí)候是橫屏的話就橫屏表示,縱屏的話就縱屏表示,然后手機(jī)切換橫豎屏就不能用了該怎么解決呢?

首先:在Mainfest.xml中追加

android:screenOrientation="sensor"android:configChanges="orientation|keyboardHidden"這兩個(gè)屬性。

第二步:取得屏幕的長(zhǎng)和寬,進(jìn)行比較設(shè)置橫豎屏的變量。

  Display display = getWindowManager().getDefaultDisplay();

  int width = display.getWidth();

  int height = display.getHeight();

  if (width > height) {

    orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

  } else {

    orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

  }

第三步:在onConfigurationChanged()函數(shù)中追加this.setRequestedOrientation(orientation)就行了

  @Override

  public void onConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

    this.setRequestedOrientation(mOrientation);

  }

但是這樣的話你切到別的畫面的時(shí)候再回到原畫面,它就仍然是橫的或者是縱的。怎么讓它從別的屏幕回來(lái)后,又重新橫豎屏布局呢?

只要在OnResume()中在設(shè)定下就行了。但是這個(gè)只支持橫豎屏只有一個(gè)layout的。橫豎屏分別對(duì)應(yīng)layout的還不知道該怎么解決。

  @Override

  protected void onResume() {

    mOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;

    this.setRequestedOrientation(mOrientation);

    Display display = getWindowManager().getDefaultDisplay();

    int width = display.getWidth();

    int height = display.getHeight();

    if (width > height) {

      mOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

    } else {

      mOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

    }

    super.onResume();

  }

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱:Activity橫豎屏切換-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article44/digsee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)App設(shè)計(jì)、網(wǎng)站排名靜態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
景宁| 西林县| 凌海市| 略阳县| 大同县| 溧阳市| 敦化市| 北安市| 新晃| 廉江市| 韶山市| 沅陵县| 滁州市| 廉江市| 循化| 平乡县| 资源县| 万荣县| 衡南县| 彰化县| 宜阳县| 马山县| 旬阳县| 洛扎县| 镶黄旗| 保德县| 阿城市| 双江| 峡江县| 开封市| 宿迁市| 登封市| 逊克县| 沿河| 科技| 新安县| 正定县| 堆龙德庆县| 锡林郭勒盟| 综艺| 高要市|