Android App软件框架搭建

2023-11-04

1. App软件框架搭建


软件首页

1.0软件基本架构

软件基本架构

1.1创建MainActivity并设置布局文件

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <FrameLayout

            android:id="@+id/fl_main"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            >
        </FrameLayout>

        <include  layout="@layout/buttom_button_main"/>
    </LinearLayout>

其中: buttom_button_main.xml文件如下:(此处底部tab使用layout+image+text 可使用radiobutton更为简单)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="55dp"
    android:orientation="vertical">

    <TextView
        android:background="@color/home_back_selected"
        android:layout_width="match_parent"
        android:layout_height="1dp" />
    <LinearLayout
        android:paddingTop="2dp"
        android:layout_width="match_parent"
        android:layout_height="54dp"
        android:orientation="horizontal">
        <LinearLayout
            android:id="@+id/ll_main_home"
            android:gravity="center"
            android:orientation="vertical"
            android:layout_weight="1"
            android:layout_width="50dp"

            android:layout_height="50dp">
            <ImageView
                android:id="@+id/iv_main_button_home"
                android:src="@drawable/bottom01"
                android:layout_width="30dp"
                android:layout_height="30dp" />
            <TextView
                android:layout_marginTop="2sp"
                android:text="首页"
                android:textSize="14sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <LinearLayout

            android:id="@+id/ll_main_invest"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical"
            android:layout_width="50dp"
            android:layout_height="50dp">
            <ImageView
                android:id="@+id/iv_main_button_invest"
                android:src="@drawable/bottom03"
                android:layout_width="30dp"
                android:layout_height="30dp" />
            <TextView
                android:layout_marginTop="2sp"
                android:text="投资"
                android:textSize="14sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <LinearLayout

            android:id="@+id/ll_main_my"
            android:gravity="center"
            android:orientation="vertical"
            android:layout_weight="1"
            android:layout_width="50dp"
            android:layout_height="50dp">
            <ImageView
                android:id="@+id/iv_main_button_my"

                android:src="@drawable/bottom05"
                android:layout_width="30dp"
                android:layout_height="30dp" />
            <TextView
                android:layout_marginTop="2sp"
                android:text="我的"
                android:textSize="14sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout

            android:id="@+id/ll_main_more"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical"
            android:layout_width="50dp"
            android:layout_height="50dp">
            <ImageView
                android:id="@+id/iv_main_button_more"
                android:src="@drawable/bottom07"
                android:layout_width="30dp"
                android:layout_height="30dp" />
            <TextView
                android:layout_marginTop="2sp"
                android:text="更多"
                android:textSize="14sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

1.2 创建四个对应的Fragment 并加载对应的四布局文件

软件基本架构
1) HomeFragment对应类

com.example.chen.guigup2p.fragment.HomeFragment

/**

 * 1. HomeFragment --首页
 */

public class HomeFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = View.inflate(getContext(), R.layout.fragment_home,null);
        return  view;
    }
}

2)HomeFragment对应布局文件

layout/fragment_home.xml

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

    <TextView
        android:text="首页"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

其余三个fragment类似

1.3 实现不同Fragment间切换

1.3.1 ButterKnife 框架使用

1 安装插件
ButterKnife

2 导入到gradle文件

dependencies {
... ...
/*使用butterknife*/
    compile 'com.jakewharton:butterknife:7.0.1'
}

3 MainActiviy中使用ButterKnife
使用注解初始化视图对象

public class MainActivity extends FragmentActivity {

    @Bind(R.id.fl_main)
    FrameLayout flMain;

    @Bind(R.id.iv_main_button_home)
    ImageView ivMainButtonHome;

    @Bind(R.id.ll_main_home)
    LinearLayout llMainHome;

    @Bind(R.id.iv_main_button_invest)
    ImageView ivMainButtonInvest;

    @Bind(R.id.ll_main_invest)
    LinearLayout llMainInvest;

    @Bind(R.id.iv_main_button_my)
    ImageView ivMainButtonMy;

    @Bind(R.id.ll_main_my)
    LinearLayout llMainMy;

    @Bind(R.id.iv_main_button_more)
    ImageView ivMainButtonMore;

    @Bind(R.id.ll_main_more)
    LinearLayout llMainMore;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        setSelect(1);

    }

}

添加底部tab点击事件

