一、作业目标
基于上一个作业实现的微信类门户界面,当点击第一个界面的列表时,进入另一个界面并给出文本提示。
二、设计流程
1.外观设计
将第一个界面的列表进行优化,item.xml加入一个imageview ;
把Fragment1中的列表循环去掉,修改成自己想要显示的文本;点击某一行文本后,跳转到另一个页面,并且出现一行文字提示。
2.内部联系
在fragment1.java中写列表要显示的文本,Myadapter.java中写intent 的内容,传到textview_Activity.java中,textview _Activity.java用getintent()接收内容并在每一个textview 中显示出来,从而实现点击一则消息,启动textview_Activity.java跳转进入消息页面。
三、技术说明及关键代码
1、展示字符串列表
Fragment1.java这个代码基本没有修改只是把循环进行了修改,如下图。之后创建一个Myadapter对象,并将它绑定到 RecyclerView 中,在创建Myadapter对象时,将list变量作为参数传递给了它。
list = new ArrayList(); list.add("小兔子的消息来咯" ); list.add("大兔子邀请你一起听音乐");
完整代码:
package com.example.myapplication;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class Fragment1 extends Fragment {
RecyclerView recyclerView;
List list;
Myadapter myadapter;
Context context;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab1, container, false);
context = view.getContext();
recyclerView = view.findViewById(R.id.recyclerView);
list = new ArrayList();
list.add("小兔子的消息来咯" );
list.add("大兔子邀请你一起听音乐");
myadapter = new Myadapter(context, list);
recyclerView.setAdapter(myadapter);
LinearLayoutManager manager = new LinearLayoutManager(context);
manager.setOrientation(RecyclerView.VERTICAL);
recyclerView.setLayoutManager(manager);
return view;
}
}
2、将数据绑定到控件上
Myadapter.java是实现了一个简单的 RecyclerView,用于展示文本列表,在用户点击列表项时启动另一个 Activity。
主要是在原来基础上增加了onBindViewHolder()方法,它为每个item中的 TextView 设置了文本内容,并为其添加了一个点击事件监听器,点击每一行的TextView 时,就会启动textview_Activity.java,并将 "耶比耶比"(自己想要的文本)传递给这个 Activity。
//绑定数据到MyHolder中
@Override
public void onBindViewHolder(@NonNull Myholder holder, int position) {
holder.textView.setText(list1.get(position));
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {Context context = holder.itemView.getContext();
Intent intent1 = new Intent(context,textview_Activity.class);
intent1.putExtra("qq", "耶比耶比");
context.startActivity(intent1);
}
});
}
完整代码:
package com.example.myapplication;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class Myadapter extends RecyclerView.Adapter<Myadapter.Myholder>{
Context context1;
List<String> list1;
public Myadapter(Context context, List<String> list){
context1 = context;
list1 = list;
}
//创建实例
@NonNull
@Override
public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context1).inflate(R.layout.item,parent,false);
Myholder holder=new Myholder(view);
return holder;
}
//绑定数据到MyHolder中
@Override
public void onBindViewHolder(@NonNull Myholder holder, int position) {
holder.textView.setText(list1.get(position));
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = holder.itemView.getContext();
Intent intent1 = new Intent(context,textview_Activity.class);
intent1.putExtra("qq", "耶比耶比");
context.startActivity(intent1);
//
// Intent intent = new Intent(context,textview_return.class);
// intent.putExtra("name", "是猫Y");
// intent.putExtra("svt17", "可爱鼠啦");
// context.startActivity(intent);
}
});
}
//返回数据集集合的大小
@Override
public int getItemCount() {
return list1.size();
}
//用于保存item布局中的控件引用
public class Myholder extends RecyclerView.ViewHolder {
TextView textView;
public Myholder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.item);
}
}
}
3、获取另一个页面要展示的文本
getIntent用来获取传递给textview_Activity.java的字符串参数 ,并将其设置为要显示的textview的文本的内容。
String name1=getIntent().getStringExtra("qq");
textView1=findViewById(R.id.item);
textView1.setText(name1);
完整代码:
package com.example.myapplication;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
public class textview_Activity extends AppCompatActivity {
//Button button44;
TextView textView1,textView2,textView3;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.item);
// Intent intent = new Intent(textview_Activity.this,textview_return.class);
// intent.putExtra("name", "是猫Y");
// intent.putExtra("age", 1);
// intent.putExtra("svt17", "可爱鼠啦");
// intent.putExtra("fighting!", 1);
// intent.putExtra("无穷花开了", "下雨啦");
// startActivity(intent);
String name1=getIntent().getStringExtra("qq");
textView1=findViewById(R.id.item);
textView1.setText(name1);
Log.d("svt", "onCreate...");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("svt", "onPostResume...");
}
@Override
protected void onResume() {
super.onResume();
Log.d("svt", "onResume...");
}
@Override
protected void onStart() {
super.onStart();
Log.d("svt", "onStart...");
}
@Override
protected void onStop() {
super.onStop();
Log.d("svt", "onStop...");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("svt", "onDestroy...");
}
}
4、控件的改造
我只对原来的item.xml进行了修改,可按个人喜好,其中 android:src="@drawable/rabit" />是在drawable文件夹下保存了一个rabit.png图片。
<?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"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#F4D6D6"
android:backgroundTint="#FFD2D2"
android:gravity="center">
<ImageView
android:id="@+id/imageView4"
android:layout_width="302dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@drawable/rabit" />
<TextView
android:id="@+id/item"
android:layout_width="470dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="message"
android:textColor="#1C82FF"
android:textSize="24sp" />
</LinearLayout>
5、优化
1、本代码无论点击第一行还是第二行列表,返回界面的文本提示都是“耶比耶比”,如果想传回来的不同,可以修改Myadapter.java,修改“耶比耶比”,把position直接作为value,这样返回的就是你点击的那一句文本了(两种方法如下)。
// Context context = holder.itemView.getContext(); // Intent intent1 = new Intent(context1,textview_Activity.class); // intent1.putExtra("qq", "耶比耶比"); // context.startActivity(intent1); Context context = holder.itemView.getContext(); Intent intent1 = new Intent(context1,textview_Activity.class); intent1.putExtra("qq", list1.get(position)); context1.startActivity(intent1);
2、如果想要自己定义文本,可以自己写一个类,类的方法里面直接返回传进来的值,把自己想要展示的内容传到类里面,再把“耶比耶比”那一句改成类的调用,这样value就可以是不同的值。我请教朋友的,自己还在实现中。
四、结果展示
五、遇到的问题及解决
1、下面第一句里的“qq”,必须和第二句自己在Fragment1.java中写的名字一样,否则显示就会是空白的。
String name1=getIntent().getStringExtra("qq");intent1.putExtra("qq", "耶比耶比");
2、Mainifest里面必须给出声明Activity!不要因为是“false”就觉得可以不写,否则运行后和没写一样。
3、我本来的思路是想写两个Activity,在第一个Activity写intent内容,在第二个Activity接收,并用不同的textview来接收展示内容,最后出现的结果就是直接从第一个界面跳到第三个界面,因为Fragment1已经跳转到了textview_Acticity,我再跳转到另一个activity,就会出现跳转两次的情况。于是我把另一个Activity及相关的intent内容删除了。