使用 ProgressDialog 实现加载提示

在进行一些耗时操作的时候,经常需要加载提示框来提醒用户当前在进行耗时操作,需要等待。 而实现这样一个加载框十分简单。 构建 ProgressDialog 对象 你可以在耗时操作开始前临时建立新的 ProgressDialog 对象,你也同样可以在 Activity 中构建 ProgressDialog 的引用,并在 OnCreate 方法内构建实体,在需要的时候直接显示和隐藏。 其中前者相对灵活,但是使用范围有限,后者使用范围较广,但是可以会使得 OnCreate 中的代码较为繁琐。 但是,不管使用那种方法,ProgressDialog 的构建都是非常简单。 ProgressDialog progressDialog; progressDialog = new ProgressDialog(MainActivity.this); // ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setTitle("This is Title"); progressDialog.setMessage("This is Message"); progressDialog.setCancelable(true); 其他属性可自行探索或者查阅官方文档 显示加载框 在耗时操作开始前(或者任何你想要显示提示框的地方),通过以下操作显示加载框: progressDialog.show(); 关闭提示框 在耗时操作关闭时(或者任何你想要关闭提示框的地方),通过以下操作关闭加载框: progressDialog.hide(); 很简单不是吗又水了一期,不过好像没人看我的博客

二月 20, 2020 · Aimer Neige

使用 LiveData 优雅地管理布局显示的数据

ViewModel 提供了一个可以管理数据的优雅的容器,但是它也只是存储数据而已,并不能对数据进行处理,只是存储数据而已,但是如果使用 LiveData 来辅助, ViewModel 不再只是存储数据,它本身也能处理界面内容,就像它的名字一样,能让数据活起来。 在 ViewModel 中构建 LiveData 对象 与 ViewModel 不同, LiveData 不需要构建类,直接在 ViewModel 中创建对象即可。 首先创建 ViewModel 对象,然后在 ViewModel 对象中创建 LiveData 字段 package com.aimerneige.livedatatest; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class ViewModelWithLiveData extends ViewModel { private MutableLiveData<Integer> LikedNumber; } 然后为 LiveData 对象构建 get 方法 // May Cause Error public MutableLiveData<Integer> getLikedNumber() { return LikedNumber; } 要注意的是构建的对象如果没有构建的话是为空的,直接返回会有空指针错误,所以要对空指针进行处理。 在构造方法中解决 // One possible wey to make the LikedNumber not null ViewModelWithLiveData () { LikedNumber = new MutableLiveData<>(); LikedNumber....

二月 20, 2020 · Aimer Neige

使用 ViewModel 管理布局上的数据

