Android如何制作漂亮的自适布局的键盘

简介:   最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路。   这里最上面的titlebar高度固定,下面输入的金额高度也固定(当然也可以自适应),主要是中间的数字键盘,高度和宽度需要自适应。

  最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路。

  这里最上面的titlebar高度固定,下面输入的金额高度也固定(当然也可以自适应),主要是中间的数字键盘,高度和宽度需要自适应。先来张效果图:

  最常见的解决方案是用线性布局,自适应当然是按比例,但布局中无%的概念,那就要用到layout_weight了,该属性的作用是决定控件在其父布局中的显示权重(具体概念就不多说了)

  这里用一个LinearLayout 将数字键盘与下面的支付类型进行包装,然后用一个大LinearLayout包住所有的数字键盘如下图,它与下面支付类型比例是6:1,这样数字键盘就会按屏幕大小高度与宽度进行变化,每一行数字键盘用一个LinearLayout,里面包3个数字显示Button按钮。

  设置每行的LinearLayout的layout_height=0dp,layout_weight=1,具体设置如下:

 <style name="layout_input_amount_style">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">0dp</item>
        <item name="android:layout_weight">1</item>
        <item name="android:layout_marginBottom">1dp</item>
        <item name="android:gravity">center</item>
        <item name="android:orientation">horizontal</item>
    </style>

  这样就保证了上下自适应布局。然后行里面的Button也是平均分配,不过这里是横向布局:layout_width=0dp,layout_weight=1,具体设置如下:

 <style name="btn_input_amount_style">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:layout_weight">1</item>
        <item name="android:textSize">40sp</item>
        <item name="android:textColor">#333333</item>
        <item name="android:background">@color/white</item>
    </style>

  这样就达到了上面的数字键盘的上下左右自适应了。现在的问题是其中的灰色边框怎么出来呢?TextView中没有设置border的属性,网上找的方法又很麻烦。

  这里需要用到一个技巧,利用灰色背景,让两个按键间的margin=1,上下也是margin=1,但是最右边的3、6、9和最后一行不用加。

<Button
   android:id="@+id/btn_1"
   style="@style/btn_input_amount_style"
   android:layout_marginRight="1dp"
   android:text="1" />

   为什么要设置layout_width=0dp?结合layout_weight,可以使控件成正比例显示,轻松解决了当前Android开发最为头疼的碎片化问题之一。如果设置成wrap_content,内容过长会导致上下无法对齐的情况。

  下面为整个布局内容:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.view.InputAmountActivity">

    <RelativeLayout
        android:id="@+id/bar_input"
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_bar_height"
        android:background="@color/logo_background"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/bar_back"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@color/transparent"
            android:drawableLeft="@drawable/btn_back_detail"
            android:paddingLeft="17dip"
            android:paddingRight="17dip" />

        <TextView
            android:id="@+id/bar_title"
            style="@style/title_text_style"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="50dp"
            android:singleLine="true"
            android:text="输入金额" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/txt_amount"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/bar_input"
        android:background="@color/logo_background">

        <TextView
            android:id="@+id/txt_pay_amount"
            android:layout_width="match_parent"
            android:layout_height="115dp"
            android:background="@color/transparent"
            android:gravity="right|center"
            android:paddingLeft="17dip"
            android:paddingRight="20dp"
            android:text="¥998"
            android:textColor="@color/white"
            android:textSize="40sp"
            android:textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/txt_amount"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/table_num"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="6"
            android:background="#c8cbcc"
            android:orientation="vertical">

            <LinearLayout style="@style/layout_input_amount_style">

                <Button
                    android:id="@+id/btn_1"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="1" />

                <Button
                    android:id="@+id/btn_2"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="2" />

                <Button
                    android:id="@+id/btn_3"
                    style="@style/btn_input_amount_style"
                    android:text="3" />
            </LinearLayout>

            <LinearLayout style="@style/layout_input_amount_style">

                <Button
                    android:id="@+id/btn_4"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="4" />

                <Button
                    android:id="@+id/btn_5"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="5" />

                <Button
                    android:id="@+id/btn_6"
                    style="@style/btn_input_amount_style"
                    android:text="6" />
            </LinearLayout>

            <LinearLayout style="@style/layout_input_amount_style">

                <Button
                    android:id="@+id/btn_7"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="7" />

                <Button
                    android:id="@+id/btn_8"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="8" />

                <Button
                    android:id="@+id/btn_9"
                    style="@style/btn_input_amount_style"
                    android:text="9" />
            </LinearLayout>

            <LinearLayout style="@style/layout_input_amount_style">

                <Button
                    android:id="@+id/btn_t"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="." />

                <Button
                    android:id="@+id/btn_0"
                    style="@style/btn_input_amount_style"
                    android:layout_marginRight="1dp"
                    android:text="0" />

                <ImageButton
                    android:id="@+id/btn_d"
                    style="@style/btn_input_amount_style"
                    android:src="@drawable/ico_del" />

            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="68dp"
            android:layout_weight="1"
            android:orientation="horizontal">

            <LinearLayout
                android:id="@+id/layout_zhifubao"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@color/logo_background"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="9dp"
                    android:src="@drawable/ico_zhifubao" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="9dp"
                    android:text="支付宝"
                    android:textColor="@color/white"
                    android:textSize="12sp" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/layout_wechat"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3cb034"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="9dp"
                    android:src="@drawable/ico_wechat" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="9dp"
                    android:text="微信"
                    android:textColor="@color/white"
                    android:textSize="12sp" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/layout_pay"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#ff7700"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="9dp"
                    android:src="@drawable/ico_pay" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="9dp"
                    android:text="储值"
                    android:textColor="@color/white"
                    android:textSize="12sp" />
            </LinearLayout>
        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

  是不是很酷?

  图标什么的自己上网找吧,这里就不贴出来了。

     微信支付的源码和支付碰到的部分问题解决方法已上传至微信公众号【一个码农的日常】,其它知识可回复:数据库,NET ,JS 即可自行下载,以后会定期更新内容。

目录
相关文章
|
Java Maven Android开发
Android自定义一个车牌字母选择键盘
和省份简称键盘不同的是,数据源上和边距有所差别之外,其他的实现方式均是一样的,采用外部垂直LinearLayout,内部多个横向的LinearLayout的搭配方式。
|
XML Android开发 数据格式
Android 自定义车牌键盘
Android 自定义车牌键盘
676 0
Android 自定义车牌键盘
|
29天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
6天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
5天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
18 5
|
3天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
5天前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
16 3
|
7天前
|
存储 IDE 开发工具
探索Android开发之旅:从新手到专家
【10月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何在Android平台上从零开始,最终成为一名熟练的开发者。通过简单易懂的语言和实际代码示例,本文将引导你了解Android开发的基础知识、关键概念以及如何实现一个基本的应用程序。无论你是编程新手还是希望扩展你的技术栈,这篇文章都将为你提供价值和启发。让我们开始吧!
|
13天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
42 5