1. Java

Android GridLayout 自適應

最近趁著學習安卓開發,順便將去年暑假就想寫的Loan項目快速構建一下。想寫個菜單界面。決定用網格佈局試一試,但是網友普遍對網格佈局不看好。可能是因爲早期的網格佈局不支持權重的原因吧?總之今天就記錄一下我的踩坑過程。

首先看一下xml佈局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MenuActivity"
    android:orientation="horizontal"
    android:background="#EEEEEE">

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:columnCount="3">


        <Button
            android:id="@+id/contract_btu"
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/selector_contract" />

        <Button
            android:id="@+id/invoice_btu"
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/selector_invoice" />

        <Button
            android:id="@+id/record_btu"
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/selector_record" />

        <TextView
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:text="我的合同" />

        <TextView
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:text="借據詳情" />

        <TextView
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:text="還款記錄" />

        <Button
            android:id="@+id/planning_btu"
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/selector_planning" />

        <Button
            android:id="@+id/software_btu"
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/selector_software" />

        <Button
            android:id="@+id/more_btu"
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/selector_more" />

        <TextView
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:text="還款計劃" />

        <TextView
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:text="軟件信息" />

        <TextView
            android:layout_width="0dp"
            android:layout_columnWeight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:text="更多工具" />
    </GridLayout>

</FrameLayout>

如左圖所示,采用三列的網格,行數沒有固定,其中圖標和圖標下面的文字是等價的,都屬於網格裏面的元素。其中的關鍵點就是將所有網格中的元素列權重全部設置為1,讓它們權重一隻。還有就是設置

android:layout_width="0dp"

此屬性是將控件的佈局寬度設置為0,這樣網格佈局就可以等距自適應的排列内部的控件了。

———分割綫————-

順便提一下,在寫還貸計劃這個子Actively的時候發現Android沒有什麽好用的表格控件,看了幾個github上面的開源項目感覺有點複雜。這是我突然想到了上次折騰小説項目使用的WebView,正好我從銀行下載了計劃的csv文件,於是直接用csv2html將計劃轉成了html的table表格。然後使用Android的assets將其存儲,最終通過webview展示出來,感覺顯示效果還是蠻不錯的。

這次App和服務器之間的數據傳輸我封裝了一個API,數據格式是JSON,還加了一個TOKEN作爲簡單的校驗,不過論安全性還是RSA,AES來的舒服啊。

再説還準備改進的地方就是okhttp的多綫程問題,還有就是從服務器獲取的數據持久化本地sqlite數據庫的問題有待解決。最後一個目前能想到的容易實現的就是檢查升級功能。