1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Activity橫豎屏切換

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

      創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的做網(wǎng)站、成都做網(wǎng)站質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式營銷型網(wǎng)站需求,讓再小的成都品牌網(wǎng)站建設(shè)也能產(chǎn)生價值!

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

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

       

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

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

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

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

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

         

              android:screenOrientation="portrait"   //豎屏

              android:screenOrientation="landscape"   //橫屏

          />    

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

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

      android:screenOrientation屬性

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

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

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

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

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

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

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

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

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

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

              }

          }

          

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

      重啟Activity的橫豎屏切換

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

          

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

          

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

          }

          上面只是對布局切換做了描述,實際上由于重啟Activity在未加處理的情況下必然導(dǎo)致數(shù)據(jù)的丟失和重新獲取,這樣用戶體驗會非常差。為此就要在切換前對數(shù)據(jù)進(jìn)行保存,切換重啟后對數(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ù)的方式,但是如此一來程序會顯得有些繁瑣,所以有時候程序員往往就不想讓Activity重啟,Android也為我們提供了解決方案,就是通過onConfigurationChanged攔截橫豎屏變換,從而進(jìn)行必要的重新布局和切換操作。操作步驟如下:

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

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

          android:configChanges="orientation|keyboardHidden"

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

          android:configChanges="keyboardHidden|orientation|screenSize"

          或者

          android:configChanges="orientation|screenSize"

          

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

          

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

          

          @Override

          public void onConfigurationChanged (Configuration newConfig){

              super.onConfigurationChanged(newConfig);

              setContentView(R.layout.main);

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

              findViews();

              setListensers();

          }

          

          //布局為不按照layout-land和layout-port目錄,而自定義名字時

          @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)然有時候連布局都不用更改的話,就可以直接對原有控件進(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和控件的尺寸位置信息,如果要處理尺寸和位置信息,必須通過消息異步或者延時調(diào)用,下面是一個App在橫豎屏切換時需要重新設(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)用,那么彈出位置就會有問題

          }

          

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

      自適應(yīng)橫豎屏

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

      首先:在Mainfest.xml中追加

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

      第二步:取得屏幕的長和寬,進(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);  

          }  

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

      只要在OnResume()中在設(shè)定下就行了。但是這個只支持橫豎屏只有一個layout的。橫豎屏分別對應(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ǎng)站名稱:Activity橫豎屏切換
      網(wǎng)頁地址:http://www.ef60e0e.cn/article/pdgcde.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        南漳县| 景洪市| 全南县| 丹巴县| 茶陵县| 巍山| 淳安县| 金寨县| 高陵县| 安新县| 元朗区| 衡南县| 敖汉旗| 南涧| 雅安市| 喀喇沁旗| 勐海县| 安陆市| 望都县| 柳林县| 清涧县| 扬州市| 本溪市| 辽阳县| 固始县| 廉江市| 安康市| 县级市| 华亭县| 和硕县| 绥化市| 廊坊市| 阳泉市| 增城市| 勃利县| 道孚县| 故城县| 抚顺县| 平湖市| 沈阳市| 泽库县|