当前分类 / 基础 / 总共41篇

Android 底部导航菜单的使用

Android 底部导航停留在屏幕的底部,在应用程序的顶层视图之间提供导航。这是在向后兼容的设计支持库中引入的。当应用程序有三到五个顶级导航时,应该使用底部导航。本文将介绍底部导航的基础知识,并将其与 Fragment相结合。我们还将学习如何通过通过 HTTP 调用获取 JSON 来加载第一个带有网格数据的片段(使用 RecyclerView)。

底部导航

使用 Bottom Navigationview 组件可以轻松添加底部导航。您必须使用约束关系或相对关系属性,使它出现在屏幕底部。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        app:itemBackground="@color/bgBottomNavigation"
        android:foreground="?attr/selectableItemBackground"
        app:itemIconTint="@android:color/white"
        app:itemTextColor="@android:color/white"
        app:menu="@menu/navigation" />

</android.support.design.widget.CoordinatorLayout>

阅读更多

Android 构建多语言支持的应用程序

Android 是少数流行的移动操作系统之一,拥有超过 190 个国家的数百万用户,并日益增长。所以当你想让你的应用在全球取得成功时,让应用本地化总是一个好主意。在进行本地化时,您应该考虑根据地区或国家使用适当的文本、音频、货币、数字和图形。但本教程只涉及本地化 Resource 支持多种语言。使用参考资料进行本地化说明在本地化应用程序时应该考虑其他事项。在本文中,我们将构建一个支持多语言的应用程序,它支持法语、德语、印地语和日语。

字符串本地化的工作原理

默认情况下,android 将英语作为主要语言,并从 res ⇒ values ⇒ strings.xml 加载字符串资源。当您想要添加对另一种语言的支持时,您需要通过添加连字符和 ISO 语言代码来创建一个 values 文件夹。例如,如果希望添加对法语的支持,应该创建一个名为 values-fr 的 values 文件夹,并在其中保存一个 strings.xml 文件,其中的所有字符串都翻译成法语。

简而言之,本地化工作如下:

  1. 当用户通过设置语言和输入改变设备语言时,android 操作系统会检查应用程序中是否有合适的语言资源(假设用户选择法语)。
  2. 如果应用支持所选的语言,则 android 在项目的 values-(ISO 语言代码)文件夹中查找其字符串资源。(对于法语,它从 values-fr/string.xml 加载字符串值)。
  3. 如果受支持的语言 strings.xml 缺少任何字符串值,则 android 始终会从默认的 strings.xml 文件(即 values/strings.xml)中加载缺少的字符串。

因此,默认的 stings.xml 文件必须包含应用程序使用的所有字符串值,否则应用程序将崩溃或强制关闭错误。

阅读更多

Android 中的 RecyclerView 使用

Android Recyclerview 是 ListView 的升级版,具有性能提升等优点。同时使用 Recyclerview 和 CardView,可以很容易地创建列表和网格。以下是关于 Recyclerview 和其他例子的完整信息。在本教程中,我们将学习如何使用自定义布局呈现简单的 Recyclerview。我们还将学习编写适配器类、添加列表分隔符和行单击侦听器。我们将要设计的 Recyclerview 视图包含显示标题、类型和发行年份的电影列表。

以下是带有必要属性的RecyclerView小部件:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

在开始之前,请确保将您的 Android Studio 更新到最新版本。目前我的 Android Studio 更新到 Android Studio 3.2。

阅读更多

Android中系统音量用代码控制

音量调节

我们知道,在平常调节音量的时候,是有一定的调节数值,也就是,每按一次音量 +/-,音量的增加/减小幅度,这个我们称为:系统的音量步进值。而音量还有一定的范围,系统的是:0 到 Max,Max 不确定,这个称为:系统的音量范围。

在Android中,是有几种类型的音量可以调节:

  • STREAM_ALARM 警报
  • STREAM_MUSIC 音乐回放即媒体音量
  • STREAM_RING 铃声
  • STREAM_SYSTEM 系统
  • STREAM_VOICE_CALL 通话

Android 中的所有音量都是通过:AudioManager 去管理的,也是通过它去调节:

//获取系统的Audio管理者
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);  
//最大音量
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//当前音量
int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

阅读更多

Android内部分享[13]——事件和事件传递分发机制

在 Android 中拦截用户交互的事件不止一种,我们可能已经注意到前面使用过的一些公共回调方法例如 setOnClickListener, onTouchEvent 等,有时候我们在自定义视图的时候需要去扩展或者覆盖某些事件,问题远比你想象的复杂。

监听事件

