1. 程式人生 > >Android手機平板兩不誤,使用Fragment實現相容手機和平板的程式

Android手機平板兩不誤,使用Fragment實現相容手機和平板的程式

記得我之前參與開發過一個華為的專案,要求程式可以支援好幾種終端裝置,其中就包括Android手機和Android Pad。然後為了節省人力,公司無節操地讓Android手機和Android Pad都由我們團隊開發。當時專案組定的方案是,製作兩個版本的App,一個手機版,一個Pad版。由於當時手機版的主體功能已經做的差不多了,所以Pad版基本上就是把手機版的程式碼完全拷過來,然後再根據平板的特性部分稍作修改就好了。

但是,從此以後我們就非常苦逼了。每次要新增什麼新功能,同樣的程式碼要寫兩遍。每次要修復任何bug,都要在手機版程式碼和Pad版程式碼裡各修改一遍。這還不算什麼,每到出版本的時候就更離譜了。華為要求每次需要出兩個版本,一個華為內網環境的版本,一個客戶現場的版本,而現在又分了手機和Pad,也就是每次需要出四個版本。如果在出完版本後自測還出現了問題,就可以直接通宵了。這尤其是苦了我們的X總(由於他dota打的比較好,我都喜歡叫他X神)。他在我們專案組中單獨維護一個模組,並且每次打版本都是由他負責,加班的時候我們都能跑,就是他跑不了。這裡也是讚揚一下我們X神的敬業精神,如果他看得到的話。

經歷過那麼苦逼時期的我也就開始思考,可不可以製作同時相容手機和平板的App呢?答案當然是肯定的,不過我這個人比較懶,一直也提不起精神去鑽研這個問題。直到我一個在美國留學的朋友Gong讓我幫她解決她的研究生導師佈置的作業(我知道你研究生導師看不懂中文 ^-^),正好涉及到了這一塊,也就藉此機會研究了一下,現在拿出來跟大家分享。

我們先來看一下Android手機的設定介面,點選一下Sound,可以跳轉到聲音設定介面,如下面兩張圖所示:

           

然後再來看一下Android Pad的設定介面,主設定頁面和聲音設定頁面都是在一個介面顯示的,如下圖所示:


如果這分別是兩個不同的App做出的效果,那沒有絲毫驚奇之處。但如果是同一個App,在手機上和平板上執行分別有以上兩種效果的話,你是不是就已經心動了?我們現在就來模擬實現一下。

首先你需要對Fragment有一定的瞭解,如果你還沒接觸過Fragment,建議可以先閱讀 Android Fragment完全解析,關於碎片你所需知道的一切 這篇文章。並且本次的程式碼是執行在Android 4.0版本上的,如果你的SDK版本還比較低的話,建議可以先升升級了。

新建一個Android專案,取名叫FragmentDemo。開啟或新建MainActivity作為程式的主Activity,裡面有如下自動生成的內容:

  1. publicclass MainActivity extends Activity {  
  2.     @Override
  3.     publicvoid onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_main);  
  6.     }  
  7. }  
作為一個Android老手,上面的程式碼實在太小兒科了,每個Activity中都會有這樣的程式碼。不過今天我們的程式可不會這麼簡單,載入佈局這一塊還是大有文章的。

開啟或新建res/layout/activity_main.xml作為程式的主佈局檔案,裡面程式碼如下:

  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="horizontal"
  6.     tools:context=".MainActivity">
  7.     <fragment
  8.         android:id="@+id/menu_fragment"
  9.         android:name="com.example.fragmentdemo.MenuFragment"
  10.         android:layout_width="fill_parent"
  11.         android:layout_height="fill_parent"
  12.         />
  13. </LinearLayout>
這個佈局引用了一個MenuFragment,我們稍後來進行實現,先來看一下今天的一個重點,我們需要再新建一個activity_main.xml,這個佈局檔名和前面的主佈局檔名是一樣的,但是要放在不同的目錄下面。

在res目錄下新建layout-large目錄,然後這個目錄下建立新的activity_main.xml,加入如下程式碼:

  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="horizontal"
  6.     android:baselineAligned="false"
  7.     tools:context=".MainActivity"
  8.     >
  9.     <fragment
  10.         android:id="@+id/left_fragment"
  11.         android:name="com.example.fragmentdemo.MenuFragment"
  12.         android:layout_width="0dip"
  13.         android:layout_height="fill_parent"
  14.         android:layout_weight="1"
  15.         />
  16.     <FrameLayout
  17.         android:id="@+id/details_layout"
  18.         android:layout_width="0dip"
  19.         android:layout_height="fill_parent"
  20.         android:layout_weight="3"
  21.         ></FrameLayout>
  22. </LinearLayout>

這個佈局同樣也引用了MenuFragment,另外還加入了一個FrameLayout用於顯示詳細內容。其實也就是分別對應了平板介面上的左側佈局和右側佈局。

