《第一行代码 Android》学习记录(二)

本来计划是每天学习一章,然后做笔记。这都过了六天了,才想到继续写。
病症:拖延症。解药:坚持,改变。

                聚焦于习惯,而不是目标。
解释:在什么时候能可以达成目标以及距离目标还有多远等不确定性的压力之下,
你反而可能会一无所获。
目标是一种理想,你不知道他到底有多远。
而习惯是一步一脚印,你知道按照这个“脚(xi)印(guan)”,你早晚会实现目标。
所以说,应该是聚焦于习惯,而不是目标。
‘坚持’下来的,才是习惯。

第二章 先从看得到的入手,探究活动

所有学习Android的菜鸟,知道的第一个Android组件应该就是Activity。我们称它为活动。

2.1 活动是什么

活动(Activity):它是一种可以包含用户界面的组件,主要用于和用户进行交互。

2.2 活动的基本用法

  • 手动创建活动
  1. 我们需要新建一个类(必须按照命名规范来命名类名),让它继承Activity。
  2. 我们需要重写Activity的onCreate()方法。

上代码:

package com.magee.diyihang_demo01;

import android.app.Activity;
import android.os.Bundle;

public class FirstActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

  • 创建和加载布局

活动(Activity)有了,但是我们还需要对应的布局才能显示界面内容。

  1. 在res/layout目录下New一个Android XML File。
  2. 给我们的布局文件命名(要按照规范来)。

来看看我们布局文件的代码:

<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"
    tools:context="com.magee.diyihang_demo01.FirstActivity" >

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

让我们认识一下布局中的几个属性:

  1. android:id 是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。(再啰嗦一下,命名规则要规范)
  2. android:layout_widthandroid:layout_height 是指定当前元素的宽度和高度,可以选择"wrap_content"(包裹内容),"match_parent"(和父元素一样宽或者高),"fill_parent"(它的意思是跟match_parent相同的)。

好了,我们的布局也建好了,现在我们需要把建好的布局扔给我们的Activity。我们需要在Activity中加一行代码:

package com.magee.diyihang_demo01;

import android.app.Activity;
import android.os.Bundle;


public class FirstActivity extends Activity {

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

我们用到了setContentView(R.layout.activity_first);而传给它的参数正是我们刚建好的布局文件的id。

  • 在AndroidManifest文件中注册

我们知道,所有的活动都要在AndroidManifest.xml中进行注册才能生效。
上代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.magee.diyihang_demo01"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".FirstActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

看到上面的代码,你应该灰常凌乱了。刚开始我也很凌乱。。。

我们从上面开始一个一个分析:

1.package="com.magee.diyihang_demo01": 这个一看就懂,这不是咱们的包全名吗。

2.下面这两个,新手会经常搞混。
*** android:versionCode="1"***
android:versionName="1.0"
首先versionCode是int类型的,这个东西用户看不见,我们在代码中用它做判断当前应用是不是最新版本。
而versionName是String类型的,就给用户看的。用户以此来判断当前版本和应用市场中的版本哪个是最新的。一般versionName会有很多点,例如android:versionName="4.1.4"

3.<uses-sdk/>这个节点用于定义要想正确的运行应用程序,设备上必须具有的最低和最高SDK版本,以及为应用程序设计的目标SDK,这分别通过使用 minSDKVersion,maxSDKVersion,targetSDKVersion属性设置。
通常我们都不会给我们的应用设置maxSDKVersion(也就是最高SDK版本)这个限制。

4.<application/> 一个Manifest只能包含一个application节点。它使用各种属性来指定应用程序的各种元素数据(包括图标,标题和主题)。

android:allowBackup和android:debuggable建议设置为“false”

详情请看:详解Android App AllowBackup配置带来的风险

这三个就没什么难度了
android:icon="@drawable/ic_launcher"(图标啦。。。)
android:label="@string/app_name"(标题啦。。。)
android:theme="@style/AppTheme"(主题啦。。。)

<application/>节点还可以作为一个包含了Activity,Service,Content Provider和Broadcast Receiver节点的容器,它包含的这些节点指定了应用程序组件。

<activity/> 应用程序内的每一个Activity都要求有一个activity标签,并使用Android:name属性来指定Activity类名。
启动任何一个没有在Manifest中定义的Activity时都会抛出一个运行时异常。
在指定Activity的类名时,可以使用句点号uowei简写方式,代替应用程序的包名。例如:
android:name="com.magee.diyihang_demo01.FirstActivity"等于android:name=".FirstActivity"

<intent-filter/>每个Activity节点都允许使用Intent-filter子标签来定义用于启动该Activity的Intent。
<action
android:name="android.intent.action.MAIN"/>

<category
android:name="android.intent.category.LAUNCHER" />

android.intent.action.MAIN决定应用程序最先启动的Activity 
android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里```

* #####隐藏标题栏

public class FirstActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_first);
}

}

>注意:***requestWindowFeature(Window.FEATURE_NO_TITLE);***一定要在 ***setContentView(R.layout.activity_first);***前执行,否则会报错。
其实现在大多数标题栏都是自定义的组件,只要在不需要的时候***visibility=gone***就可以了。

* #####在活动中使用Toast
>Toast:是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失并且不会占用任何屏幕空间。

首先了解一下怎么往外吐司(Toast):
* 我们需要Toast的静态方法makeText()。
makeText()有三个参数。
  1. 第一个参数是Context,也就是Toast要求的上下文。由于活动本身就是Context对象,所以我们直接传入FirstActivity.this即可。
 2. 第二个参数是Toast显示的文本内容,他是String类型的。
 3. 第三个参数是Toast的显示时长,这里可以直接输入int类型的整数,也可以用内置的两个常量Toast.LENGTH_SHORT和Toast.LENGTH_LONG,当然意思很明确,一个短显示吐司,一个是长显示吐司。

* 最后别忘了,我们要show()一下才能显示吐司。

上代码:

public class FirstActivity extends Activity {

private Button btn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_first);
    
    btn=(Button) findViewById(R.id.btn);
    btn.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            Toast.makeText(FirstActivity.this, 
            "我吐,我吐,我吐吐吐司!", 
            Toast.LENGTH_LONG).show();
        }
    });
}

}

Button的点击事件我就暂时跳过了,在以后的章节中会详细的再学习一遍。简单的用,就是按照上面的代码来写就可以了。

* #####在活动中使用Menu

>Menu:也就是菜单,这里不会按照书上写的走,因为这也是我的弱项,所以尽量详细的讲解。

```菜单(Menu)可以在提供应用程序功能的同时不牺牲有价值的屏幕空间。```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容