安卓第六夜 凡高的自画像

作者: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" >
    <LinearLayout
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" >
      <LinearLayout
        android:id="@+id/input1"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name" />
        <EditText
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="full name" />
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/input1" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Blog Address" />
        <EditText
            android:id="@+id/url"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="url" />
    </LinearLayout>
  </LinearLayout>

  <TextView
      android: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存储数据

我们现在来为视图编写SelfActivity,以增加数据存储功能。在提交数据后,这个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;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_self_edit);

        // find views
        tvSubmit   = (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);

        // submit
        tvSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = nameInput.getText().toString();
                String url  = urlInput.getText().toString();

                // Save to Shared Preferences
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putString("name", name);
                editor.putString("url", url);
                editor.commit();

                // End Current Activity
                SelfEditActivity.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" />

    <Button
        android: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;

    @Override
    protected 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(){
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SelfEditActivity.class);
                MainActivity.this.startActivity(intent);
            }
        });
    }

    @Override
    protected 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快速教程”系列文章

安卓第六夜 凡高的自画像,布布扣,bubuko.com

时间: 2024-12-29 06:53:03

安卓第六夜 凡高的自画像的相关文章

安卓第七夜 雅典学院

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我之前只使用了一种持续保存数据的方法,即SharedPreferences.然而,SharedPreferences只能存储少量松散的数据,并不适合大量数据的存储.安卓带有SQLite数据库,它是一个简单版本的关系型数据库,可以应对更复杂的数据存取需求.我将在这里说明安卓中该数据库的使用方法.这里只专注于安卓中SQLite数据库的接口使用,并没有深入关系型数据库和SQL语言的背景

安卓第八夜 玛丽莲梦露

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上一讲说明了数据库中存取数据的方法.这一讲将以条目的视图方式,来以相似的视图方式,显示多个数据对象.这种方式特别适合于显示从数据库中取出的多个结构相似的数据,比如多个联系人,或者多个联系人分类. <玛丽莲梦露>,这是一副现代艺术作品.听到玛丽莲梦露自杀的消息后,现代艺术家沃霍尔深为震惊.他通过重复玛丽莲梦露的形象,创作了这幅波普艺术的名作.每一个形象既是重复,又有变化. 描述

安卓第五夜 维纳斯的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前各讲中,分别讲解了安卓的开发环境.架构和基本概念.从这一讲开始,我将制作一个简单的应用,并通过逐步升级它的功能,连带出安卓开发的多个情境. <维纳斯的诞生>是文艺复兴早期名画.相传美神维纳斯从海的泡沫中诞生,波提切利用大胆的笔触描绘这一古典神话.画面洋溢着对人体和美的热爱.如果在中世纪或者西班牙宗教审判时期,这幅画足够波提切利上火刑架了. 任务描述 我将制作一个简单的欢迎页

RocketMQ源码 — 六、 RocketMQ高可用(1)

高可用究竟指的是什么?请参考:关于高可用的系统 RocketMQ做了以下的事情来保证系统的高可用 多master部署,防止单点故障 消息冗余(主从结构),防止消息丢失 故障恢复(本篇暂不讨论) 那么问题来了: 怎么支持多broker的写? 怎么实现消息冗余? 下面分开说明这两个问题 多master集群 这里强调出master集群,是因为需要多个broker set,而一个broker set只有一个master(见下文的"注意"),所以是master集群 broker有三种角色:ASY

安卓开发中遇到耗电量高的问题解决方案

在安卓开发中,遇到bug是可以修复的,通过日志,或者调试各种方法都是可以解决的.但是耗电量高的问题,你又如何解决的呢? 这个问题第一次遇见,会觉得无从下手,没有丝毫的头绪.但问题出现了,必须要硬着头皮去解决了. 首先先检查手机什么最耗电,手机设定->更多->电池,看到了哪些应用耗电的情况.确定耗电的事实. 其次,我们要检查为什么它这么耗电,建议你下个超级终端,这就要有些linux的知识了,运行top -m 5 -t, 显示出按cpu大小列出5个进程列表.可以看到是哪个进程,cpu的使用率高,相

安卓第十夜 亚当的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上一讲介绍了用WebView来抓取一个网页内容.这一讲我将介绍如何在安卓内部直接进行HTTP通信. <亚当的诞生>,西斯廷礼拜堂的吊顶画,米开朗基罗之作.当时的教皇强迫沉迷于雕塑的米开朗基罗画巨幅壁画.米开朗基罗认为这是在浪费自己的才华,充满愤怒的作画.当然,他又成功了. 描述 这一讲中,我将使用JSON,将数据库备份到远程的数据库中.反过来我也将从远程数据库中抓取条目,并放入

老师你好。使用cordova生成的hellowold 的安卓5.0版本太高。怎么才可以生成4.4的呢?

你好 在你的应用目录,有个config.xml文件,课程没有介绍每个配置项.你可以增加一项 preference name="android-targetSdkVersion" value="13" </preference></preference> 设置目标SDK版本.  不过你也不需要这么做, 因为你可以打开 platformsandroidAndroidManifest.xml  文件可以看到 <uses-sdk android

是男人就下100层【第六层】——高仿豆瓣客户端

前一段时间阳光小强安装了一个豆瓣客户端,第一次打开就被这种界面风格吸引了,今天早上起来在打开豆瓣听音乐的时候,突然产生一个念头,来试着实现一下这种效果,打开客户端分析了一下发现其实这种效果的实现并不是想象中的那么难,下面我先分析一下这种效果的实现思路,然后一步步解释实现的过程,希望大家能提出意见和建议,一起交流学习. 先给大家展示一下我的成果吧: 其实豆瓣客户端的界面上还有其他的文字和菜单,但是这两个的实现效果和其他几个类似,可以作为代表,所以就不绘制那么多组件了. 转载请说明出处:http:/

安卓4.4上adb高权限相关几个系统属性

仅当编译adb时有ALLOW_ADBD_ROOT宏,才可能有高权限. ro.debuggable:为1时,允许adb root,然后能adb remount,从而有高权限.如果编译时不定义ALLOW_ADBD_ROOT,则虽然能adb root,但是不能adb remount,仍没有高权限. ro.secure:为0时,允许adb remount,改变取值后,adb调试要重新打开才能生效. ro.adb.secure:决定是否在使用adb时需要询问用户进行鉴权. ro.allow.mock.lo