本来计划是每天学习一章,然后做笔记。这都过了六天了,才想到继续写。
病症:拖延症。解药:坚持,改变。
聚焦于习惯,而不是目标。
解释:在什么时候能可以达成目标以及距离目标还有多远等不确定性的压力之下,
你反而可能会一无所获。
目标是一种理想,你不知道他到底有多远。
而习惯是一步一脚印,你知道按照这个“脚(xi)印(guan)”,你早晚会实现目标。
所以说,应该是聚焦于习惯,而不是目标。
‘坚持’下来的,才是习惯。
第二章 先从看得到的入手,探究活动
所有学习Android的菜鸟,知道的第一个Android组件应该就是Activity。我们称它为活动。
2.1 活动是什么
活动(Activity):它是一种可以包含用户界面的组件,主要用于和用户进行交互。
2.2 活动的基本用法
-
手动创建活动
- 我们需要新建一个类(必须按照命名规范来命名类名),让它继承Activity。
- 我们需要重写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)有了,但是我们还需要对应的布局才能显示界面内容。
- 在res/layout目录下New一个Android XML File。
- 给我们的布局文件命名(要按照规范来)。
来看看我们布局文件的代码:
<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>
让我们认识一下布局中的几个属性:
- android:id 是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。(再啰嗦一下,命名规则要规范)
- android:layout_width 和 android: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 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)可以在提供应用程序功能的同时不牺牲有价值的屏幕空间。```