监听事件是视图 View 类中包含的单个回调方法接口,当你注册了某个事件的监听器后,当用户触发 UI 操作就会回调此方法,主要包括如下几个监听器:

  • onClick() 点击事件,来自 View.OnClickListener 接口。
  • onLongClick() 长按事件,来自 View.OnLongClickListener 接口。
  • onFocusChange() 焦点变化事件,来自 View.OnFocusChangeListener 接口。
  • onKey() 硬件键盘事件,来自 View.OnKeyListener 接口。
  • onTouch() 触摸事件,来自 View.OnTouchListener 接口。
  • onCreateContextMenu() 构建上下文菜单事件,来自 View.OnCreateContextMenuListener 接口。

我们先来看看比较常见的两个事件,点击和长按事件:

Button clickListener = findViewById(R.id.button_clicklistener);
clickListener.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 点击了 Button
    }
});

Button longclickListener = findViewById(R.id.button_long_clicklistener);
longclickListener.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // 长按了 Button
        return false;
    }
});

阅读更多

Android内部分享[12]——Android中自定义View和ViewGroup

View 和 ViewGroup 的关系

在开始自定义组件 View 和 ViewGroup 之前我们先来理解一下它们之间的关系,在 Android 中所有 UI 视图组件的根类是 View,而 ViewGroup 继承自 View,但是需要注意的是 ViewGroup 是一个抽象类.

android.view.View 类:

@UiThread
public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
    //...
}

android.view.ViewGroup 类:

@UiThread
public abstract class ViewGroup extends View implements ViewParent, ViewManager {

    protected ArrayList<View> mDisappearingChildren;

    //...
}

从上面代码可以看出来一个 ViewGroup 中可以包含多个 View,也就是说 ViewGroup 既是一个容器又是一个 View,这样就可以将 ViewGroup 也作为 View 添加到这个集合中了,于是就可以形成如下图所示的树状结构。

Android 视图树状结构关系

阅读更多

Android内部分享[11]——创建弹框DialogFragment和AlertDialog

对话框是一个小窗口,提示用户做出决定或输入附加信息。对话框不会填满屏幕,通常用于一些在用户执行某些操作前的提前选择。

日期和时间对话框

Dialog 类是对话框的基类,但是我们不应该直接去实例化一个 Dialog 类,而是要实例化它的子类:

  • AlertDialog:可以显示标题、最多三个按钮、可选项目列表或自定义布局的对话框。
  • DatePickerDialog:带有预定义UI的对话框,允许用户选择日期。
  • TimePickerDialog:带有预定义UI的对话框,允许用户选择时间。

上面这些类定义对话框的结构和样式,但是你应该使用 DialogFragment 作为对话框容器而不是使用上面的 Dialog 子类,DialogFragment 类提供了创建对话框并管理其外观所需的所有控件。使用 DialogFragment 管理对话框可以确保它正确地处理生命周期事件,例如当用户按下后退按钮或旋转屏幕时。DialogFragment 类还允许您将对话框的 UI 作为可嵌入组件重用到更大的 UI 中,就像传统的 Fragment 一样(例如,当您希望对话框 UI 在大屏幕和小屏幕上以不同的方式显示时)。

阅读更多

Android内部分享[10]——Android中Fragment的使用

Fragment 概述

Fragment 表示 FragmentActivity 中用户活动和界面的一部分,也称为界面碎片。你可以在一个 Activity 中包含多个 Fragment 来构建你的 UI 界面,这样你就可以抽取出来一些可以共用的 Fragment 了,Fragment 和 Activity 一样同样具有自己的生命周期,也可以定义自己的事件。

Fragment 必须始终驻留在 Activity 中,并且 Fragment 的生命周期直接受到宿主 Activity 生命周期的影响。例如,当 Activity 处于 paused 生命周期时,其中的所有 Fragment 也将处于 paused,当 Activity 被销毁时,所有 Fragment 也暂停。然而,当一个 Activity 正在运行(它处于恢复的生命周期状态)时,您可以独立地操作每个 Fragment,例如添加或删除它们。当您执行这样一个 Fragment 事务时,您还可以将它添加到由 Activity 管理的后堆栈中,Activity 中的每个后堆栈条目都是片段 transac 的记录

当你创建的 Fragment 作为 Activity 布局的一部分添加时,它位于 Activity 视图层次结构中的 ViewGroup 中,Fragment 定义了自己的视图布局。您可以通过在 Activity 的布局文件中将片段声明为 <fragment> 元素,或者通过将应用程序代码添加到现有的 ViewGroup,将 Fragment 插入到 Activity 布局中。

阅读更多

看完才知道约束布局 ConstraintLayout 原来这么简单

