作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

在上一讲中,我已经制作了一个简单的Android应用。项目的主要文件包括:

  • MainActivity.java
  • activity_main.xml

在这一讲,我将拓展应用的功能,从而允许用户输入个人信息。

《自画像》,凡高。凡高一生不得志,精神更是越来越差。在割掉自己的耳朵一部分后,画家给自己留下了这幅自画像。在当时,这幅画依然是无人问津。

描述

我将创建一个新的Activity。这个界面允许用户输入本人的姓名和博客地址。这些输入数据将在会保存起来。在主界面中再次调出数据,并显示。相关知识点包括:

  • 启动Activity。利用Intent,启动一个新的Activity。
  • 文本输入。增加EditText输入栏,让用户输入文本信息。
  • 数据存储。将数据存入SharedPreferences,跨Activity读取。

创建新的项目文件

我们将在应用项目中增加新的文件。在ADT的文件导航栏中右键点击文件夹,选择New->Other后,可以得到下面的对话框:

你可以在这里选择想要创建的新文件的类型,比如XML文件,Java文件等。安卓会根据你选择的类型,做一些默认设置。比如选择Android Activity后,在AndroidManifest.xml中自动注册该Activity,从而省去用户的麻烦。

新Activity的界面

我们要设计一个用于输入姓名和博客地址的安卓界面。由于姓名和博客地址都是字符串类型,因此我们可以借助EditText类的View元素,来增加字符串类型的输入栏。我们还需要提交功能。按钮是最容易想到的方式。这里,我没有使用按钮,而是为一个TextView增加点击事件监听。

这个视图的XML布局文件为activity_self_edit.xml,如下:

<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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin" ><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content" ><LinearLayoutandroid:id="@+id/input1"android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Name" /><EditTextandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="full name" /></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/input1" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Blog Address" /><EditTextandroid:id="@+id/url"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="url" /></LinearLayout></LinearLayout><TextViewandroid:id="@+id/submit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="Submit" />
</RelativeLayout>

这里使用了RelativeLayout来布局。我们可以在该布局下,说明元素的相对位置。TextView就使用了layout_alignParentBottom属性,来说明它的下边缘将对齐母元素的下边缘。此外,这里还嵌套使用了LinearLayout。

用SharedPreferences存储数据

我们现在来为视图编写SelfEditActivity,以增加数据存储功能。在提交数据后,这个Activity将通过EditText的getText()方法获取字符输入。提交的字符串将使用SharedPreferences存储起来。

SharedPreferences以键值对(key-value pair)的方式存储数据。在写入时,我们需要说明数据对应的键。在读取时,我们将根据键,来获得对应的数据值。数据可以在整个应用范围内调用。特定权限下,SharedPrefereces可以跨应用使用。SharedPreferences简单易用,适合存储少量的、结构松散的信息。

package me.vamei.vamei;import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;public class SelfEditActivity extends Activity {private EditText nameInput;private EditText urlInput;private TextView tvSubmit;private SharedPreferences sharedPref;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_self_edit);// find viewstvSubmit   = (TextView) findViewById(R.id.submit);nameInput  = (EditText) findViewById(R.id.name);urlInput   = (EditText) findViewById(R.id.url);sharedPref = this.getSharedPreferences("me.vamei.vamei", Context.MODE_PRIVATE);// submittvSubmit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String name = nameInput.getText().toString();String url  = urlInput.getText().toString();// Save to Shared PreferencesSharedPreferences.Editor editor = sharedPref.edit();editor.putString("name", name);editor.putString("url", url);editor.commit();// End Current ActivitySelfEditActivity.this.finish();}});}
}

Context对象的getSharedPreferences()获得SharedPrerences。第一个参数"me.vamei.vamei"说明了该SharedPreferences对象所在的文件名,第二个参数说明了权限,即只能该应用范围内私用。使用SharedPreferences.Editor类对象写入数据时,我们调用了putString()方法,以存储字符串类型的数据值。commit()方法将执行写入。

最后,Activity Context的finish()方法结束当前Activity。

从一个Activity启动另一个Activity

我现在要把MainActivity和新的SelfEditActivity用Intent串联起来。MainActivity对应的布局为activity_main.xml,如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><TextView android:id="@+id/welcome"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/author"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Edit Profile" />
</LinearLayout>

TextView用于显示用户信息。Button用于启动上面定义的SelfEditActivity。

修改MainActivity。相对于上一讲,这里主要增加了两个功能。一个功能是监听按钮,在按钮点击后启动SelfEditActivity。另一个功能是从SharedPreferences中获得存储的键值,即用户名,再将用户名信息更新到界面上。

package me.vamei.vamei;import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity {private SharedPreferences sharedPref;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sharedPref = this.getSharedPreferences("me.vamei.vamei", Context.MODE_PRIVATE);Button btn = (Button) findViewById(R.id.author);btn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this, SelfEditActivity.class);MainActivity.this.startActivity(intent);}});}@Overrideprotected void onResume() {super.onResume();TextView nameView = (TextView) findViewById(R.id.welcome);// retrieve content from shared preference, with key "name"String   welcome  = "Welcome, " + sharedPref.getString("name", "unknown") + "!";nameView.setText(welcome);}
}

Intent构造器的第一个参数说明了Context,第二个参数显式的说明了想要启动的功能单元,即SelfEditActivity类。startActivity()方法将根据intent参数,创建并启动对应的功能单元。该方法执行后,新的SelfEditActivity将压入栈顶,成为激活的Activity,而MainActivity将暂停。

另一方面,我把数据读取部分放入了onResume()方法。根据安卓的规定,MainActivity第一次运行,以及每次从暂停中复苏时,都会调用该方法。用户在SelfEditActivity修改返回后,就可以立即获得最新的数据。使用getString()方法,从SharedPreferences对象获得键位"name"的值。如果"name"键不存在,将返回默认值"unknown"。

