1. 程式人生 > >Framelayout佈局中巢狀多個佈局layout的顯示

Framelayout佈局中巢狀多個佈局layout的顯示

          2015已經來了快半月了,始終還是沒感受到一點新年的氣氛,但是終歸是還沒過年這對於我們來說好像也確實正常。

          目前來說自我感覺還是沉浸在年末的那種氣氛中,那就暫且年末吧。年末因為部分原因再次需要接觸Launcher的程式碼了,記得14年最開始的時候就看過一部分Launcher2的程式碼,現在重新回頭來看卻發現感觸頗多,竟然不知不覺忘掉了很多,也在看了許久之後又有點重新認識的感覺。

          迴歸正題,此次不僅僅是要修改launcher2的原始碼部分,還要加一點自己的東西,因為還是依託於原生的launcher2的原因,只是想在固有launcher2的UI架構上增加一點自己的東西,關於launcher2的UI架構部分,我也就囉嗦下再次重溫下,畢竟之前應該是沒有記錄過的。

         首先最直觀的是UI介面部分的大概分類。簡單截張圖算是湊合看看

             之所以我區分為三個區域也是出於這三個部分已經佔據了UI佈局的大部分,分別是從左到右 搜尋框/刪除框所佔區域,應用圖示/視窗小部件所佔區域,快捷功能鍵所佔區域。如果按佈局檔案launcher.xml區分就得更為細緻了。在此可以借鑑下網友解析的程式碼段

<com.android.launcher2.DragLayer
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
    android:id="@+id/drag_layer"
	...
    >

    <!-- Keep these behind the workspace so that they are not visible when
         we go into AllApps -->
    <include
        android:id="@+id/dock_divider"
	layout="@layout/workspace_divider"
        ...
	 />

    <!-- 分頁指示器 -->
    <include
        android:id="@+id/paged_view_indicator"
        layout="@layout/scroll_indicator"
        ...
	 />

    <!-- The workspace contains 5 screens of cells -->
    <com.android.launcher2.Workspace
        android:id="@+id/workspace"
        ...
        >

		<!-- 五個分屏,預設顯示cell3 -->
        <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
        <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
        <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
        <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
        <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
    </com.android.launcher2.Workspace>

	<!-- 搜尋框/刪除框 -->
    <include
        android:id="@+id/qsb_bar"
        layout="@layout/qsb_bar" />

	<!-- 顯示具體全部應用的介面,包括APPS、WIGHETS的tab標籤,以及顯示ALL APP的頁面和現實APP WIGHETS的頁面 -->
    <include layout="@layout/apps_customize_pane"
        android:id="@+id/apps_customize_pane"
        ..
	/>

	<!-- WorkSpace最下面的五個快捷位置 -->
    <include layout="@layout/hotseat"
        android:id="@+id/hotseat"
        ..
	 />

	<!-- 剛啟動的時候顯示的指導頁 -->
    <include layout="@layout/workspace_cling"
        android:id="@+id/workspace_cling"
        ...
	/>

	<!-- 是第一次進入全部應用之後顯示的指導頁 -->
    <include layout="@layout/folder_cling"
        android:id="@+id/folder_cling"
        ...
	/>
