Android组件-Activity活动

Activity

1生命周期

Activity3种状态:运行状态active、暂停状态paused和停止stoped状态

运行状态:当Activity在屏幕最前端、屏幕前台(处于当前任务活动栈的最上面)的时候,此时它获取了焦点能响应用户的操作,属于活动状态。同一个时刻只会有一个Activity处于活动(Active)。

暂停状态:在一些情况下,最上层的Activity没有完全覆盖屏幕,这时候被覆盖的Activity仍然对用户可见、并且存活(如在它之上有另一个透明的ActivityToastAlertDialog等弹出窗口时)但是当系统内存极小时可以被系统杀掉。

停止状态:当Activity完全被另一个Activity遮挡、不可见时,它就处于了停止状态,但仍然保留着当前状态和成员信息,如果当系统内存不足时,这个Activity就很容易被杀死.

一种状态变到另一种状态时会经过一系列回调函数

onCreate(Bundle savedInstanceState)

Activity 并未处于已创建状态。onCreate() 方法完成执行后,Activity 进入已开始状态。Activity初次创建时调用的方法,在这里可以进行一些初始化操作,对一些资源及状态的读取,如设置布局资源文件初始化组件、为按钮绑定监听器等静态的设置操作等等。整个生命周期只调用1次这个方法;会接收 savedInstanceState 参数,后者是包含 Activity 先前保存状态的 Bundle 对象。如果 Activity 此前未曾存在,Bundle 对象的值为 null

onStart()

Activity 进入已开始状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见。在Activity可见时执行。

onRestart()

回到最上边的界面,再次可见时执行。

onResume() Resume的中文意思:重新开始、继续。Activity 会在进入已恢复状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。Activity获取焦点时执行。

onPause()

当发生中断事件时,Activity 进入已暂停状态,系统调用 onPause() 回调。Activity失去焦点、界面被隐藏时执行。此方法表示 Activity 不再位于前台(尽管在用户处于多窗口模式时 Activity 仍然可见)

onStop()

如果 Activity 不再对用户可见,说明其已进入已停止状态,因此系统将调用 onStop() 回调。例如,当新启动的 Activity 覆盖整个屏幕时,可能会发生这种情况。如果 Activity 已结束运行并即将终止,系统还可以调用 onStop()。Activity不可见进入后台时执行。

进入已停止状态后,Activity 要么返回与用户互动,要么结束运行并消失。如果 Activity 返回,系统将调用 onRestart()如果 Activity 结束运行,系统将调用 onDestroy()

onDestroy()

销毁 Activity 之前,系统会先调用 onDestroy()。系统调用此回调。Activity销毁时执行。

图 1 Activity生命周期

Android三个嵌套循环

Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束。

Activity的可视生命周期:从调用onStart()到相应的调用onStop()。在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop()中注销。

Activity的前台生命周期:从调用onResume()到相应的调用onPause()。

Android中以栈的形式组织Activity

finish()方法会把Activity移出栈最顶端

导航大题所有代码+文字描述

第一步:Menu资源文件的创建(具体根据APP详细说明)

首先,在 res/menu 资源目录下创建一个菜单 XML 文件(例如 menu_main.xml),定义导航项。

具体题目中如果有4个导航项,将菜单Menu文件代码都写清楚。

第二步:APP对应的每个Fragment和xml文件的创建

然后,实现具体每一个菜单项对应的Fragment的Java代码文件和xml布局资源文件

第三步:Menu与BottomNavigationView组件的关联绑定

Java代码中初始化 BottomNavigationView 同时在MainActivity的布局文件activity_main.xml中添加 BottomNavigationView组件,并通过app:menu="@menu/menu_main" 属性将其与资源菜单目录下的menu_main.xml 文件关联起来。
具体代码如下:(文字和代码都写,将问题说清楚)
<com.google.android.material.bottomnavigation.BottomNavigationView

      android:id="@+id/bottomNavigationView"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:background="@color/design_default_color_background"

    app:menu="@menu/menu_main" 重要属性!!!

    app:itemTextColor="@color/nav_item_color"

    app:itemIconTint="@color/nav_item_color"

    app:labelVisibilityMode="labeled"/>

第四步:ViewPager组件的定义及在Activity中初始化

在MainActivity的布局文件中添加ViewPage组件, 布局位置在 BottomNavigationView 组件上方。

在MainActivity类onCreate方法中,通过 findViewById 初始化ViewPager。接着,调用 setAdapter() 方法设置 ViewPager 的适配器PagerAdapter以提供具体Fragment数据。

第五步:菜单导航选项的单击事件处理和页面滑动事件处理的实现(具体根据APP详细说明)

通过bottomNavigationView.setOnNavigationItemSelectedListener 方法向BottomNavigationView组件注册菜单选项点击监听器,当用户点击不同的导航项时,就会切换 ViewPager 所展示的Fragment页面。

通过 viewPager.addOnPageChangeListener 方法设置 ViewPager 的页面切换监听器,当用户滑动 ViewPager 时同步更新 BottomNavigationView 的菜单项选中状态。

总结

通过 BottomNavigationView 和 ViewPager 的配合使用,用户可以点击底部导航栏切换页面,或通过滑动切换页面,同时底部导航栏会同步更新选中状态。

菜单资源文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <
item
       
android:id="@+id/item1"
       
android:title="@string/home"
       
android:icon="@drawable/img12"/>
    <
item
       
android:id="@+id/item2"
       
android:title="@string/category"
       
android:icon="@drawable/img13"/>
    <