前面两篇介绍了关于 ConstrantLayout 的使用和相关属性 API 的介绍,这一篇我们来实际演示一下各种情况下如何使用,所以说这一篇就是前面两篇的实践,建议你先阅读前面两篇文章。

这一篇是真正的实践,如果你看过前面两篇建议你看一下这一篇,这一篇文章会让你对前面的所学恍然大悟,融汇贯通。

创建第一个约束

我们先打开 Design 面板,然后拖动一个 ImageView 控件到画布:

拖动一个组件到画布演示

接下来设置一个默认图片,我就设置了里面自带的默认背景图片,此时整个界面的代码如下:

阅读更多

Android中约束布局ConstraintLayout的API和属性解析

前面我们已经通过一篇文章《约束布局 ConstraintLayout 的使用》 介绍了如何创建和使用约束布局,今天我们来看一下关于约束布局 ConstraintLayout 的 API 属性,更进一步的了解关于约束布局的详细设置。

ConstraintLayout 继承自 android.view.ViewGroup 允许以灵活的方式定位和调整界面组件的大小。ConstraintLayout 是 Android 中的一个 support 库,你可以从 API level 9 (Gingerbread) 开始在Android 系统上使用它。我们可以使用的约束类型有如下几种:

约束布局相对定位

相对定位是在 ConstraintLayout 中创建布局的基本构件之一。这些约束允许你将给定的小部件相对于另一个小部件进行定位。您可以在水平和垂直轴上约束小部件。

  • 横轴: left 左、 right 右、start 起点和 end 终点。
  • 纵轴:top 顶部、bottom 底部和 text baseline 文本基线。

相对定位示例

阅读更多

Android内部分享[9]——约束布局 ConstraintLayout 的使用

ConstraintLayout 允许您创建具有平面视图层次结构(没有嵌套视图组)的大型复杂布局。它类似于 RelativeLayout,因为所有视图都是根据兄弟视图和父视图布局之间的关系来布局的,但是它比 RelativeLayout 更灵活,并且更容易在 Android Studio 的布局编辑器中使用。

约束布局概述

要在 ConstraintLayout 中定义视图的位置,必须为视图添加至少一个水平约束和一个垂直约束。每个约束表示到另一个视图、父布局或不可见的连接或基准线(对齐线)。每个约束定义视图沿垂直或水平轴的位置;因此,每个视图的每个轴必须至少有一个约束,但通常需要更多约束。

当您将视图放入布局编辑器时,即使没有约束,它也会停留在原来的位置。然而,这只是为了使编辑更容易;如果在设备上运行布局时视图没有约束,则在[0,0] (左上角) 处绘制。

例如:视图编辑器在 A 下方显示视图 C,但它没有垂直约束

例如:视图 C 现在垂直约束在视图 A 之下

虽然缺少约束不会导致编译错误,但布局编辑器将缺少约束作为工具栏中的错误指示。要查看错误和其他警告,单击 “显示警告和错误”。为了帮助您避免丢失约束,布局编辑器可以使用 Autoconnectinfer constraints 特性自动为您添加约束。

阅读更多

Android内部分享[8]——Android系统的应用程序权限申请

Android 中的权限概述

Android 中需要申请权限的目的是保护用户的隐私。如果你的应用程序需要访问用户的敏感数据,必须申请对应的访问权限(如联系人和短信) ,还有一些系统功能的使用也需要申请权限(如摄像头和互联网)。根据功能和安全等级的不同,Android 系统可能会自动授予权限,也可能提示用户确认并同意权限请求。

Android 安全架构设计的一个核心点就是默认情况下没有任何应用程序有权执行任何可能对其他应用程序、操作系统或用户造成不利影响的操作。这包括读取或写入用户的私有数据 (如联系人或电子邮件)、读取或写入另一个应用程序的文件、执行网络访问、保持设备处于清醒状态等等。

接下来我们来看一下 Android 权限的工作原理,包括:权限如何呈现给用户、安装时和运行时权限请求之间的区别、如何执行权限、权限类型及其权限组。

申请Android应用程序权限

应用程序必须通过在应用程序清单(app manifest)中包含 <uses-permission> 标记来公开它需要的权限。例如,需要发送 SMS 消息的应用程序清单中会有下面这一行权限声明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.SEND_SMS"/>

    <application ...>
        ...
    </application>
</manifest>

如果您的应用程序在其清单中列出了普通权限(即不会对用户隐私或设备操作造成太大风险的权限),系统会自动将这些普通权限授予您的应用程序。如果您的应用程序在其清单中列出了危险的权限(即可能影响用户隐私或设备正常运行的权限),例如上面的 SEND_SMS 权限,用户必须明确同意授予这些权限。

阅读更多