目录
作业目标
根据第一次作业的源码基础,在列表页上点击跳转到另一详情页面。在我第一次作业的源码中修改,即目标为在fragment1对应的页面中,点击专辑封面图,跳转到显示专辑名称以及其主打歌的详情页面中。
技术说明
- intent:轻量级的进程间通信机制,实现跨进程组件通信和发送系统广播。在fragment1的点击监听中,将消息(专辑名和主打曲)就封装在intent中,并发送给详情页面。
- context:一个抽象类,提供startActivity()方法,intent可以作为该方法的参数,从而实现窗体之间的跳转。
关键代码
-
activity_vx.xml(详情页面):
布局方式设置为ConstraintLayout,然后添加2个textView控件和一个button控件,textViewvx1用于存放传入的专辑名,textViewvx2用于存放传入的主打曲,button用于返回到列表页面;修改xml文件的各个参数,使页面布局更加美观。
<TextView
android:id="@+id/textViewvx1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView"
android:textColor="#FFFFFF"
android:textSize="60sp"
android:textStyle="bold"
android:typeface="serif"
app:layout_constraintBottom_toTopOf="@+id/textViewvx2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textViewvx2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="#C89292"
android:textSize="45sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewvx2" />
效果如下:
-
Album.java:
新增了song变量,用于存放每张专辑对应的主打曲名称,并且设置了getSong()函数,可以通过调用函数得到主打曲的信息。
代码增加如下:
private String song;
public Album(String name,int imageid,String song){
this.name=name;
this.imageid=imageid;
this.song=song;
}
public String getSong() { return song; }
-
Myadapter2.java:
由于窗体的跳转需要使用到context,因此在Myadapter2中增加了context1,并将对应代码进行修改。
Context context1;
// 传入值
public Myadapter2(List list,Context context) {
list1=list;
context1=context;
}
@NonNull
@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 压缩器(from生成静态压缩器)
// 闪退时可以挂布尔值false运行
View view=LayoutInflater.from(context1).inflate(R.layout.item1,parent,false);
Viewholder viewholder=new Viewholder(view);
return viewholder;
}
然后在onBindViewHolder()函数中对控件imageView做点击监听,实现点击专辑封面图,跳转到对应专辑的详情页面中。
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context1,Activityvx.class);
// 向activityvx传入专辑名和主打曲
intent.putExtra("name", album.getName());
intent.putExtra("song", album.getSong());
context1.startActivity(intent);
}
});
-
fragment1.java:
因为前面对Album.java和Myadapter2.java都进行了修改,因此在fragment1中也要做出对应的修改。
首先是在Album的list中增加专辑主打曲的数据:
Album thestorybegins = new Album(getRandomLengthName("The Story Begins"),
R.drawable.tsb,
getRandomLengthName("Like Ooh-Ahh"));
list.add(thestorybegins);
Album pagetwo = new Album(getRandomLengthName("Page Two"),
R.drawable.cheerup,
getRandomLengthName("CHEER UP"));
list.add(pagetwo);
Album lane1 = new Album(getRandomLengthName("Twicecoaster:Lane1"),
R.drawable.tt,
getRandomLengthName("TT"));
list.add(lane1);
Album lane2 = new Album(getRandomLengthName("Twicecoaster:Lane2"),
R.drawable.knock,
getRandomLengthName("Knock Knock"));
list.add(lane2);
Album signal = new Album(getRandomLengthName("Signal"),
R.drawable.sig,
getRandomLengthName("Signal"));
list.add(signal);
Album twicetagram = new Album(getRandomLengthName("Twicetagram"),
R.drawable.likey,
getRandomLengthName("Likey"));
list.add(twicetagram);
Album merryhappy = new Album(getRandomLengthName("Merry&Happy"),
R.drawable.mh,
getRandomLengthName("Heart Shaker"));
list.add(merryhappy);
Album whatislove = new Album(getRandomLengthName("What Is Love"),
R.drawable.wil,
getRandomLengthName("What is Love"));
list.add(whatislove);
Album summernights = new Album(getRandomLengthName("Summer Nights"),
R.drawable.sn,
getRandomLengthName("Dance The Night Away"));
list.add(summernights);
Album yesoryes = new Album(getRandomLengthName("YES or YES"),
R.drawable.yoy,
getRandomLengthName("YES or YES"));
list.add(yesoryes);
Album fancyyou = new Album(getRandomLengthName("FANCY YOU"),
R.drawable.fancy,
getRandomLengthName("FANCY"));
list.add(fancyyou);
Album feelspecial = new Album(getRandomLengthName("Feel Special"),
R.drawable.fs,
getRandomLengthName("Feel Special"));
list.add(feelspecial);
Album moremore = new Album(getRandomLengthName("MORE&MORE"),
R.drawable.mm,
getRandomLengthName("MORE & MORE"));
list.add(moremore);
Album eyeswideopen = new Album(getRandomLengthName("Eyes Wide Open"),
R.drawable.ewo,
getRandomLengthName("I CAN'T STOP ME"));
list.add(eyeswideopen);
Album tasteoflove = new Album(getRandomLengthName("Taste Of Love"),
R.drawable.tol,
getRandomLengthName("Alcohol-Free"));
list.add(tasteoflove);
Album formulaoflove = new Album(getRandomLengthName("Formula Of Love:O+T=<3"),
R.drawable.fol,
getRandomLengthName("SCIENTIST"));
list.add(formulaoflove);
Album between12 = new Album(getRandomLengthName("BETWEEN 1&2"),
R.drawable.ttt,
getRandomLengthName("Talk that Talk"));
list.add(between12);
Album readytobe = new Album(getRandomLengthName("READY TO BE"),
R.drawable.rtb,
getRandomLengthName("SET ME FREE"));
list.add(readytobe);
然后要增加context变量并赋值,并且和list一起被Myadapter2调用。
Context context;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
context=this.getActivity();
// 此处将无关代码省略
// 适配器
ma=new Myadapter2(list,context);
-
Activityvx.java:
详情页面所对应的activity文件。在activity组件的onCreate方法中,对Myadapter2中定义的点击监听进行了接收,并且将传入的数据存放进textView控件中;对button控件进行点击监听,当用户点击button,则退回到RecyclerView页面中去。
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class Activityvx extends AppCompatActivity {
TextView textView1,textView2;
Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vx);
// 接收Myadapter2的传值
textView1=findViewById(R.id.textViewvx1);
textView2=findViewById(R.id.textViewvx2);
Intent intent=getIntent();
textView1.setText(intent.getStringExtra("name"));
textView2.setText(intent.getStringExtra("song"));
// 退回fragment1的列表界面
button=findViewById(R.id.button5);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
}
运行效果:
实验心得:
本次实验使我对于activity的生命周期有了更加深刻的了解,同时,在对Myadapter2.java文件进行修改的时候,我掌握了context的使用时机和使用方法,我发现如果要在Myadapter2中之间进行点击监听,那么必须传入context变量,如果只是强制将list1转换为context类型,在点击专辑封面图时跳转页面会失败。在编译Activityvx.java文件时,一开始我错误地对intent进行了初始化,即写入了Intent intent=new Intent(),而运行时我发现详情页面中始终没有数据传入和显示,检查过后我发现在Activityvx中的intent用于接收Myadapter2传入的intent,因此不应该初始化,而应该调用getIntent(),从而接收来自Myadapter2的传值。