@OnClick({R.id.ll_main_home, R.id.ll_main_invest, R.id.ll_main_my, R.id.ll_main_more})
    public void switchFragment(View view) {
        switch (view.getId()) {
            case R.id.ll_main_home:
                Toast.makeText(this, "首页", Toast.LENGTH_SHORT).show();
                setSelect(1);
                break;
            case R.id.ll_main_invest:
                Toast.makeText(this, "投资", Toast.LENGTH_SHORT).show();
                setSelect(2);
                break;
            case R.id.ll_main_my:
                Toast.makeText(this, "我的", Toast.LENGTH_SHORT).show();
                setSelect(3);
                break;
            case R.id.ll_main_more:
                Toast.makeText(this, "更多", Toast.LENGTH_SHORT).show();
                setSelect(4);
                break;

        }
    }

切换fragment试图并更新按钮状态

    /**
     * 2. 设置要显示的Fragment
     * >更新button背景图        updateButton(i,oldButton);
     * @param i
     */
    private HomeFragment homefragment;
    private InvestFragment investfragment;
    private MyFragment myfragment;
    private MoreFragment morefragment;

    private int currentfragment = 1;  //标识当前显示的fragment的标号
    private int oldButton = 1;        //标识当前选中的button的标号

    private void setSelect(int i) {
        //通过事务生成并调用fragment
        FragmentManager manager = this.getSupportFragmentManager();
        FragmentTransaction transation = manager.beginTransaction();

        switch (i) {
            case 1://显示第一个fragment
                if (homefragment == null) {
                    homefragment = new HomeFragment();
                    transation.add(R.id.fl_main, homefragment);
                }
                checkFragment(i, transation);
                transation.show(homefragment);
                currentfragment = i;
                break;

            case 2://显示第二个fragment
                if (investfragment == null) {
                    investfragment = new InvestFragment();
                    transation.add(R.id.fl_main, investfragment);
                }
                checkFragment(i, transation);
                transation.show(investfragment);
                currentfragment = i;//更新当前fragment

                break;
            case 3://显示第三个fragment

                if (myfragment == null) {
                    myfragment = new MyFragment();
                    transation.add(R.id.fl_main, myfragment);
                }
                checkFragment(i, transation);
                transation.show(myfragment);
                break;
            case 4://显示第四个fragment

                if (morefragment == null) {
                    morefragment = new MoreFragment();
                    transation.add(R.id.fl_main, morefragment);
                }
                checkFragment(i, transation);
                transation.show(morefragment);
                break;

        }
        transation.commit();

        updateButton(i, oldButton);
        //更新索引
        currentfragment = i;
        oldButton = i;

    }

    /**
     * 3. 检测当前显示的fragment 是否是将要显示的fragment --隐藏非当前的fragment
     * @param i
     * @param transation
     */
    private void checkFragment(int i, FragmentTransaction transation) {
        if (i != currentfragment) {
            switch (currentfragment) {
                case 1: //隐藏home
                    transation.hide(homefragment);
                    break;
                case 2: //隐藏home
                    transation.hide(investfragment);
                    break;
                case 3: //隐藏home
                    transation.hide(myfragment);
                    break;
                case 4: //隐藏home
                    transation.hide(morefragment);
                    break;

            }
        }

    }

    /**
     * 4. 更新按钮状态
     *
     * @param i
     * @param oldButton
     */
    private void updateButton(int i, int oldButton) {

        Log.d("MainActivity", i + "---" + oldButton);
        //根据oldButton 还原 背景
        switch (oldButton) {
            case 1:
                ivMainButtonHome.setImageResource(R.drawable.bottom01);
                break;
            case 2:
                ivMainButtonInvest.setImageResource(R.drawable.bottom03);
                break;
            case 3:
                ivMainButtonMy.setImageResource(R.drawable.bottom05);
                break;
            case 4:
                ivMainButtonMore.setImageResource(R.drawable.bottom07);
                break;
        }

        //根据i 设置button 背景
        switch (i) {
            case 1:
                ivMainButtonHome.setImageResource(R.drawable.bottom02);
                break;
            case 2:
                ivMainButtonInvest.setImageResource(R.drawable.bottom04);
                break;
            case 3:
                ivMainButtonMy.setImageResource(R.drawable.bottom06);
                break;
            case 4:
                ivMainButtonMore.setImageResource(R.drawable.bottom08);
                break;
        }


    }

