Android总篇

Android布局介绍

 线性布局

Android线性布局(LinearLayout)是Android开发中最常用的布局之一。它可以将容器中的组件按照水平或垂直方向进行排列。

通过android:orientation属性来控制方向,设置为水平方向(horizontal)或垂直方向(vertical)。

一般使用在只设计水平或者垂直分布等简单的布局

常用的一些属性:
  1. layout_weight:用于设置组件在布局中的权重,实现比例分配空间。
  2. baselineAligned:用于控制布局管理器与其子元素的基线是否对齐。
  3. divider:在垂直布局中设置两个组件之间的分隔条。
  4. gravity:设置布局管理器内组件的对齐方式,如居中、靠左、靠右等。

使用案例:

       eg1:创建一个水平方向的线性布局,其中包含两个按钮,一个文本视图,并且要求按钮和文本视图水平居中。

        eg2:创建一个垂直方向的线性布局,并且希望其中的两个文本视图按照一定比例分配空间。

注意:当使用layout_weight时,通常需要将对应方向的layout_widthlayout_height设置为0dp,以便让系统根据权重自动计算尺寸。

约束布局

Android约束布局(ConstraintLayout)是一种灵活的布局方式,旨在解决嵌套布局带来的性能问题,并提供更高效的界面设计手段。

优点:它通过约束条件来定义视图之间的关系,实现复杂的布局设计,而无需多层嵌套,使得布局设计更加灵活多变。

一般使用在复杂的布局当中。

使用案例:

        eg1:用户登录界面设计

通过设置控件之间的约束关系,确保它们在不同屏幕尺寸和分辨率下都能保持合适的布局和间距。

        eg2:实现链式布局

在这个例子中,我们有三个按钮:Start、End和Center。Start和End按钮被固定在屏幕的边,Center按钮在Start和End按钮之间,并且它们三个都处在父视图的顶部和底部。当父视图的大小或形状发生变化时,ConstraintLayout会自动调整这三个按钮的位置以保持它们之间的关系。

表格布局

  1. Android的表格布局(TableLayout)是继承自LinearLayout,因此其本质仍然是线性布局管理器。
  2. 每次向TableLayout中添加一个TableRow,该TableRow即为一个表格行,且TableRow也是容器,可以不断地添加其他组件。

帧布局

帧布局(FrameLayout)是Android中最简单的布局方式。它将视图(View)一帧一帧地叠加到一起,类似于Photoshop中的图层概念;在帧布局中,后添加的视图会覆盖先添加的视图,视图按照添加的顺序依次叠加。

帧布局通常用于需要视图叠加效果的场景,或者作为一个容器来显示单个视图。

基本使用:

相对布局

相对布局(RelativeLayout)是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。

它可以实现控件间的相对定位,如相对于父容器或相对于其他控件进行定位。

案例:

        eg:标签在顶部并且与左边对齐,文本输入框位于标签下方并且与标签对齐,按钮分别位于输入框下方和右侧。

以上就是这几种布局的介绍了!

Android的常用控件

 用控件的介绍:

  1. 文本框(TextView):用于显示文本信息。 可以通过XML布局文件设置其样式、大小和颜色等属性。
  2. 编辑框(EditText):允许用户输入和编辑文本,可以设置输入类型(如数字、文本、密码等)和监听文本变化。
  3. 按钮(Button):允许用户通过点击来执行操作。可以设置按钮的文本、背景和点击效果。
  4. 单选按钮(RadioButton):允许用户从一组选项中选择一个。RadioGroup用于包裹多个RadioButton,确保一次只能选择一个。
  5. 复选框(checkbox):允许用户选择多个选项。每个CheckBox都可以单独被选中或取消选中。
  6. 图片控件(ImageView):显示用户的头像信息或者展示商品等

这面是我们的xml文件的代码展示,创建了一个简单的登录界面,包含了用户名和密码输入框、记住我复选框、用户类型选择(用户和管理员)以及登录按钮。当用户点击登录按钮时,会触发登录逻辑。

注意:把所有控件都加上id,后面可以在activity中获取到控件进行使用。

下面看看写完的效果:

现在来看逻辑代码:

在上面可以看到,通过findbyId找到控件,判断值是否为空,不为空就算登录成功,点击登录后在Log日志中查看结果

注意:此处为模拟登录,实际以自己登录逻辑!!!!

简单了解android的Activity与Intent

 Android中的Activity有一个明确的生命周期,由系统控制。了解这个生命周期对于开发高效、稳定的Android应用至关重要。Activity的生命周期主要包括以下几个阶段:

Activity的生命周期

  1. onCreate(): 当Activity第一次被创建时调用。这是初始化设置的好地方,如设置UI视图和加载数据。
  2. onStart(): 在Activity即将对用户可见之前调用。
  3. onResume(): 在Activity开始与用户交互之前调用。此时,Activity处于活动状态并位于任务堆栈的顶部。
  4. onPause(): 当另一个Activity启动或当前Activity不再可见时调用。这是保存数据或状态的好地方。
  5. onStop(): 当Activity不再可见时调用。这通常发生在启动一个新的Activity或当用户返回到主屏幕或切换到其他应用时。
  6. onDestroy(): 在Activity被销毁之前调用。这是释放资源的好地方,如关闭文件、数据库连接等。
  7. onRestart(): 在Activity已经停止后,再次启动前调用。

onCreate() 方法是每个 activity 都必须实现的方法。您可使用 onCreate() 方法为 activity 执行所有一次性初始化,相应 activity 会被视为“已创建”。

注意:替换 onCreate() 方法时,您必须调用父类实现来完成 activity 的创建,因此您必须立即调用 super.onCreate()。这也适用于其他生命周期回调方法。

系统会在调用 onCreate() 之后立即调用 onStart() 生命周期方法。onStart() 运行后,您的 activity 会显示在屏幕上。与为初始化 activity 而仅调用一次的 onCreate() 不同,onStart() 可在 activity 的生命周期内由系统多次调用。

注意onStart() 需要与相应的 onStop() 生命周期方法配对使用。如果用户启动您的应用后又返回设备的主屏幕,相应 activity 会停止,并且不会再在屏幕上显示。

后续更多可参考官方文档:activity 生命周期的阶段  |  Android Developers

Intent的跳转方式:

        Intent是Android中用于请求操作的一个消息对象,可以用于启动ActivityService或发送广播。当用于启动Activity时,有几种常见的跳转方法:

显式:这种方式明确指定了要启动的Activity的类名

        可以通过IntentputExtra()方法向目标Activity传递额外数据。这些数据可以是基本数据类型、字符串、序列化对象等。

隐式:这种方式不直接指定要启动的Activity,而是通过定义ActionCategoryData等属性来匹配系统中可以处理该IntentActivity

高级控件

在Android开发中,高级控件是构建复杂和动态用户界面时不可或缺的工具。以下是一些Android高级控件的概述,按照不同的功能和类型进行分类:

  1. 滚动和视图容器控件
    • ScrollView:用于显示超出屏幕大小的内容,并提供垂直滚动功能。它通常包含一个子视图,如LinearLayoutRelativeLayout
    • HorizontalScrollView:与ScrollView类似,但提供水平滚动功能。
    • ViewPager:用于在多个视图之间水平滑动切换,常用于实现图片轮播或页面导航。
  2. 列表和网格控件
    • ListView:以列表形式展示数据项,支持垂直滚动。它通常与适配器(如ArrayAdapterSimpleAdapter等)一起使用,以将数据源与视图绑定。
    • GridView:以网格形式展示数据项,常用于展示图片或图标。
    • RecyclerView:一个更强大和灵活的列表/网格控件,支持水平和垂直滚动,以及复杂的布局和动画效果。
  3. 其他常见的高级控件
    • Spinner:一个下拉列表控件,允许用户从预定义的选项中选择一个值。
    • ProgressBar:用于显示操作进度的控件,可以是水平的或圆形的。
    • TabLayout:与ViewPager结合使用,实现带有标签页的界面导航。
    • DrawerLayout:一个导航抽屉控件,通常用于展示侧边栏或导航菜单。
  4. 自定义控件
    • Android还支持开发者创建自定义控件,以满足特定需求。这通常涉及继承现有的视图类(如ViewViewGroup等),并重写其绘制和事件处理逻辑。

案例:

        (1)HorizontalScrollView与ScrollView类似,但是支持水平方向上的滚动。以下是一个简单的HorizontalScrollView案例:

 HorizontalScrollView常见属性及方法
常见属性:

android:fillViewport:设置是否要求子视图填充HorizontalScrollView的可视区域。默认值为true,在子视图不足以填充水平空间时,会拉伸子视图使得水平空间被填满。

android:overScrollMode:设置滚动边界效果模式。可选值有"always"(总是显示边界阴影效果)、"never"(永不显示边界阴影效果)和"ifContentScrolls"(仅当内容发生滚动时显示边界阴影效果)。