</com.android.launcher2.DragLayer>
上面部分的解析已經非常清楚明瞭了,不再解釋什麼了。

         對於launcher2的修改也就是從上面幾個地方下手了。可以看出整個launcher的佈局都是包含在com.android.launcher2.DragLayer中的,再詳細看這部分java程式碼就會明白之前一直在說對於framelayout這個佈局的最佳例項就是launcher這話並沒錯,因為launcher的原始碼才是將這個佈局的各個特點發揮的淋漓盡致了。可想而知Framelayout做出來的launcher在安卓這個平臺作為門面展示給所有人的將會有多麼全面了。

        之前一直想法是要在這個固有分割槽的基礎上增加一個自己的分割槽來增加一點自己的功能,於是果斷修改了launcher.xml佈局,並將DragLayer的外層增加了一層LinearLayout同時在這個佈局左邊增加一個LinearLayout來顯示自己的一點東西。但是這個簡單的改動編譯時有錯誤,log顯示

       Workspace can only be used in EXACTLY mode.

       跟進到PageeView.java程式碼中找到這句異常提示

        if (widthMode != MeasureSpec.EXACTLY) {
            throw new IllegalStateException("Workspace can only be used in EXACTLY mode.");
        }
        不知道出於什麼考慮要將workspace區域設定為EXACTLY模式,查了下這個模式的資料貌似必須指定width或者height的具體資料或者fill_parent,match_parent才能判定為那個模式,因為時間問題暫時就沒考慮直接註釋,果斷編譯通過,剩下的工作就是計算自己區域的寬度將剩餘區域分給workspace並指定合理的圖示排布數量launcher就基本正常了。

        再回到自己的Framelayout,因為想在自己的區域來根據不同情況顯示不同的view,因此首先想到過Fragment,但是隨後考慮再三決定不採用這個方法,因為Fragment的切換需要將呼叫Fragment顯示的主Activity繼承自FragmentAcitivity,顯然我感覺對於一個簡單的修改去改動Launcher.java的繼承關係有點過於複雜,因此想了下用FrameLayout的方式就再簡單不過了。於是在自己的LinearLayout中做了簡單的測試,首先是要在launcher佈局中加入這樣的測試佈局

           <LinearLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="horizontal" >
              <FrameLayout android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/myframelayout"
                  >
                  <include android:id="@+id/view1" layout="@layout/mylayout1"></include>
                  <include android:id="@+id/view2" layout="@layout/mylayout2"></include>
              </FrameLayout>
           </LinearLayout>
    加完這些,還需重新做另外兩個簡單的佈局,因為僅僅是測試,所以僅需要每個layout中加一個TextView即可,能區分就夠了。

    然後是在Launcher中的操作

	LayoutInflater minflater;
	View myview1;
	View myview2;
	FrameLayout myframelayout;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		minflater = getLayoutInflater();
		myview1 = (View)minflater.inflate(R.layout.mylayout1, null);
		myview2 = (View)minflater.inflate(R.layout.mylayout2, null);
		myframelayout = (FrameLayout) findViewById(R.id.myframelayout);
........
}
    此處給出了部分最終的程式碼,我之前說的view切換也就是這中巢狀的layout 的切換,我開始的做法是直接呼叫myview1.setVisibility(View.GONE)這種辦法使其隱藏或者顯示,但是我發現始終是無效的,可能如一個網友說的framelayout的特性就是分層疊加,後面的佈局會逐層疊加上去,即使View.GONE了但是依然達不到顯示另一個的效果。所以最後經過嘗試還是採用了上述程式碼在需要顯示其中一個view的時候,

myframelayout.removeAllViews();
myframelayout.addView(myview2);

      這種方法的原理很簡答就是每次需要重新顯示一個view的時候先將framelayout中的所有嵌入view都清除,然後重新將索要顯示的view顯示出來。

      後續如果需要監聽嵌入layout佈局中的按鍵響應,可以用類似myview2.findViewById(R.id.xxx)的方法找到相應id的按鍵去重寫監聽。

      到此起碼我最初想的是簡單實現了,具體的效率和隱患因為時間關係暫時沒測試,後續會繼續測試和關注。

相關推薦

Framelayout佈局佈局layout顯示

          2015已經來了快半月了,始終還是沒感受到一點新年的氣氛,但是終歸是還沒過年這對於我們來說好像也確實正常。           目前來說自我感覺還是沉浸在年末的那種氣氛中,那就暫且年末吧。年末因為部分原因再次需要接觸Launcher的程式碼了,記得14年

RecyclerView佈局,editText,解決文字輸入框上下交換位置的值問題