项目代码:见github
1. Android App软件架构 –(帧布局) https://github.com/chenxzong/AppFrame_layout
2. 软件框架对应用 https://github.com/chenxzong/GuiguP2P

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android App软件框架搭建 的相关文章

  • 在 Android 中创建和使用 9 补丁图像

    我最近听说了 9 补丁图像 我知道它是 9 平铺的并且是可拉伸的 我想了解更多 如何创建 9 块图像 有什么工具吗 我可以通过 AndroidSDK 或代码创建它吗 9 patch 相对于普通 png 的主要优点 它是否可以根据屏幕动态 自
  • 关闭 Android 中的飞行模式

    如果 num gt 50 我想关闭飞行模式 我实现了这段代码 来自在 Android 中切换飞行模式 https stackoverflow com questions 5533881 toggle airplane mode in and
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • AppCompat v21 工具栏更改徽标大小

    我正在从以前的操作栏迁移到 appcompat v21 中的新工具栏功能 我仍然想将徽标保留在操作栏 工具栏 的左上角 为此 我在布局中添加了支持工具栏 并为其创建了一个新的工具栏 app theme style NewToolBarSty
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • 为什么按钮上的 maxWidth 不起作用以及如何解决它?

    我的布局上有两个按钮 在大屏幕设备 平板电脑 上我想限制它们的宽度 这样它们看起来就不会很荒谬 我希望使用 maxWidth 属性 但它显然在我的场景中没有任何作用 这是布局定义 按钮使用布局的整个宽度 忽略 maxWidth 中的任何值
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • SQLite支持android的数据类型有哪些

    谁能告诉我 SQLITE 中支持 ANDROID 的数据类型列表 我想确认 TIME 和 DATE 数据类型 这里有一个list http www sqlite org datatype3 htmlSQLite 的数据类型 支持时间和日期间
  • 监听什么来检测 Android 中的请勿打扰模式更改?

    我希望我的应用程序在手机设置为请勿打扰模式 仅限闹钟 仅限优先级或完全静音 时显示通知 通过聆听 这效果非常好android media RINGER MODE CHANGED在快速设置中检查此模式并在已选择的选项卡中选择模式时 但是 当选
  • Android Web Intent 问题

    G day 免责声明 我不是 Android 开发人员 我正在对我所描述的问题进行质量检查 我用来描述这个问题的技术术语可能是错误的 我正在测试一个 Android 应用程序 该应用程序在其清单中描述它可以使用 type 的地址处理 Web
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 加快 ImageView 中的缩放功能

    我目前正在处理非常大的图像 7 10mb 由于多种原因无法调整大小或压缩 现在 我们的想法是在自定义 ImageView 中显示它们 使用户能够进行双击缩放 捏合缩放等 我使用这个库来完成这项工作 https github com Mike
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • Ionic Facebook Api 无效密钥哈希

    我无法让我的应用程序允许 Facebook 登录 每次用户尝试登录 Facebook 并使用他们的 FB 验证我的应用程序时 都会出现以下错误 无效的密钥哈希 它们的密钥哈希 xxxxxxxxxx 与任何存储的密钥哈希不匹配 配置您的应用程
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 如何获取android手机型号、版本、sdk详细信息?

    如何获取android手机型号 版本 sdk详细信息 首先 看看 android sdk 页面上的这些 Build 类 http developer android com reference android os Build html h
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果

