您的位置:首页 > 移动开发 > Android开发

知其然不知其所以然之 Hello Android

2016-05-04 14:00 232 查看

问题起源

我们(特指初学者)在最开始学习 Android 变成的时候可能是要来一个类似 Hello,Android 之类的小应用来玩一玩的。不过由于现在的 IDE 如 Android Studio 太过于强大,它帮你处理掉了很多初始化的操作,大大的提升便捷性。不过这也给我们这一些初学者留了一个坑,那么是程序运行了,不过我根本就不知道为什么,呈现一脸懵逼状。因为不想得过且过,于是便有了这篇博客。

Step By Step

既然是要知其所以然,那么我们就要避免 IDE (在下文中特指 Android Studio,简称 AS)帮我们做太多事情。在新建项目的时候我们要选择 Add No Activity 。项目打开后,我们会发现项目的文件组织简洁了许多。诶,这就是我们要的效果。

新建 Activity

首先,我们得先给我们的项目加一个 Activity,AS 在新建项目的时候已经帮我们把包(Package)给建立好了,所以只需要在包下面新建一个类,继承 Activity。同时,为了保证重新开始的纯粹性,我们在新建的时候,我们不选择 New -> Activity ,而是选择 New -> Java Class,这样就可以避免 AS 修改我们的 AndroidManifest.xml 文件。

接下来,我们让我们的类继承 Activity,并且重写 onCreate 方法(之所以要这样是因为 Activity 的生命周期决定的,这个我们在后续的博客中会说明):

public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle saveInstanceStace) {
super.onCreate(saveInstanceStace);
}
}


好,这些代码里面的 Bundle 啊什么的我暂时是不知道是什么东西的,不过初学的时候就不要拘泥于太多的细节问题,但是也不要得过且过,最主要的是要摸清整个的思路。这个是我一直以来的奉行的学习方法。

我们已经有一个 Activity 了,不过这个 Activity 究竟长什么样呢?诶,我们可以进入下一步了。

给 Activity 打扮 —— XML

Android 推荐的做法是界面代码与逻辑代码分离,所以我们必须要在别的地方来定义我们的 App 的界面。在 AS 里面,具体的位置是 res/layout,不过现在这个文件夹还不存在,所以我们要新建它。同样的原因,我们不选择 Android resource directory,而是直接选择 Directory,新建一个名为 layout 的文件夹(注意注意:如果你把 AS 的项目的文件展现方法设置成 Android 的话,那么你的新建的文件夹如果不叫 layout,那么是在 res/ 下面是显示不出来的,因为它不符合 Android 的标准。)。接下来,我们还要来新建一个 XML 文件。然后输入一下的代码:

<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:layout_height="match_parent"
android:layout_width="match_parent"
android:text="@string/hello" />
</LinearLayout>


没什么好说的,主要是里面的 TextView 的 text 属性有一个 @string/hello 的东西,这个就涉及到 Android 的第二个原则了,尽量避免硬编码。其实这个跟我们 C 语言的避免 Magic number 是一个道理的。推荐的做法是将我们的值存储在类似 res/values/strings.xml 里面,然后通过 Key-Value 的做法来将值导入进来。所以这里就显现了 XML 文件在 Android 的两个作用了(至少我是这么认为的):

首先,最重要的,当然就是定义界面布局

其次,就是存储数据,这也是 W3C 里面对 XML 的一个作用说明

打通逻辑代码与界面

好了,我们有了逻辑代码和界面布局了,如何将他们连接起来呢?诶,就是要在逻辑代码中加载我们的界面布局,挺简单的,只需要在 onCreate 方法中加入一句代码:

public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle saveInstanceStace) {
super.onCreate(saveInstanceStace);
setContentView(R.layout.first_layout);
}
}


这样就打通了这两者的关系了。

好耶好耶,打通了,我们运行一下。咦,怎么报错啊:

Could not identify launch activity: Default Activity not found
Error while Launching activity

我们还差临门一脚,注册。

注册

其实注册就是一个对外展示自己的一个流程,最重要的文件就是 AndroidManifest.xml 文件(所以我们在上面才尽量地手动操作,防止 AS 修改这个文件 :-))。具体这个文件的描述我就不细说了,主要是为了让我们的 Activity 变成主 Activity,也就是上面报错的原因,系统需要一个默认的 Activity,在我们点击 App 图标时候展现在屏幕上。具体是在注册 Activity 的时候加入 intent-filter,而且必须是下面这两句:

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>


具体为什么我还不是很清楚,不过当我们点击 Run 的时候,确实能够运行了!

好了,我们就这样走完了整个流程了。清晰了许多吧~

P.S. 我发现在上面的代码运行了之后是没有标题栏的,但是如果把我们的类的基类改成 AppCompatActivity 的话,标题栏就奇迹般地出现了,暂时不知道为什么。

知其然知其所以然,我是 simowce。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android android studio