关于Activity

1、什么是Activity

  • Activity是一个Android应用程序组件(也称为Android四大组件之一),主要用于和用户交互。
  • 项目中的任何Activity基本上都要重写onCreate()方法

2、Antivity与Xml

Android程序设计讲究逻辑视图分离,所以最好每个Activity都对应一个xml文件。

2.1、关于xml文件

这是刚创建的xml文件自带的代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_container">

</LinearLayout>
  • 关于 android:id="@+id/fragment_container",
    当在xml中引用一个id时,我们使用 android:id="@id/id_name"
    当在xml中定义一个id时,我们使用 android:id="@+id/id_name"

  • 关于layout_width="match_parent"、layout_height="match_parent"
    指定了当前元素的宽和长,有三种书写方式:

    • match_parent:表示让当前元素和父元素一样长或宽
    • wrap_content:表示当前元素的长或宽只能刚好包含里面的内容
      *自定义:比如3dp等,不建议使用

3、Activity代码

刚生成的Activity

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

在这里我们调用了setContentView()方法给当前Activity加载一个布局,其中传入的是一个布局文件的id。
(项目中添加的任何资源都会在R文件中生成一个相应的资源id)

4、AndroidManifest.xml文件

所有的Activity都要在该文件中注册才会生效
活动的注册声明要放在<application>标签中

 <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=".NerdlauncherActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  • 关于<activity android:name="">,指定注册哪个活动
  • .NerdlauncherActivity是com.example.nerdlauncher.NerdlauncherActivity(项目包名)的缩写,由于在最外层<manifest>标签中已经通过package属性定制le程序包名是com.example.nerdlauncher,因此在注册活动时这一部分可以省略。
  • 配置主活动,项目启动将优先显示这个Activity
 <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
  • android:label指定活动中标题栏显示内容,给主活动的label不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称
 <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=".NerdlauncherActivity"
                      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>
标题栏变成This is FirstActivity.png
手机应用图标名称变成This is FirstActivity.png

5、Menu的创建和使用

  • 5.1、 创建Menu:首先右击res目录->New->New Resource Directory->Resource type中选择menu->ok
  • 5.2、创建menu文件:menu目录->New->menu Resource File->输入menu名称->ok
  • 5.3、添加菜单项:
<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>

<item>标签是用来创建某一个具体的菜单项,然后通过android:id添加一个唯一的标识符,android:title给这个菜单项指定名称。

  • 5.4、在Activity中重写onCreateOptionsMenu()方法
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

通过getMenuInflater()方法得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动添加菜单
inflate()需要传入两个参数:第一个参数:指定通过哪一个资源文件创建菜单,第二个参数指定菜单项将添加到哪一个menu对象中。

  • 5.5、在Activity中重写onOptionsItemSelected()方法,设置菜单响应事件
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"You clicked add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"You clicked remove",Toast.LENGTH_SHORT).show();
                break;
                default:
        }
        return true;
    }

在该方法中通过调用item.getItemId()来判断我们点击的是哪个菜单选项。

6、销毁一个活动

在代码中调用finish()方法即可或者点击back按钮

7、Activity的回调方法onSaveInstanceState()

  • 该方法可以保证在活动被销毁前被调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。
  • onSaveInstanceState()会携带一个Bundle()类型的参数,Bundle()提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据等。每个保存方法都需要传入两个参数,第一个参数是键,第二个参数是要保存的内容
 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String tempData="Something you just typed";
        outState.putString("data_key",tempData);
    }

数据在这里已经保存下来了。我们使用的onCreate()方法中也带有Bundle参数,所以,我们将在onCreate中恢复保存的数据。

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(savedInstanceState !=null){
            String tempData=savedInstanceState.getString("data_key");
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容