随机推荐

  • qt控件学习(4)

    文章目录 QTabWidget 控件 QMenu QToolBar 控件 QSystemTrayIcon 任务栏控件 QTabWidget 控件 mainwindow h ifndef MAINWINDOW H define MAINWIN
  • 【JVM】内存管理

    目录 引言 1 内存分配 1 0 创建一个对象涉及的内存 1 1 方法区 1 2 堆 1 2 1 对象 堆里的存储单元 2 1 3 虚拟机栈 2 垃圾回收GC 2 1 垃圾回收的目标区域 2 2 垃圾回收算法 2 2 0 标记算法 2 2
  • vs2017登陆日期失效,登录界面长时间不显示解决方案

    下面说在社区版本30天试用期到后登录问题 卡住那个登录界面不显示的方法 附上解决链接 https blog csdn net zhouyingge1104 article details 79113636 里面图文并茂
  • 状态机fsm_Verilog设计与逻辑综合实例解析(有限状态机)

    来自微信公众号 数字芯片实验室 有限状态机 Finite State Machines 是设计中控制逻辑的重要部分 本节讨论各种类型的FSM编码风格的差异 同步状态机和异步状态机之间有什么区别 同步状态机和异步状态机是状态机的两种基本类型
  • 查看电脑jdk/jre版本以及安装路径并测试是否可以正常使用(检查运行环境)

    查看电脑jdk jre版本以及安装路径并测试是否可以正常使用 检查运行环境 查看JDK版本 查看jre安装路径 在cmd中继续输入 测试方法 查看JDK版本 安装好JDK并配置好环境之后 查看jdk版本 首先进入cmd运行之后 输入 jav
  • 多元化增长引擎业务占比超四成,联想开启混动模式?

    一句话概括联想集团的业绩 预料之内的整体下滑 超出预期的第二曲线 上周五 2月17日 联想集团发布了2022到2023财年第三季度业绩 根据财报 联想集团实现营收152 67亿美元 同比下降24 实现净利润4 37亿美元 同比下降32 值得
  • Edge加载weTab扩展,实现ChatGPT应用

    1 找开Edge浏览器 点右上角三个点儿 如下图 再点 扩展 2 在弹出的窗口中点 管理扩展 我上这个中 上面已经存在 WeTab 免费ChatGPT新标签页 说明我已经加载这个扩展项啦 3 再在弹出的扩展页中 输入 wetab 这时右侧可
  • 特殊环境下的conda环境激活

    问题描述 特殊环境指的就是docker容器内部或者jenkins的Execute shell内部 在特殊环境内正常执行conda activate 环境名会有如下的报错 Could not find conda environment da
  • 自定义Dynamics 365实施和发布业务解决方案- 2.设置开发环境

    本章将指导您设置开发环境以启动项目 概括一下 在第1章中 我们捕获了Azure DevOps 正式名称为VSTS 中的需求 创建了数据模型 并将实体映射到Dynamics 365实体 现在是开始开发的时候了 但在这样做之前 我们必须决定实现
  • el-select下拉框定位问题

    1 当el select所在页面滚动时或者el select上面区域高度发生变化时 定位存在偏差 2 解决办法 1 el select自带属性popper append to body true 可能会无效 2 设置ref 监听高度变化或者
  • pandas报cannot set a frame with no defined index and a scalar的一个原因

    使用pandas时遇到 ValueError cannot set a frame with no defined index and a scalar 错误 其中一个原因可能是由于你正在对一个空的dataframe进行操作 gt gt g
  • 10.es 基于multi_match+most_fields策略进行multi_field搜索 、使用most_fields策略进行cross-fields search的弊端

    从best fields换成most fields策略 best fields策略 主要是说将某一个field匹配尽可能多的关键词的doc优先返回回来 most fields策略 主要是说尽可能返回更多field匹配到某个关键词的doc 优
  • Linux命令入门教程(三):文件基础篇

    3 1 文件基础介绍 Linux系统的一个重要思想 一切皆文件 在Linux中 一个普通文件如 txt文本是一个文件 一个压缩包是一个文件 一个设备也是一个文件 Linux中文件的后缀名并不重要 你可以创建一个无后缀名的文件 或给它一个不相
  • TensorFlow2+OpenCV实现人像采集与识别

    TensorFlow2 OpenCV实现人像采集与识别 前言 1 图像检测和采集 2 图像预处理 3 网络搭建和模型训练 4 人脸图像匹配与识别 前言 本设计用python语言实现 这里罗列一下整个项目所需要的包 仅供参考 h5py 2 9
  • [架构之路-209]- 人人都是产品经理 - 产品经理的常见话题

    这是写给 1到3岁的产品经理 的书 适合刚入门的产品经理 产品规划师 需求分析师 以及对做产品感兴趣的学生 用户体验 市场运营 技术部门的朋友们 特别是互联网 软件行业 作为一名 4岁的产品经理 作者讲述了过去3年的经历与体会 与前辈们的书
  • Qt for vs2017 grpc无法解析的外部符号错误

    Qt for vs2017 grpc无法解析的外部符号错误 错误 grpc lib alts handshaker client obj error LNK2001 无法解析的外部符号 public void thiscall absl l
  • Keras框架下的猫狗识别(三)

    Tensorflow学习 使用jupyter notebook Keras框架下的猫狗识别 一 Keras框架下的猫狗识别 二 Tensorflow学习 使用jupyter notebook Tensorflow学习 使用jupyter n
  • 二. javascript语句

    注 与c语言用法相同的语句这里不作赘述 1 throw语句 抛出一个异常 例如 fuction myfun x y if y 0 throw new Error 除数不能为0 return x y myfun 1 0 结果报错 除数不能为0
  • maven 在idea 里面执行install 失败,报一些jar 包失败

    1 maven 在执行install 的时候 会有一些命令 这个时候会报日志 日志里面谁说从这个地址拿不到相关的Jar 包 那么 就先在pom xml 里面看看这个url存在不 如果存在 看看是否存在这个jar包 要是不存在 那么就会下载不
  • Android App软件框架搭建

    1 App软件框架搭建 1 0软件基本架构 1 1创建MainActivity并设置布局文件 布局文件如下