Android学习笔记之——Activity

之前博客《Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述》介绍过活动是所有Android应用程序的门面,凡是在应用中看得到的东西都是放在活动中的(也即与用户交互,UI)

目录

创建一个新的activity

创建和加载布局

在AndroidManifest文件中注册

在活动中使用Toast

在活动中使用Menu


创建一个新的activity

由于Android Studio在一个工作区间内只允许打开一个项目,因此首先需要将当前的项目关闭,点击导航栏File→Close Project。

然后再新建一个Android项目,在此处,不再选择Empty Activity这个选项,而是选择Add No Activity,因为这次我们准备手动创建活动

项目名可以叫作ActivityTest,包名我们就使用默认值com.example.activitytest

路径改一下

点击Finish,等待Gradle构建完成后,项目就创建成功了。

项目创建成功后,仍然会默认使用Android模式的项目结构,这里手动改成Project模式

虽然Android studio会自动生成很多文件,但是,app/src/main/java/com.example.activitytest目录应该是空的了

现在右击com.example.activitytest包→New→Activity→Empty Activity

将活动命名为FirstActivity,并且不要勾选Generate Layout File和Launcher Activity这两个选项,如下图所示。

  • 勾选Generate Layout File表示会自动为FirstActivity创建一个对应的布局文件,
  • 勾选Launcher Activity表示会自动将FirstActivity设置为当前项目的主活动,

项目中的任何活动都应该重写Activity的onCreate() 方法,而目前的FirstActivity中已经重写了这个方法,这是由Android Studio自动帮我们完成的,代码如下所示:

package com.example.activitytest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class FirstActivity extends AppCompatActivity {

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

创建和加载布局

Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,因此我们现在就来手动创建一个布局文件。

右击app/src/main/res目录→New→Directory

会弹出一个新建目录的窗口,

这里先创建一个名为layout的目录。然后对着layout目录右键→New→Layout resource file

我们将这个布局文件命名为first_layout,根元素就默认选择为LinearLayout

这是Android Studio为我们提供的可视化布局编辑器,你可以在屏幕的中央区域预览当前的布局。

先来看看text部分

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>

由于我们刚才在创建布局文件时选择了LinearLayout作为根元素,因此现在布局文件中已经有一个LinearLayout元素了。那我们现在对这个布局稍做编辑,添加一个按钮,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_1"   //给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操
//如果你需要在XML中引用一个id ,就使用@id/id_name 这种语法
//而如果你需要在XML中定义一个id ,则要使用@+id/id_name 这种语法


        android:layout_width="match_parent"  //指定了当前元素的宽度(这里选择与父元素一样宽)
        android:layout_height="wrap_content" //指定了当前元素的高度(这里表示当前元素的高度只要能刚好包含里面的内容就行)
        android:text="Button 1"  //元素中显示的文字内容
        />
    
</LinearLayout>
图标出现了

创建完布局后,在onCreate() 方法中加入如下代码,来加载这个布局:

package com.example.activitytest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
    }
}

在AndroidManifest文件中注册

之前博客《Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述》介绍过,所有的活动都要在AndroidManifest.xml中进行注册才能生效,而实际上FirstActivity已经在AndroidManifest.xml中注册过了,我们打开app/src/main/AndroidManifest.xml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".FirstActivity"></activity>
    </application>

</manifest>

活动的注册声明要放在<application> 标签内,这里是通过<activity> 标签来对活动进行注册的。

在<activity> 标签中我们使用了android:name 来指定具体注册哪一个活动

不过,仅仅是这样注册了活动,我们的程序仍然是不能运行的,因为还没有为程序配置主活动,也就是说,当程序运行起来的时候,不知道要首先启动哪个活动。

将文件修改如下:

  1. 首先,在<activity> 标签的内部加入<intent-filter> 标签,并在这个标签里添加<action android:name="android.intent.action.MAIN"/> 和<category android: name="android.intent.category.LAUNCHER" /> 这两句声明
  2. 使用android:label 指定活动中标题栏的内容,标题栏是显示在活动最顶部的。需要注意的是,给主活动指定的label不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

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

</manifest>

这样的话,FirstActivity就成为我们这个程序的主活动了,即点击桌面应用程序图标时首先打开的就是这个活动。另外需要注意,如果你的应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是你无法在启动器中看到或者打开这个程序。这种程序一般都是作为第三方服务供其他应用在内部进行调用的,如支付宝快捷支付服务。

运行“shift+F10”

在活动中使用Toast

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

接下来实现功能为点击button1就会出现toast。在onCreate()中添加如下代码:

package com.example.activitytest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            //通过调用setOnClickListener() 方法为按钮注册一个监听器
            //点击按钮时就会执行监听器中的onClick() 方法。
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
                //通过静态方法makeText() 创建出一个Toast对象
                //并通过show()将Toast显示出来

                // makeText() 方法需要传入3个参数。
                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
                // 第二个参数是Toast显示的文本内容,
                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG

            }
        });
    }
}

在活动中使用Menu

在大多数的app界面都会有几个点的菜单键。本节介绍一下怎么创建菜单键

首先在res目录下新建一个menu文件夹,右击res目录→New→Directory,输入文件夹名menu,点击OK。

接着在这个文件夹下再新建一个名叫main的菜单文件,右击menu文件夹→New→Menu resource file

然后在main.xml中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

//此处创建两个菜单选项

    <item        //用来创建具体的某一个菜单项
        android:id="@+id/add_item"  //给该菜单项指定一个唯一的标识符
        android:title="Add"/>      //该菜单的名称
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>

</menu>

然后回到FirstActivity中对onCreateOptionsMenu()方法进行重写。通过输入“ctrl+O”可以启动:

然后将方法重写

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    //重写onCreateOptionsMenu方法,将菜单显示出来
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通过getMenuInflater() 方法能够得到MenuInflater 对象
        //再调用它的inflate() 方法就可以给当前活动创建菜单了
        //inflate() 方法接收两个参数,
        //第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
        //第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。

        return true;
        //返回true ,表示允许创建的菜单显示出来
        //若返回了false ,创建的菜单将无法显示。
    }

    //重写onOptionsItemSelected方法,定义菜单的相应事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定义布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
        //setContentView方法用于加载布局
        //项目中添加的任何资源都会在R文件中生成一个相应的资源id
        // 因此,所创建的layout文件会自动将id添加到R文件中
        // 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通过findViewById() 方法获取到在布局文件中定义的元素
        //在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
        //findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象

        button1.setOnClickListener(new View.OnClickListener() {
            //通过调用setOnClickListener() 方法为按钮注册一个监听器
            //点击按钮时就会执行监听器中的onClick() 方法。
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
                //通过静态方法makeText() 创建出一个Toast对象
                //并通过show()将Toast显示出来

                // makeText() 方法需要传入3个参数。
                // 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
                // 第二个参数是Toast显示的文本内容,
                // 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG

            }
        });

    }
}

然后运行该程序有:

发布了255 篇原创文章 · 获赞 281 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/gwplovekimi/article/details/105332423
今日推荐