這裡用到了動態載入佈局的技巧,首先Activity中呼叫 setContentView(R.layout.activity_main) ,表明當前的Activity想載入activity_main這個佈局檔案。而Android系統又會根據當前的執行環境判斷程式是否執行在大螢幕裝置上,如果執行在大螢幕裝置上,就載入layout-large目錄下的activity_main.xml,否則就預設載入layout目錄下的activity_main.xml。

下面我們來實現久違的MenuFragment,新建一個MenuFragment類繼承自Fragment,具體程式碼如下:

  1. publicclass MenuFragment extends Fragment implements OnItemClickListener {  
  2.     /** 
  3.      * 選單介面中只包含了一個ListView。 
  4.      */
  5.     private ListView menuList;  
  6.     /** 
  7.      * ListView的介面卡。 
  8.      */
  9.     private ArrayAdapter<String> adapter;  
  10.     /** 
  11.      * 用於填充ListView的資料,這裡就簡單隻用了兩條資料。 
  12.      */
  13.     private String[] menuItems = { "Sound""Display" };  
  14.     /** 
  15.      * 是否是雙頁模式。如果一個Activity中包含了兩個Fragment,就是雙頁模式。 
  16.      */
  17.     privateboolean isTwoPane;  
  18.     /** 
  19.      * 當Activity和Fragment建立關聯時,初始化介面卡中的資料。 
  20.      */
  21.     @Override
  22.     publicvoid onAttach(Activity activity) {  
  23.         super.onAttach(activity);  
  24.         adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, menuItems);  
  25.     }  
  26.     /** 
  27.      * 載入menu_fragment佈局檔案,為ListView綁定了介面卡,並設定了監聽事件。 
  28.      */
  29.     @Override
  30.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  31.         View view = inflater.inflate(R.layout.menu_fragment, container, false);  
  32.         menuList = (ListView) view.findViewById(R.id.menu_list);  
  33.         menuList.setAdapter(adapter);  
  34.         menuList.setOnItemClickListener(this);  
  35.         return view;  
  36.     }  
  37.     /** 
  38.      * 當Activity建立完畢後,嘗試獲取一下佈局檔案中是否有details_layout這個元素,如果有說明當前 
  39.      * 是雙頁模式,如果沒有說明當前是單頁模式。 
  40.      */
  41.     @Override
  42.     publicvoid onActivityCreated(Bundle savedInstanceState) {  
  43.         super.onActivityCreated(savedInstanceState);  
  44.         if (getActivity().findViewById(R.id.details_layout) != null) {  
  45. 相關推薦

    Android手機平板使用Fragment實現相容手機平板程式

    記得我之前參與開發過一個華為的專案,要求程式可以支援好幾種終端裝置,其中就包括Android手機和Android Pad。然後為了節省人力,公司無節操地讓Android手機和Android Pad都由我們團隊開發。當時專案組定的方案是,製作兩個版本的App

    備份校驗MySQL自動備份還原校驗設計詳解

    作者介紹 龐闊,優朋普樂傳媒運維基礎部經理。負責資料庫運營管理及平臺設計開發,監控設計改進,問題跟蹤處理,機房網路維護管理,目前四個專利已在專利局申請中。擅長資料庫運維管理及Shell、Perl、PHP編寫。 背景 最近關於資料庫故障出現的問題較多,不論大小公司對資料的備份要求都很高,但對校驗資料備

    stub skeleton 的講解自己實現一個stubskeleton程式

    RMI的本質就是實現在不同JVM之間的呼叫,它的實現方法就是在兩個JVM中各開一個Stub和Skeleton,二者通過socket通訊來實現引數和返回值的傳遞。      有關RMI的例子程式碼網上可以找到不少,但絕大部分都是通過extend the interface java.rmi.Remote實現,

    幾分鐘教你做個原創視頻賺錢引流

    模板現在原創視頻不可謂不火。未來幾年,短視頻創業、營銷、引流、都蘊藏著巨大的市場機會。分享一些小套路、賺錢,引流必備小技巧。舉牌照大家都見過,前段時間非洲兒童的舉牌照可謂火了一把,有些人靠這個賺的盆缽滿盈。但有些明星、美女的舉牌照,雖然大家都見過,一般微商用的比較多,不知道的以為是某某大品牌微商代理真的把人請

    智慧選擇美食健康的節日飲食指南

    阿里巴巴官方釋出微博稱,連續幾日,一篇名為《阿里員工透露:馬總早移走 1200 億人民幣!網友:不愧是老師》的文章被有組織的進行惡意傳播。阿里巴巴官方釋出微博稱,連續幾日,一篇名為《阿里員工透露:馬總早移走 1200 億人民幣!網友:不愧是老師》的文章被有組織的進行惡意傳播。 對此,阿里表示,該文完全捏造事

    解決Unity中使用Ngui 的預設字型Arial在部分Android裝置顯示中文清楚或者顯示出來問題

    Unity工程中的動態字型使用很方便,在一開始的工程中,為了減小遊戲包的大小,我們使用的是Unity內建的預設Arial字型,但是在遊戲上線測試後,很多玩家反饋個別機型字型顯示不完全,主要集中在 小米1代,OPPO,金立,中興等個別機型中。剛開始以為是NGUI的問題,

    Android Dialog點選按鈕關閉控制視窗的顯示關閉

    想象一下這樣的一個情景:彈出一個對話方塊,裡面可以編輯sql語句,編輯好以後點選確定按鈕,執行sql,此時對話方塊也會消失。如果sql順利執行,這種互動還是很不錯的。但是一旦sql執行出錯,對話方塊還是會關閉,對話方塊中的sql也就沒有了,只能重新編輯。如果sql很複雜,那

    看球學習 看世界盃 學面向物件

      java零基礎入門-面向物件篇(三) 類和物件 (上) 前面的基礎打的差不多了,基礎部分其實很多語言都大同小異,但是接下來的可是面嚮物件語言獨有的知識了,這是java中最核心最重要的部分,沒有之一。關於面向物件的一些概念,我在前面有篇文章簡單的提了一下,沒看過的同學快

    Android--Fragment 實現懶載入重複載入

    基類: package fragment; import android.support.v4.app.Fragment; import android.view.View; /** * Cr

    “糞便銀行”:救人拿錢 A Poop Bank in Massachusetts Will Pay You $40 Every Day

    “糞便銀行”:救人拿錢兩不誤 如果你年齡小於50歲,排便規律,而且願意每天去美國麻省麥德福德跑一趟,那麼沒準你可以每天得到40美元的外快,而你需要做的事情只是生產便便。  要想得到這筆收入,請拜訪“開放生物群”(OpenBiome)。它是全美唯一的獨立非營利性“糞便銀行”,初建於2012年,由麻省理工學

    相看惟有敬亭山

     在工作中溝通是每個新人都會遇到的問題,而溝通中傾聽又是基礎,所以如何準確的明白別人說的什麼,並且精確的執行是一件非常重要的事情。下面就是我這段時間以來所感悟到的經驗: 1、必須對要談論的話題有一定了解。“預則立,不預則廢”,如果所談論的話題你一點都不瞭解,那麼談話還如何繼續

    小程序開發-生活娛樂

    src info 小程序 分享圖片 alt 分享 程序開發 .com img 小程序開發-生活娛樂兩不誤

    一個數組中只有個數字是出現一次其他所有數字都出現了次。 找出這個數字程式設計實現

    1.一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 #include<stdio.h> #include<stdio.h> int main() { int arr[] = { 1, 3, 8, 1,

    年Java你憑什麼要15k?程式設計師:這就嫉妒了?白菜價好吧

    昨天小編看到一位網友寫了一篇短文,結合網友們的評論,還是還挺有意思的。所以拿來和大家分享下:兩年Java,你憑什麼問公司要15k?憑學歷?還是憑長相?Java的基礎你確定你都滾瓜爛熟了嗎?資料結構你確定你都會了嗎?前端程式碼你確定你上手就能寫了嗎?半個小時內搭好一套簡易的SS

    Android列表載入更多資料實現點贊

    MainActivity package com.gz.test_listview; import android.app.Activity; import android.content.Intent; import android.os.Bundle

    對程式碼滿足是任何真正有天才的程式設計師的根本特徵。

    1.安裝的系統redhat6.0 2.安裝openssl [[email protected]  openca] tar -zxvf openssl-1.0.1c.tar.gz [[email protected]  openca] cd openssl

    【C語言】一個數組中只有個數字是出現一次其他所有數字都出現了次。 找出這個數字程式設計實現

    一看到這道題,我想到了之前學習過的異或。我們知道兩個相同的數字異或的結果是 0,因為在計算機中,異或運算是按照二進位制位來運算的,相同為 0 ,相異為  1。任何數與 0 異或都等於它自己。既然我們要找出來一組數中不同的兩個數字,也可以採用這種方法。 但是這次不是直接異或,

    結合TabViewPagerFragment實現簡單分頁滑動

    在APP設計當中,使用ViewPager和Fragment來實現分頁滑動並不少見,該設計可以利用少量的空間來實現多內容的展示。效果圖如下: 以下是實現該功能的程式碼: MainActivity public class MainActivity e

    PHP的strtolower()strtoupper()函式在安裝非中文系統的伺服器下可能會導致將漢字轉換為亂碼請寫個替代的函式實現相容Unicode文字的字串大小寫轉換

    最近看到一個比較有意思的問題,如題。 首先檢視php函式的實現原始碼,以strtolower為例,原始碼如下 c = (unsigned char *)s; e = c+len; // 遍歷s,逐個變為小寫 while (c < e) {   *c

    Android自定義View之導航欄(Fragment實現)

    安卓輕量級底部導航欄 目前安卓開發中常常會用到底部導航欄這個控制元件,但是自己從零開始做一個又太麻煩。因此,我封裝了一個底部導航欄,同時,也做了一些修改,用於頂部也十分合適。下面是示例圖: 使用方法: 1.新增依賴 首先,在build.gradle檔案下加入 maven