Android Studio移动开发实验——类微信界面设计(二)


前言

本系列实验为移动开发技术课程实验,如有问题欢迎指正!

一、问题陈述

根据移动开发课程内容设计类微信界面:
任务一:掌握Activity的注册;
任务二:掌握Activity的生命周期;
任务三:依托作业一,将recyclerView的每个item增加点击功能,点击后跳转到一个新的view展示信息。

二、开发工具

在这里插入图片描述

三、设计流程

1.任务一——掌握Activity的注册
在这里插入图片描述
2.任务二——掌握Activity的生命周期

Activity生命周期指Activity从创建到销毁的过程。 Activity表现为四种状态:
活动状态Active:Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互。
暂停状态Pause:Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出消息框)
停止状态Stop:Activity被其他Activity全部遮挡,界面完全不能被用户看到。(如玩游戏时来电了)
非活动状态Dead:Activity没有启动或者被finish()。

创建一个新的Android应用项目,或者使用现有的项目。
在项目中创建两个不同的Activity,例如ActivityA和ActivityB。
在ActivityA中添加代码以在生命周期的各个阶段打印日志信息,例如onCreate、onStart、onResume、onPause、onStop、onDestroy。这可以通过重写这些方法并在其中调用Log.d()来完成。
在ActivityB中重复步骤3,添加相同的生命周期方法的日志信息。
创建一个按钮或其他UI元素,使用户能够从ActivityA跳转到ActivityB。
在按钮的点击事件处理程序中,使用Intent将ActivityA跳转到ActivityB。在跳转之前和之后,可以在ActivityA的生命周期方法中添加Log.d()来记录状态变化。
运行应用程序,并观察Logcat中的输出。将能够看到ActivityA的生命周期状态变化,以及在跳转到ActivityB后的状态变化。

3.任务三——通过Intent,实现Activity之间的跳转
在Activity之间跳转时,通常使用Intent来实现。在验证Activity之间的跳转时,通常需要进行一些条件判断。以下是一个示例代码,演示了如何通过Intent实现Activity之间的跳转验证:

// 启动第二个
Activity Intent intent = new Intent(this, SecondActivity.class); startActivity(intent);
// 在第二个Activity中验证跳转
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 获取传递过来的Intent
Intent intent = getIntent();
// 获取传递的数据,这里假设传递了一个字符串类型的参数
String data = intent.getStringExtra(“data”);
// 进行验证,比如验证传递的数据是否符合要求
if (data != null && data.equals(“valid”)) {
// 如果验证通过,可以执行跳转操作
Intent intentToThirdActivity = new Intent(this, ThirdActivity.class);
startActivity(intentToThirdActivity); }
else {
// 如果验证不通过,可以显示错误提示或者返回到上一个
Activity finish(); } }

在上述代码中,我们首先启动了一个名为SecondActivity的Activity。在该Activity的onCreate方法中,我们获取了传递过来的Intent,并从中获取了传递的数据(这里假设是一个字符串类型的参数)。然后,我们对传递的数据进行验证,如果验证通过,就启动下一个Activity(这里假设是ThirdActivity),否则就结束当前Activity。

Activity间跳转的两种方法,startActivity与startActivityForResult,注意区分使用!

四、代码解析

1.项目文件目录

本次在作业一的基础上,新增了activity_tab5.java及tab5.xml文件,修改了Fragment1.java、MyAdapter.java及item.xml文件

2.layout部分

tab5.xml

放入两个插件textView_Chat和button_return,textView_Chat用来显示点击后界面显示的内容,button_return用来进行返回点击。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".activity_tab5">

    <TextView
        android:id="@+id/textView_Chat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity_2"
        android:textColor="@color/black"
        android:textSize="35sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/button_return"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Return"
        android:textSize="35sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.315" />
</androidx.constraintlayout.widget.ConstraintLayout>

item.xml

放入两个插件textView1和button_chat,textView1与button_chat构成list列表中的一行,存放显示内容。
在这里插入图片描述

<?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="wrap_content">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="270dp"
        android:layout_height="75dp"
        android:layout_gravity="center"
        android:text="TextView"
        android:textColor="@color/black"
        android:textSize="50sp" />

    <Button
        android:id="@+id/button_chat"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="进入聊天"
        android:textColor="@color/white"
        android:textSize="20sp" />

</LinearLayout>

3.Java代码部分

Fragment1.java

import android.content.Context;
import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

public class Fragment1 extends Fragment {
    View view;
    RecyclerView recyclerview;
    List<String> list;

    MyAdapter adapter;