話不多說直接上程式碼,希望能解決你們的問題,有不理解的可以給我留言 if (((ViewHolder_a) holder).editText.getTag() instanceof TextWatc

關於html盒子浮動的問題。

//貼上程式碼 <!DOCTYPE html> <html>     <head>         <meta charset="utf-8" />         <title></title>   

Android應用的LinearLayoutRelativeLayout的佈局用法

想將Button和ListView分別放在螢幕的一左一右。 單純使用android:gravity和android:layout_gravity不成功。 於是涉及到RelativeLayout。 關鍵為:android:layout_alignParentRight="tr

在swiper使用長頁面,以及swiper時滑動卡頓、無法滑動的問題。

前言 一般而言,swiper的應用場景大多是兩種: 滿屏切換的H5頁面 pc&移動端各種樣式的輪播圖 但有的時候,面對奇怪的需求,我們需要改變,甚至讓swiper實現一些無法實現的功能。 需求 近期接到一個h5專案,主體頭部

在Popupwindow佈局ScrollView,滑動內容時檢視出現反覆閃爍的問題

解決辦法: 將顯示PopupWindow的方法由showAsDropDown()改為showAtLocation() 程式碼如下 private PopupWindow popupWind

佈局如果出現文字並且顏色背景不同,我們怎麼辦

在android 中引入 HTML 具體事例如下: String textBetInfo = new StringBuilder() .append("<font colo

安卓解決listview的itemedittext的問題

看過很多解決方式,但都會出現無法獲取焦點的問題,但合適的只有一種,並且百試不爽,下面會詳細介紹: 1、adapter裡的關鍵程式碼 有兩個edit,一個name一個price @Override public View getView(final int position, V

當scrollviewrecyclerview時如何實現整個頁面的下拉重新整理和上拉載入

最近做的一個專案中有個佈局比較複雜一點,整個頁面是個srollview裡面又嵌套了幾個recycview,剛開始是有的滑動衝突卡頓的問題,通過如下方法解決了 mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(),

解決ScrollViewRecyclerView 滑動卡頓和RecyclerView 顯示不全的問題

ScrollView巢狀RecyclerView ,滑動會卡頓,解決方法是: //防止滑動卡頓 GridLayoutManager gridLayoutManager=new GridLayoutManager(this, 4){

Android一個佈局檔案另一個佈局檔案的方法

文前:學安卓與JAVA算來已經有兩個月了,以前都是看著書本或者跟著老師打程式碼,真正自己去寫程式碼卻很少,今天自己嘗試著寫一個小專案時卻發現這樣和那樣的問題,甚至是一些小問題都要花掉兩三個小時去查資料解決,今天被一個佈局問題搞得焦頭爛額,覺得是時候該做下筆記,讓自己長長記性

Activityfragment時,onResume的處理

問題:當Activity裡有多個fragment時,其中fragmentA根據需求,需要在onResume時需要做請求資料等操作,但是如果直接在fragmentA裡的onResume裡寫東西,當從其他頁面返回到fragmentB和fragmentC時,fragmentA裡

ViewPager 不同高度的Fragment,ViewPager 高度自適應

問題: ViewPager 巢狀多個Fragment,但是每個Fragment高度不一致,導致高度比較小的Fragment底部留有大片空白區域。 解決方法: 參考文章 關於ViewPager高度自適應(隨著pager頁的高度改變Viewpager的高度)

在QTableWidgetItem 行及行高自適應

/*在一個QTableWidgetItem中設定多個Label,也可以嵌入其他型別的widget。 最後呼叫的是setCellWidget而不是setItem */ QWidget* c

table層table

因工作業務需求,需要展示一個多層巢狀的資料結構,現整理如下,分享給需要的朋友,應用框架vue2。 初始的資料結構如下: new Vue({ el:"#table1", data:{ table1:[{

android ScrollViewGridView,ListView只顯示一行的解決辦法

注:本文是由網上大神分享的解決方案彙集而成 方法一: 重寫ListView、GridView: 重寫ListView: public class MyListView extends ListView { public MyListView(Context contex

AndroidScrollViewViewPager導致ViewPager不顯示的問題

需要ScrollView中加入fillViewport屬性,同時ViewPager設定為固定高度,否則會出現,ViewPager充滿螢幕的情況  <ScrollView         android:layout_width="match_parent"      

fragmentviewpager,vierpagerfragment,不顯示 ...

現在好多應用流行一種佈局。底部幾個工具欄選項,上面也有類似tab的選項。 底部用RadioGroup控制fragment的切換。以上有五個fragment。 第一個fragment,代表著首頁。首頁又是一個類似tab的fragment,使用viewpager切換著兩

fragmentviewpager,viewpagerfragment,裡面fragment沒有顯示

fragment巢狀fragment導致裡面fragment介面沒有顯示,例子如下: private void InitViewPager(View parentView) { mPag

Recycleview實現複雜頁面 三種以上佈局 瀑布流 佈局 scrollviewrecyclerView 顯示不全 滑動衝突 之進階終極篇 (轉載)

=============================================================================================== 相信很多安卓開發的朋友,尤其是剛從事安卓開發的朋友, 當產品經理遞過來一張複雜頁面的