android:scrollbars:设置滚动条的显示方式。可选值有"horizontal"(只显示水平滚动条)、"vertical"(只显示垂直滚动条)和"none"(不显示滚动条)。

android:scrollbarStyle:自定义滚动条的风格。可选值有"default"(系统默认风格)、"insideInset"(滚动条在内部偏移位置显示)和"outsideInset"(滚动条在外部偏移位置显示)。

常见方法:

scrollTo(int x, int y):滚动到指定的坐标位置。其中x表示水平方向上的滚动位置,y表示垂直方向上的滚动位置。

smoothScrollTo(int x, int y):平滑地滚动到指定的坐标位置。与scrollTo()相比,该方法会有一个过渡效果,使得滚动更加平滑。

fullScroll(int direction):滚动到指定方向的边界。direction可选值为View.FOCUS_LEFT(滚动到最左边)、View.FOCUS_RIGHT(滚动到最右边)和View.FOCUS_FORWARD(按照指定方向进行滚动)。

computeHorizontalScrollRange():获取水平滚动范围的总长度。

setSmoothScrollingEnabled(boolean enabled):设置是否启用平滑滚动效果。

总结

        使用HorizontalScrollView时,需要根据实际需求和内容的水平滚动性质来设置布局结构和子视图。通过合理处理布局和内容,可以为用户提供流畅且舒适的水平滚动体验。

        (2)RecyclerView是进阶版的ListView,可以实现ListView的纵向滑动。

在要展示的页面添加RecyclerView

准备数据创建bean

创建适配的布局页面

        创建适配布局的适配器RecyclerViewAdapter继承RecyclerView.Adapter<T>,重写相关方法,其中:

  • T为内部类ViewHolder继承,用于RecyclerView.ViewHolder,传入参数为适配布局的View实例
  • 构造方法用于接收并维护数据
  • onCreateViewHolder()加载适配布局传入ViewHolder并返回,viewType用于和getItemViewType()根据不同数据返回对应布局,如设置Header
  • onBindViewHolder()用于将控件和数据进行绑定
  • getItemCount()用于返回数据长度

修改Activity,为RecyclerView设置布局方向和适配器

以上就可以实现了左边RecyclerView的展示和tab点击,以下是效果图

总结

        RecyclerView是Android开发中一个强大且灵活的UI控件,用于在有限的空间内展示大量数据集。

Android菜单与对话框设计

        在Android开发中,菜单(Menus)和对话框(Dialogs)是两种常见的用户界面元素,它们为用户提供与应用程序交互的直观方式。以下是关于Android菜单与对话框的详细解释和用法:

对话框(Dialogs)

        AlertDialog用法:

  • 创建一个对话框生成器AlertDialog.Builder对象
  • 设置AlertDialog.Builder对象的属性,图标,标题,内容等
  • 调用create()方法创建一个对话框AlertDialog
  • 调用AlertDialog的show()方法显示对话框
  • 调用AlertDialog的dismiss()方法关闭对话框

    AlertDialog.Builder对象的常用属性讲解

  • 设置对话框的图标: setIcon(R.mipmap.ic_launcher)
  • 设置对话框标题:setTitle("系统警告")
  • 设置对话框内容: setMessage("电量过低,一分钟后将自动关机!")
  • 设置点击对话框外的区域是否关闭对话框:   setCancelable(false)
  • 设置对话框按钮功能(系统提供的对话框有三个按钮。不设置则不显示,点击按钮后对话框会自动关闭

                setNegativeButton("否", new DialogInterface.OnClickListener() {...})
                setNeutralButton("中", new DialogInterface.OnClickListener() {...})
                setPositiveButton("是", new DialogInterface.OnClickListener() {...})

使用案例:

  

在点击加入购物车后会弹出对话框来确定是否加入

  

总结

        对话框是Android中用于显示重要信息或请求用户输入的小窗口。它们通常会打断用户的正常操作,直到用户与对话框交互。

菜单(Menus)

选项菜单 OptionsMenu

        创建menu的xml文件

        <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!-- 菜单可以嵌套 但顶多允许含有一层子菜单-->
    <!--
        showAsAction:always 直接在标题栏显示 never 不显示 有图标就显示图标
    -->
    <item
        android:id="@+id/m1"
        android:title="选项1"
        app:showAsAction="always"/>
    <item
        android:id="@+id/m2"
        android:title="选项2"/>
    <item
        android:id="@+id/m3"
        android:title="选项3"/>
    <item
        android:id="@+id/m4"
        android:title="选项4">
        <menu>
            <item android:title="子菜单1"/>
            <item android:title="子菜单2"/>
            <item android:title="子菜单3"/>
            <item android:title="子菜单4"/>
        </menu>
    </item>
 
</menu>

在需要添加选项菜单的布局对应的activity中重写 onCreateOptionsMenu 方法加载选项菜单-此时是MainActivity

getMenuInflater().inflate(R.menu.option,menu); // 加载菜单资源

// 创建optionMenu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // 加载菜单资源
        getMenuInflater().inflate(R.menu.option,menu);
        return true;
    }           

   重写 onCreateOptionsMenu 方法,利用以上类添加选项菜单,菜单项序号是指菜单项的位置