如果不进行处理的话,布局上的临时数据可能会因为屏幕反转,切换系统语言等而消失,但是处理过程略微繁琐,较为麻烦,但是谷歌为我们提供了一种更加简洁的方式来管理界面数据,那就是 ViewModel。 构建自己的 ViewModel 类 新建 Java 类,继承至ViewModel,名字自定义,这里以MyViewModel为例。 package com.aimerneige.viewmoudeltest; import androidx.lifecycle.ViewModel; public class MyViewMoude extends ViewModel { } 新建好类之后,直接将需要用到的数据填写在内部,可以直接使用 public 的数据类型(不推荐),或者使用 private 数据加 get 方法。 package com.aimerneige.viewmoudletest; import androidx.lifecycle.ViewModel; public class MyViewMoude extends ViewModel { public int number = 0; public String test = "Test for 100"; private int age = 0; public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 然后把ViewModel当成一个智能地存储数据的结构体使用即可。...

二月 20, 2020 · Aimer Neige

ToolBar

MaterialDesign 依赖库 implementation 'com.google.android.material:material:1.1.0' 在布局文件中加入 TooBar <androidx.appcompat.widget.Toolbar android:id="@+id/toolBar" android:layout_width="match_parent" android:layout_height="wrap_content" <!--其他属性设置--> /> 关于旧版的说明 旧版需要使用兼容包 compile 'com.android.support:appcompat-v7:23.1.1' 使用以下布局方法 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="标题" android:textSize="20sp"/> </android.support.v7.widget.Toolbar> 很多文章都是这么写的,此处代码也是拷贝的,但是在开发中出了一些问题,博主是没有成功运行,仅供参考,挂了请自行查阅资料,不做解释。这里主要介绍新版 ToolBar 的使用 在 MainActivity 中引用 Toolbar Toolbar toolbar = findViewById(R.id.toolBar); 使用 ToolBar 作为界面布局 toolbar.setTitle("AppBarLayoutTest"); setSupportActionBar(toolbar); 导包的时候导这个,不要导错了,否则会报错 import androidx.appcompat.widget.Toolbar; 添加自定义属性 按需添加自定义属性,可以修改的内容包括标题的文字、图标、颜色等。不详细介绍,官方文档里很详细。 官方文档:https://developer.android.com/reference/android/widget/Toolbar 添加菜单 构建菜单的布局文件 这里添加的 item 会按顺序显示在 ToolBar 上面。 showAsAction 属性: always:总是显示 ifRoom:空间足够时显示 never:永不显示(收纳在右侧的三条横线那个更多按钮里) <?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"> <item android:id="@+id/toolbar_setting" android:icon="@drawable/ic_setting" android:title="@string/toolbar_setting" app:showAsAction="always" /> <item android:id="@+id/toolbar_about" android:title="@string/toolbar_about" app:showAsAction="never" /> <item android:id="@+id/toolbar_exit" android:title="@string/toolbar_exit" app:showAsAction="never" /> </menu> 在主菜单中引用菜单的布局文件 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater()....

二月 18, 2020 · Aimer Neige

使用 Gson 解析 Json 数据

新建项目 导入 Gson 依赖 implementation 'com.google.code.gson:gson:2.8.5' 设计布局 这里设计俩个 TextView 和一个 Button,点击 Button 后发送 Http 请求获取 Json 数据,并且通过 Gson 进行解析,将解析结果显示在 TextView 上,以此验证解析成功。 <?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="match_parent" android:orientation="vertical"> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nodata"/> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nodata"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test"/> </LinearLayout> 代码很简单就不多解释了。另外 在 Activity 中注册控件 的内容也省略。 发送 Http 请求并获取数据 操作同一般的 HTML 源码获取,这里不多解释。由于保存在网络上的 Json 数据其源码就是合法的 Json 字符串,因此通过解析网页源码的方法获取的内容就是 Json 数据。这里有一个网页保存了 Json 数据,可用于测试。 https://user.moecraft.net:8443/API/Mc/authlib/ 获取源码之后将其保存在一个字符串内即可继续进行下一步操作。此处命名为 jsonData。 利用 GsonFormat 插件生成映射对象 具体操作方法不解释了,具体看之前发布的博客文章。这里新建的类命名为 ApiTest 。...

二月 17, 2020 · Aimer Neige

Ubuntu 19.10 配置 Kotlin 开发环境

Ubuntu 19.10 配置 Kotlin 开发环境 使用工具 VSCode 安装 Kotlin 编译器 sudo snap install kotlin --classic 如果出现错误,执行以下命令: sudo apt install snap 这条指令执行后,系统安装的内容有: kotlinc kotlinc-jvm kotlinc-js kotlin-dce-js 可以通过以下指令查看版本,如果有输出证明安装成功。 俩条指令都可以,建议使用上面的。 kotlin -version kotlinc -version 安装插件 这俩个貌似安装一个就可以了,也可以都安装。 Kotlin Kotlin Language 安装下面这个插件后在 文件 -> 首选项 -> 设置 -> 扩展 -> Run Code Configuration 中找到并勾选 Run In Terminal Code Runner 测试 建立新文件 HelloWorld.kt fun main(args: Array<String>) { println("Hello, World!") } 通过点击右上角三角形(由 Code Runner 提供的快捷方式)来编译运行,查看输出。 如果看到终端输出 Hello, World!...

二月 16, 2020 · Aimer Neige

设置网络图片

通过网络连接获取图片信息,并将其设为软件的 ImageView 图片属性 介绍: 与获取 HTML 类似,首先需要建立网络连接并获取数据,只是这次不通过 String 获取保存数据,而是使用 Bitmap 保存。 与获取 HTML 数据类似,联网操作同样需要新建线程,要注意的是在子线程不能操作 UI,需要通过外部函数设置图片或者在函数返回 Bitmap 对象使用。 核心代码: 建立网络连接,这里使用 HttpURLConnection URL url = new URL("https://www.example.com.img") HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // ...... // 诸如超时时间等的设置 处理返回数据 InputStream is = connection.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); 设置控件,注意该操作不能在子线程中进行 imageView.setImageBitmap(bitmap); 完整代码 代码很烂,有很多可以优化的地方 //设置网络图片 public void setUrlImage(final int ImageViewId, final String address) { //开启一个线程用于联网 new Thread(new Runnable() { @Override public void run() { try { //把传过来的路径转成URL URL url = new URL(address); //获取连接 HttpURLConnection connection = (HttpURLConnection) url....

二月 16, 2020 · Aimer Neige

使用 GsonFormat 插件快速构建 Json 映射对象

插件安装 File Settings Plugins Marketplace 在搜索框输入 GsonFormat 搜索 安装相应插件 根据提示重启 IDE 使用方法 新建实体类 ALT + Insert 或者 右键->Generate 选择 GsonFormat 将待解析 Json 字符串输入弹出的对话框 OK

二月 16, 2020 · Aimer Neige

Swiperefreshlayout

GoogleDoc GoogleGithub 声明依赖项 直接复制官方文档,不多解释了(懒 在应用或模块的 build.gradle 文件中添加所需工件的依赖项: dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" } 如需详细了解依赖项,请参阅添加编译依赖项。 添加布局 在 xml 布局文件中添加 SwipeRefreshLayout,并将 WebView 内嵌在 SwipeRefreshLayout 中。 布局这里拷贝了别人的代码,结果软件闪退,搞了半天找不到原因,重开了一个项目,根据代码提示写了一份居然可以运行,分明代码一样的,好迷啊。。。。。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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=".MainActivity"> <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </LinearLayout> SwipeRefreshLayout 类似 ScrollView,内部只能有一个部件,但是你可以这样玩、(手动滑稽 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> </LinearLayout> </ScrollView> 编写代码部分 先放一个完整的源码,看不懂直接跳过,下面介绍关于 Swiperefreshlayout 的核心代码...

二月 1, 2020 · Aimer Neige

如何安装 Ubuntu

前言 之前由于感兴趣而涉足 Linux 领域,在虚拟机内尝试了 Ubuntu,可惜虚拟机内性能有限,于是以双系统的形式安装了 Ubuntu18.04。 经过一段时间的使用后,感觉 Ubuntu 完全可以作为日常系统使用,于是放弃了 bug 不断的 Windows 系统,做好备份后直接全盘安装了 Ubuntu 系统,Windows 下的软件找不到替代品就转向虚拟机使用。 个人感觉 Ubuntu 是完全可以替代 Windows 日常使用的,以下是 Ubuntu 相比于 Windows 的一些优点和不足 优点 更加稳定 更加安全 不会整天提醒你更新系统 配置开发环境仅需几行终端指令 忘记恼人的弹窗广告和流氓软件吧 不足 很多软件不支持 Linux,只能在 Windows 上运行 几乎 90% 的游戏都不支持 Linux 需要学习命令行 界面丑 对策: Windows 下的软件可以直接在虚拟机下运行,不想挂个虚拟机的话也可以考虑使用 Wine 游戏还是不要玩了,装个 Ubuntu 学 Linux 顺带还能帮你戒游戏,实在需要玩游戏的可以使用双系统 命令行也不是特别难,遇到问题谷歌一下就行了 至于界面丑,我指的是 Ubuntu18.04 及 之前的版本,这些问题可以通过安装主题和图标包来解决,而最新的 Ubuntu19.10 界面还是十分惊艳的 Ubuntu 的安装 访问 Ubuntu 官网下载最新的镜像文件 使用 Etcher 写入 U 盘作为启动盘 通过 U 盘启动系统...

一月 24, 2020 · Aimer Neige