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,裡面有如下自動生成的內容:
- publicclass MainActivity extends Activity {
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- }
開啟或新建res/layout/activity_main.xml作為程式的主佈局檔案,裡面程式碼如下:
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="horizontal"
- tools:context=".MainActivity">
- <fragment
- android:id="@+id/menu_fragment"
- android:name="com.example.fragmentdemo.MenuFragment"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- />
- </LinearLayout>
在res目錄下新建layout-large目錄,然後這個目錄下建立新的activity_main.xml,加入如下程式碼:
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="horizontal"
- android:baselineAligned="false"
- tools:context=".MainActivity"
- >
- <fragment
- android:id="@+id/left_fragment"
- android:name="com.example.fragmentdemo.MenuFragment"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- />
- <FrameLayout
- android:id="@+id/details_layout"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="3"
- ></FrameLayout>
- </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,具體程式碼如下:
- publicclass MenuFragment extends Fragment implements OnItemClickListener {
- /**
- * 選單介面中只包含了一個ListView。
- */
- private ListView menuList;
- /**
- * ListView的介面卡。
- */
- private ArrayAdapter<String> adapter;
- /**
- * 用於填充ListView的資料,這裡就簡單隻用了兩條資料。
- */
- private String[] menuItems = { "Sound", "Display" };
- /**
- * 是否是雙頁模式。如果一個Activity中包含了兩個Fragment,就是雙頁模式。
- */
- privateboolean isTwoPane;
- /**
- * 當Activity和Fragment建立關聯時,初始化介面卡中的資料。
- */
- @Override
- publicvoid onAttach(Activity activity) {
- super.onAttach(activity);
- adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, menuItems);
- }
- /**
- * 載入menu_fragment佈局檔案,為ListView綁定了介面卡,並設定了監聽事件。
- */
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.menu_fragment, container, false);
- menuList = (ListView) view.findViewById(R.id.menu_list);
- menuList.setAdapter(adapter);
- menuList.setOnItemClickListener(this);
- return view;
- }
- /**
- * 當Activity建立完畢後,嘗試獲取一下佈局檔案中是否有details_layout這個元素,如果有說明當前
- * 是雙頁模式,如果沒有說明當前是單頁模式。
- */
- @Override
- publicvoid onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (getActivity().findViewById(R.id.details_layout) != null) {
-
相關推薦
Android手機平板兩不誤,使用Fragment實現相容手機和平板的程式
記得我之前參與開發過一個華為的專案,要求程式可以支援好幾種終端裝置,其中就包括Android手機和Android Pad。然後為了節省人力,公司無節操地讓Android手機和Android Pad都由我們團隊開發。當時專案組定的方案是,製作兩個版本的App
備份校驗兩不誤,MySQL自動備份還原校驗設計詳解
作者介紹 龐闊,優朋普樂傳媒運維基礎部經理。負責資料庫運營管理及平臺設計開發,監控設計改進,問題跟蹤處理,機房網路維護管理,目前四個專利已在專利局申請中。擅長資料庫運維管理及Shell、Perl、PHP編寫。 背景 最近關於資料庫故障出現的問題較多,不論大小公司對資料的備份要求都很高,但對校驗資料備
stub 和 skeleton 的講解,自己實現一個stub和skeleton程式
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 異或都等於它自己。既然我們要找出來一組數中不同的兩個數字,也可以採用這種方法。 但是這次不是直接異或,
結合Tab,ViewPager,Fragment實現簡單分頁滑動
在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