// 创建optionMenu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        /* 纯代码设计
         * Menu 类 SubMenu 子菜单类*/
        /* Menu 类参数:组id 菜单项 id 菜单项序号 菜单项名称 */
        menu.add(1,1,3,"菜单1");
        menu.add(1,2,2,"菜单2");
        SubMenu subMenu = menu.addSubMenu(1,3,1,"子菜单的主菜单");
        subMenu.add(2,22,1,"子菜单2");
        subMenu.add(2,11,2,"子菜单1");
        return true;
    }     

  

上下文菜单

              创建xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item
        android:id="@+id/ctx1"
        android:title="上下文菜单item1" />
    <item
        android:id="@+id/ctx2"
        android:title="上下文菜单item2" />
    <item
        android:id="@+id/ctx3"
        android:title="上下文菜单item3" />
    <item
        android:id="@+id/ctx4"
        android:title="上下文菜单item4" />
    <item
        android:title="上下文菜单item5">
        <menu>
            <item
                android:id="@+id/z_ctx1"
                android:title="子菜单item1" />
            <item
                android:id="@+id/z_ctx2"
                android:title="子菜单item2" />
            <item
                android:id="@+id/z_ctx3"
                android:title="子菜单item3" />
        </menu>
    </item>
</menu>

在activity_main.xml里添加一个按钮用以打开上下文菜单

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <Button
        android:id="@+id/ctx_btn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="打开contextMenu"/>
 
</LinearLayout>

  在 activity_main.xml 布局对应的 activity 中的 onCreate() 方法中进行注册

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // ContextMenu 上下文菜单的使用
        // 1.注册
        registerForContextMenu(findViewById(R.id.ctx_btn));
 }

创建 - 覆盖父类的 onCreateContextMenu 方法,加载菜单资源

// 2.创建contextMenu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.context,menu);
    }

覆盖父类的 onContextItemSelected 方法

// 3.contextMenu 菜单项选项操作
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
 
        int itemId = item.getItemId();
        Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
        return super.onContextItemSelected(item);
    }

  

菜单原文链接:https://blog.csdn.net/weixin_43244083/article/details/135732833

总结

        做菜单时菜单项应该简洁明了,避免使用冗长的描述或不必要的选项,遵循Android的设计规范和最佳实践,确保菜单在应用程序中的外观和行为保持一致,确保菜单易于使用和理解,避免复杂的交互流程或隐藏的操作,为菜单项添加图标可以提高用户的识别速度和易用性。确保图标清晰且与操作相关,在设计菜单时,要考虑用户当前所处的上下文环境,以便提供相关的操作选项。

Android Studio学习过程的反思与持续改进

        在Android Studio的学习过程中,我深刻体会到了技术学习的挑战与乐趣。刚开始,我面临着复杂的编程环境和大量的新概念,常常感到力不从心。但随着时间的推移,我逐渐适应了这种节奏,并在实践中不断加深对Android开发的理解。

反思我的学习过程,我发现持续的学习和实践是关键。仅仅阅读文档或观看教程是不够的,必须亲自动手编写代码,才能在遇到问题时快速找到解决方案。此外,我还学会了利用社区资源和论坛,与其他开发者交流心得,这极大地丰富了我的学习体验;然而,我也意识到自己在时间管理和学习规划上还有待提高。有时我会因为某个难题而陷入困境,浪费了大量时间。为了改进这一点,我开始制定更明确的学习计划,并设定了短期和长期的学习目标。这帮助我更好地把握学习节奏,避免了无谓的浪费时间。

        在未来的学习中,我将继续保持这种反思和持续改进的态度。我将更加注重基础知识的巩固和深入学习,同时也会积极探索新的技术趋势和解决方案。

  • 23
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值