onResume()

最后,用setText()方法,把新的数据加载到视图的TextView中。

运行

在"Edit Profile"中输入用户信息,提交后返回主页面,效果如下:

总结

RelativeLayout, EditText

Intent, startActivity()

getSharedPreferences(), putString, getString()

onResume()

欢迎继续阅读“Java快速教程”系列文章

安卓第六夜 凡高的自画像相关推荐

  1. 3月30日伟大的荷兰画家凡·高诞辰(付:凡·高生平介绍及部分相片)

    简介 文森特·凡·高(Vincent van Gogh, 1853.3.30-1890.7.29)出生在荷兰一个乡村牧师家庭.他是后印象派的三大巨匠之一. 凡·高年轻时在画店里当店员,这算是他最早受的 ...

  2. 凡高书信选读:凡高对自己外貌的描述

    凡高艺术馆 > 凡高的历史 > 凡高书信选 > 凡高对自己外貌的描述 凡高书信选读:凡高对自己外貌的描述 节选自1888年,凡高给妹妹威廉明娜Willemina Jacoba van ...

  3. python中高阶函数map怎么用_python六十课——高阶函数之map

    1.高阶函数: 特点:函数的形参位置必须接受一个函数对象 分类学习: 1).map(fn,lsd1,[lsd2...]): 参数一:fn --> 函数对象 参数二:lsd1 --> 序列对 ...

  4. 动态壁纸安卓_安卓壁纸专为安卓打造,拥有海量高清壁纸,还有精美动态壁纸!...

    今天给朋友们分享一款壁纸APP--安卓壁纸 APP简介 安卓壁纸APP是一款为安卓用户量身打造的手机壁纸软件,有各种各样的图片以及动态壁纸,美女.帅哥.风景.影视.艺术等等,全部都是免费下载,流量耗费 ...

  5. 西方经济学(微观部分)(第六版) 高鸿业 编 中国人民大学出版社 课后习题答案

    更多答案:http://www.daanbar.com/book-info/2176.html 西方经济学(微观部分)(第六版) 高鸿业 编 中国人民大学出版社 第1章 绪论 第2章 需求.供给和均衡 ...

  6. progressblock 安卓自定义进度条 progressbar 高仿仿QQ下载进度条

    progressblock 安卓自定义进度条 progressbar 高仿仿QQ下载进度条 附上我在公司做下载播放项目 主要使用方法 progressBlock = (ProgressBlock) f ...

  7. 定积分华里士公式推广_分部积分法与点火公式|第四十六回|高数(微积分)...

    原标题:分部积分法与点火公式|第四十六回|高数(微积分) 之前几次我们都在讲定积分计算的换元法,换元法对于定积分的计算确实很重要,也非常好用,因为定积分的结果是一个固定的数,所以相比于不定积分的换元法 ...

  8. 阅读书源最新2020在线导入_安卓+IOS|六款高评分手机阅读APP,正版免费看全网才香。...

    很多人都有手机阅读的习惯,可能大家都知道微信读书这个软件,但是它有很多限制,比如需要充钱,需要分享,还要组队领会员卡,有时候也是很烦!那么今天哼哼就给大家整理了下当前免费的而且高评分的阅读软件来安利给 ...

  9. 开源阅读书源_安卓+IOS|六款高评分小说阅读APP,正版免费看全网才香。

    很多人都有手机阅读的习惯,可能大家都知道微信读书这个软件,但是它有很多限制,比如需要充钱,需要分享,还要组队领会员卡,有时候也是很烦!那么今天哼哼就给大家整理了下当前免费的而且高评分的阅读软件来安利给 ...

最新文章

  1. ie7和ie8 select使用jquery clone不兼容处理
  2. SpringMvc4中获取request、response对象的方法
  3. matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇
  4. iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
  5. SAP Commerce Cloud Accelerator theme css 加载的问题和 multi step checkout
  6. 【渝粤教育】广东开放大学 会展营销 形成性考核 (56)
  7. Ext.Net全部Icon图标名称展示
  8. 读书随笔:The Book of Why——CHAPTER 1:The Ladder of Causation
  9. 处理PHP字符串的10个简单方法
  10. Lesson2.2 2.3 Maya command reference quick help
  11. $.ajax跳入error之 async
  12. Visual SourceSafe Explorer界面出现乱码+字体翻转
  13. 17.安全点与安全区
  14. 什么是世界协调时间UTC
  15. 【专栏推荐】硅谷产品实战36讲
  16. Domain generalization 简介
  17. uni-app开发经验分享二十二: uni-app大转盘思路解析
  18. python 模拟微信浏览器请求_用chrome在电脑上模拟微信内置浏览器
  19. Android 性能优化之内存泄漏,使用MATLeakCanary解决问题
  20. 机器学习 决策树篇——解决离散变量的分类问题

热门文章

  1. C++实现对象序列化和反序列化(读写二进制文件)操作
  2. mysql8 修改root密码
  3. Django之Ajax刷新记住用户名
  4. 20181127-1 附加作业 软件工程原则的应用实例分析
  5. jmeter--正则提取json串中一个大括号对象里指定字段值的的另一个字段的值
  6. 近日的思绪(外三首)
  7. 存储系统又慢又杂太难用?我们推荐这几本书帮你解决问题
  8. 吊炸天的 Kafka 图形化工具 Eagle,必须推荐给你!
  9. 加速 SpringBoot 应用开发,官方热部署神器真带劲!
  10. 滴滴CTO五轮面试真是太刺激了,Java高级工程师一二三四五面面经(已拿到offer)...