item
       
android:id="@+id/item3"
       
android:title="@string/shopping"
       
android:icon="@drawable/img14"/>
    <
item
       
android:id="@+id/item4"
       
android:title="@string/mine"
       
android:icon="@drawable/img15"/>
</
menu>

MyFragment_1.xml事例文件

<?xml version="1.0" encoding="utf-8"?>

  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@drawable/a1"

    android:orientation="vertical"

    android:padding="16dp">

    <Button

        android:id="@+id/pickDateButton"

        android:layout_width="300dp"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:layout_marginTop="200dp"

        android:textSize="30dp"

        android:text="@string/date_set"

        android:background="@drawable/button_shape"/>

</FrameLayout>

PagerAdapter类的定义

public class MyAdapter extends FragmentPagerAdapter {

    List list;

      //构造函数

    public MyAdapter(@NonNull FragmentManager fm, List list) {

        super(fm);

        this.list = list;

    }

    //获取Fragment

    @NonNull

    @Override

    public Fragment getItem(int position) {

        return (Fragment) list.get(position);

    }

    //返回个数

    @Override

    public int getCount() {

        return list.size();

    }

}
Activity_main主体布局文件
<?xml version="1.0" encoding="utf-8"?>

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"  重要属性:垂直布局方向

    tools:context=".MainActivity">

  重要组件androidx.viewpager.widget.ViewPager添加和使用(实现导航界面滑动切换)

    <androidx.viewpager.widget.ViewPager

        android:id="@+id/viewPager"

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="1" />

  重要组件com.google.android.material.bottomnavigation.BottomNavigationView添加和使用(要和Menu.xml文件联动)

    <com.google.android.material.bottomnavigation.BottomNavigationView

        android:id="@+id/bottomNavigationView"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:background="@color/design_default_color_background"

        app:menu="@menu/menu_main" 重要属性!!!指定导航菜单的资源文件

        app:itemTextColor="@color/nav_item_color"

        app:itemIconTint="@color/nav_item_color"

        app:labelVisibilityMode="labeled"/>

</LinearLayout>
MainActivity代码
package com.peace.task_5;

  import androidx.annotation.NonNull;

  import androidx.appcompat.app.AppCompatActivity;

  //Fragment碎片组件

  import androidx.fragment.app.Fragment;

  import androidx.fragment.app.FragmentManager;

  import androidx.fragment.app.FragmentPagerAdapter;

  import androidx.viewpager.widget.PagerAdapter;

  //实现底部导航必备两个组件(ViewPager+BottomNavigationView)

  import androidx.viewpager.widget.ViewPager;

  import android.os.Bundle;

  import android.view.MenuItem;

  //实现底部导航必备两个组件(BottomNavigationView+ViewPager)

  import com.google.android.material.bottomnavigation.BottomNavigationView;

  //子类可变数组ArrayList继承于列表List

  import java.util.ArrayList;

  import java.util.List;

  public class MainActivity extends AppCompatActivity {

    //    用来展示Fragment

    ViewPager viewPager;

    BottomNavigationView bottomNavigationView;

    List<Fragment> list;

    MenuItem menuItem;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //添加对相关布局文件的引用

        setContentView(R.layout.activity_main);

  //组件初始化(viewPager,bottomNavigationView)

        viewPager = findViewById(R.id.viewPager);

        bottomNavigationView = findViewById(R.id.bottomNavigationView);

        //      初始化包含所有fragment的列表list,new MyFragment1(),......包含题目所需的4fragmentS

        list = new ArrayList<Fragment>();

        list.add(new MyFragment1());

        list.add(new MyFragment2());

        list.add(new MyFragment3());

        list.add(new MyFragment4());

  

  //viewPager添加适配器pagerAdapterFragmentpagerAdapter继承于pagerAdapter

        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager(), list));

        //点击底部导航项时,切换显示对应的页面,采用匿名内部类的方式,

        // override方法onNavigationItemSelected(),接受参数MenuItem,菜单元素

        bottomNavigationView.setOnNavigationItemSelectedListener(

                new BottomNavigationView.OnNavigationItemSelectedListener() {

                    //                    参数传入参数为菜单项元素

                    @Override

                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                        int itemId = item.getItemId();

                        if (itemId == R.id.item1) {

                            viewPager.setCurrentItem(0);

                        } else if (itemId == R.id.item2) {

                            viewPager.setCurrentItem(1);

                        } else if (itemId == R.id.item3) {

                            viewPager.setCurrentItem(2);

                        } else if (itemId == R.id.item4) {

                            viewPager.setCurrentItem(3);

                        }

                        return true;

                    }

                });

  

  //        //页面左右滑动时,让底部的导航项和显示的页面保持一致,三个回调方法,切换一面的显示

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            //用户拖动ViewPager时调用

            @Override

            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            //在新的页面被选中时调用!!!!!!最重要

            @Override

            public void onPageSelected(int position) {

                if (menuItem == null) {

                    menuItem = bottomNavigationView.getMenu().getItem(0);

                }

                //将上次的选择的菜单项设置为false,等待下次的选择

                menuItem.setChecked(false);

  //                获取索引为 position 的菜单项

                menuItem = bottomNavigationView.getMenu().getItem(position);

  //                将新选中的菜单项设置为选中状态

                menuItem.setChecked(true);

            }

            //这个方法在 ViewPager 的滚动状态改变时调用。

            @Override

            public void onPageScrollStateChanged(int state) {

            }

        });

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成也萧何,败也萧何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值