    Context context;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.tab1, container, false);
        recyclerview = view.findViewById(R.id.recyclerview);

        list = new ArrayList<>();
        for (int i = 0; i < 9; i++) {
            list.add("shenshen 宝贝" + i );
        }

        context=view.getContext();
        adapter=new MyAdapter(context,list);
        recyclerview.setAdapter(adapter);
        LinearLayoutManager manager = new LinearLayoutManager(view.getContext());
        manager.setOrientation(RecyclerView.VERTICAL);
        recyclerview.setLayoutManager(manager);

        return view;
    }
}

activity_tab5.java

public class activity_tab5 extends AppCompatActivity {

    TextView textView;
    Button button;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab5);

        Log.d("lwy", "chat:onCreate...");//创建日志
        textView = findViewById(R.id.textView_Chat);
        button = findViewById(R.id.button_return);

        //2怎么收消息
        Intent intent = getIntent();//不能在new否则是新的

        String str2 = "我和" + intent.getExtras().getString("name") + "的聊天界面";

        textView.setText(str2);//把消息塞进textview

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Myholder> {

    Context context1;
    List<String> list1;//没有给定节点类型
    public MyAdapter(Context context,List list) {
        context1=context;
        list1=list;
    }

    //泛型传入=类嵌套 类名<传入类名>
    @NonNull
    @Override
    public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //Inflater,java的真的zip压缩器,不是我们要的

        View view=LayoutInflater.from(context1).inflate(R.layout.item,parent,false); //官方压缩器
        //inflater返回值是一个view(压缩后的)
        Myholder myholder=new Myholder(view);
        return myholder;//把每行数据inflater压缩
    }

    @Override
    public void onBindViewHolder(@NonNull Myholder holder, @SuppressLint("RecyclerView") int position) {

        holder.textView.setText(list1.get(position));//get也不确定返回类型,list要给定,自动返回string

        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //intent:从main跳到chat,mainactivity挂在后台会stop停止
                Intent intent=new Intent(context1,activity_tab5.class); //消息封装在intent里面,intent可以理解为一种通讯方法
                intent.putExtra("name",list1.get(position));
                context1.startActivity(intent);
            }
        });

    }//bind绑定,连接list数据和viewholder(指向行的指针,java没有指针,自定义viewholder的子类因为每行数据类型不确定)

    @Override
    public int getItemCount() {
        return list1.size();
    }//数据绑定,list有多少行

    public class Myholder extends RecyclerView.ViewHolder{

        TextView textView;
        Button button;
        public Myholder(@NonNull View itemView) {
            super(itemView);

            textView=itemView.findViewById(R.id.textView1);
            button=itemView.findViewById(R.id.button_chat);
        }

    }//泛型传入viewholder类
}

在这里插入图片描述
列表可以进行上下滑动,点击进入聊天后会跳转到下面界面:
在这里插入图片描述
点击return后回到第一个联系人列表界面。

六、实验总结

通过本次实验,我学习到以下知识点:
(1)intent的使用
Android提供轻量级的进程间通信机制Intent,使跨进程组件通信和发送系统广播成为可能,组件Activity、Service和BroadcastReceiver都是通过消息机制被启动(激活)的,其使用的消息就封装在对象Intent里。
Context是一个抽象类且为Activity的超类,提供了startActivity()方法,并以Intent对象作为参数,用于实现窗体之间的跳转。
(2)Activity的生命周期
Activity生命周期指Activity从创建到销毁的过程。
Activity表现为四种状态:
活动状态Active:Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互。
暂停状态Pause:Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出消息框)
停止状态Stop:Activity被其他Activity全部遮挡,界面完全不能被用户看到。(如玩游戏时来电了)
非活动状态Dead:Activity没有启动或者被finish()。
(3)验证Activity的生命周期及跳转时查看
在按钮的点击事件处理程序中,使用Intent将ActivityA跳转到ActivityB。在跳转之前和之后,可以在ActivityA的生命周期方法中添加Log.d()来记录状态变化。
(4)Activity间跳转的两种方法,startActivity与startActivityForResult:
在Android中,Activity之间的跳转通常使用两个重要的方法:startActivity和startActivityForResult。它们用于在不同的Activity之间建立通信和传递数据。
startActivity方法用于启动一个新的Activity,并且通常不期望返回结果。这种情况下,调用它的Activity(称为"调用方")会继续执行,而被启动的Activity(称为"目标Activity")将会被放置在调用方的上层。
startActivityForResult方法也用于启动一个新的Activity,但期望在目标Activity完成后返回结果给调用方。这个方法通常用于实现一些需要返回结果的交互,比如选择一个图片或者编辑一些信息。
总结来说,startActivity用于简单的Activity跳转,而startActivityForResult用于在目标Activity执行完特定任务后,将结果返回给调用方。这两种方法在Android开发中经常会用到,根据具体情况选择合适的方法来进行Activity之间的交互。

源码仓库地址:https://gitee.com/zhangy_zxx/android-project.git

reference:https://www.jianshu.com/p/c4cfe38a91ed

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值