移动应用开发课程第六次实验:为实验2添加登陆页面,用SQList存储好友基本信息

1、在Android Studio中,请在第二次实验成果的基础上完成以下实验要求。

向右滑动

请添加登录页面。在登录页面中,如果用户输入的用户名和密码正确,则跳转至如上图所示的好友列表,并记录用户的登录信息,在用户第一次登录成功后再次打开App时,直接登录进入到好友列表页面[1];如果用户输入的用户名和密码错误,则以Toast方式提示用户输入的用户名或密码错误。

成功登录进入后,侧滑菜单要求仍然可用。

使用SQLite构建内联数据库,其中存储好友基本信息(好友头像、好友名称、最后一次联系的单条消息、最后一次联系的时间)。

在登录进入后,通过SQLite数据库连接读取好友列表数据(5条以上)[2],并以List方式显示在页面上。

3、注意:

① 请将补充的图片素材放入“根目录/Extra”;

② 请将实验报告放入“根目录/Doc”。

运行效果:

文件目录

在实验2中只建立了一个fragment,在这此实验为每一页创建了fragment,但除了XiaoXiFragment,其他的fragment没有写入什么东西。沿用实验2的代码没有任何更改,这里新加了几个文件。

DatabaseHelper.java

package com.example.TheSixthExperiment;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "friends_db.db";private static final int DATABASE_VERSION = 1;// SQL语句创建表private static final String TABLE_CREATE ="CREATE TABLE friends (" +"id INTEGER PRIMARY KEY AUTOINCREMENT, " +"avatar BLOB, " +"name TEXT, " +"last_message TEXT, " +"last_contact TIMESTAMP);";public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(TABLE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 如果数据库版本发生变化,删除旧表并重新创建db.execSQL("DROP TABLE IF EXISTS friends");onCreate(db);}// 清空friends表中的数据,但不删除表本身public void clearDatabase(){SQLiteDatabase db = getWritableDatabase();// 使用DELETE语句清空表中的数据String deleteSQL = "DELETE FROM friends";db.execSQL(deleteSQL);}
}

Friend.java

package com.example.TheSixthExperiment;public class Friend {private byte[] avatar;private String name;private String lastMessage;private String lastContact;public byte[] getAvatar() { return avatar; }public void setAvatar(byte[] avatar) { this.avatar = avatar; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getLastMessage() { return lastMessage; }public void setLastMessage(String lastMessage) { this.lastMessage = lastMessage; }public String getLastContact() { return lastContact; }public void setLastContact(String lastContact) { this.lastContact = lastContact; }
}

FriendAdapter.java

package com.example.TheSixthExperiment;import android.content.Context;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import java.util.List;public class FriendAdapter extends RecyclerView.Adapter<FriendAdapter.FriendViewHolder> {private Context context;private List<Friend> friendList;public FriendAdapter(Context context, List<Friend> friendList) {this.context = context;this.friendList = friendList;}@NonNull@Overridepublic FriendViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.friend_item, parent, false);return new FriendViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull FriendViewHolder holder, int position) {Friend friend = friendList.get(position);holder.avatarImageView.setImageBitmap(BitmapFactory.decodeByteArray(friend.getAvatar(), 0, friend.getAvatar().length));holder.nameTextView.setText(friend.getName());holder.lastMessageTextView.setText(friend.getLastMessage());holder.lastContactTextView.setText(friend.getLastContact());}@Overridepublic int getItemCount() {return friendList.size();}public static class FriendViewHolder extends RecyclerView.ViewHolder {ImageView avatarImageView;TextView nameTextView;TextView lastMessageTextView;TextView lastContactTextView;public FriendViewHolder(@NonNull View itemView) {super(itemView);avatarImageView = itemView.findViewById(R.id.iv_touxiang);nameTextView = itemView.findViewById(R.id.tv_nicheng);lastMessageTextView = itemView.findViewById(R.id.tv_xiaoxi);lastContactTextView = itemView.findViewById(R.id.tv_shijian);}}
}

LoginActivity.java

package com.example.TheSixthExperiment;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;public class LoginActivity extends AppCompatActivity {private EditText etUsername, etPassword;private Button btnLogin;private DatabaseHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);etUsername = findViewById(R.id.et_username);etPassword = findViewById(R.id.et_password);btnLogin = findViewById(R.id.btn_login);SharedPreferences sharedPreferences = getSharedPreferences("MyAppPref", MODE_PRIVATE);boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);//isLoggedIn=false;//如果需要每次打开软件看到登陆界面if (isLoggedIn) {Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();}btnLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String username = etUsername.getText().toString();String password = etPassword.getText().toString();if ("cust".equals(username) && "12345".equals(password)) {//同户名和密码位置,在此处进行更改SharedPreferences.Editor editor = sharedPreferences.edit();editor.putBoolean("isLoggedIn", true);editor.apply();addFriendData();Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();} else {Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();}}private void addFriendData() {dbHelper = new DatabaseHelper(LoginActivity.this);dbHelper.clearDatabase();insertFriend(getBitmapAsByteArray(R.drawable.touxiang1), "马云", "支付宝转给你一千万,记得查收一下", "2024-10-20");insertFriend(getBitmapAsByteArray(R.drawable.touxiang2), "马化腾", "以后还要你多多照顾", "2024-10-18");insertFriend(getBitmapAsByteArray(R.drawable.touxiang3), "范冰冰", "明天你有空吗", "2024-10-10");insertFriend(getBitmapAsByteArray(R.drawable.touxiang4), "雷军", "谢谢你对小米的照顾", "2024-10-8");insertFriend(getBitmapAsByteArray(R.drawable.touxiang5), "巴菲特", "有空能一起吃个饭吗?", "2024-10-8");insertFriend(getBitmapAsByteArray(R.drawable.touxiang6), "比尔盖茨", "微软不能没有你啊", "2024-10-5");insertFriend(getBitmapAsByteArray(R.drawable.touxiang7), "马斯克", "你好", "2024-9-28");insertFriend(getBitmapAsByteArray(R.drawable.touxiang9), "张一鸣", "有问题想要请教你", "2024-9-28");insertFriend(getBitmapAsByteArray(R.drawable.touxiang10), "乔布斯", "你想接手苹果公司吗", "2024-9-26");insertFriend(getBitmapAsByteArray(R.drawable.touxiang11), "乔丹", "我会回来的", "2024-9-24");insertFriend(getBitmapAsByteArray(R.drawable.touxiang12), "周鸿祎", "谢谢你对360的支持", "2024-9-20");insertFriend(getBitmapAsByteArray(R.drawable.touxiang13), "王建林", "谢谢你借钱给我", "2024-9-20");insertFriend(getBitmapAsByteArray(R.drawable.touxiang8), "迪迦凹凸曼", "什么时候和我回光之国?", "2024-9-1");}});}private void insertFriend(byte[] avatar, String name, String lastMessage, String lastContact) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("avatar", avatar);values.put("name", name);values.put("last_message", lastMessage);values.put("last_contact", lastContact);db.insert("friends", null, values);}public byte[] getBitmapAsByteArray(int resourceId) {InputStream inputStream = getResources().openRawResource(resourceId);byte[] avatarData = null;try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {int bufferSize = 1024;byte[] buffer = new byte[bufferSize];int length;while ((length = inputStream.read(buffer)) > 0) {byteArrayOutputStream.write(buffer, 0, length);}avatarData = byteArrayOutputStream.toByteArray();} catch (IOException e) {e.printStackTrace();} finally {try {if (inputStream != null) {inputStream.close();}} catch (IOException ex) {ex.printStackTrace();}}return avatarData;}
}

MainActivity.java

package com.example.TheSixthExperiment;import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;public class MainActivity extends AppCompatActivity {private HorizontalScrollView horizontalScrollView;private ImageView erweima, quxiao;private LinearLayout llxiaoxi, llpindao, lllianxiren, lldongtai, button1, button2, button3, button4, button5;private ImageView ivxiaoxi, ivpindao, ivlianxiren, ivdonngtai;private TextView tvxiaoxi, tvpindao, tvlianxiren, tvdongtai;FragmentManager fragmentManager;FragmentTransaction fragmentTransaction;DongTaiFragment dongTaiFragment;LianXiRenFragment lianXiRenFragment;PinDaoFragment pinDaoFragment;XiaoXiFragment xiaoXiFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initEvent();setupButtonListeners();}private void initEvent() {fragmentManager = getSupportFragmentManager();fragmentTransaction = fragmentManager.beginTransaction();ivxiaoxi.setImageResource(R.drawable.xiaoxi2);tvxiaoxi.setTextColor(getResources().getColor(R.color.blue));fragmentTransaction.replace(R.id.fcv_fragment, xiaoXiFragment).commit();}private void initView() {llxiaoxi = findViewById(R.id.ll_xiaoxi);ivxiaoxi = findViewById(R.id.iv_xiaoxi);tvxiaoxi = findViewById(R.id.tv_xiaoxi);llpindao = findViewById(R.id.ll_pindao);ivpindao = findViewById(R.id.iv_pindao);tvpindao = findViewById(R.id.tv_pindao);lllianxiren = findViewById(R.id.ll_lianxiren);ivlianxiren = findViewById(R.id.iv_lianxiren);tvlianxiren = findViewById(R.id.tv_lianxiren);lldongtai = findViewById(R.id.ll_dongtai);ivdonngtai = findViewById(R.id.iv_dongtai);tvdongtai = findViewById(R.id.tv_dongtai);erweima = findViewById(R.id.erweima);quxiao = findViewById(R.id.quxiao);button1 = findViewById(R.id.button1);button2 = findViewById(R.id.button2);button3 = findViewById(R.id.button3);button4 = findViewById(R.id.button4);button5 = findViewById(R.id.button5);horizontalScrollView = findViewById(R.id.mhsv);dongTaiFragment=new DongTaiFragment();lianXiRenFragment=new LianXiRenFragment();pinDaoFragment=new PinDaoFragment();xiaoXiFragment=new XiaoXiFragment();}private void setupButtonListeners() {button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { showToast("笑脸"); }});button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showToast("电话");}});button3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showToast("点赞");}});button4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showToast("发现");}});button5.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showToast("标签");}});erweima.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {horizontalScrollView.smoothScrollTo(10000, 0);showImageDialog();}});quxiao.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {horizontalScrollView.smoothScrollTo(10000, 0);}});lllianxiren.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {initDaoHang();fragmentManager = getSupportFragmentManager();fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fcv_fragment, lianXiRenFragment).commit();ivlianxiren.setImageResource(R.drawable.lianxiren2);tvlianxiren.setTextColor(getResources().getColor(R.color.blue));}});llxiaoxi.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {initDaoHang();fragmentManager = getSupportFragmentManager();fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fcv_fragment, xiaoXiFragment).commit();ivxiaoxi.setImageResource(R.drawable.xiaoxi2);tvxiaoxi.setTextColor(getResources().getColor(R.color.blue));}});llpindao.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {initDaoHang();fragmentManager = getSupportFragmentManager();fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fcv_fragment, pinDaoFragment).commit();ivpindao.setImageResource(R.drawable.pingdao2);tvpindao.setTextColor(getResources().getColor(R.color.blue));}});lldongtai.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {initDaoHang();fragmentManager = getSupportFragmentManager();fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fcv_fragment, dongTaiFragment).commit();ivdonngtai.setImageResource(R.drawable.dongtai2);tvdongtai.setTextColor(getResources().getColor(R.color.blue));}});}private void showToast(String message) {Toast.makeText(this, message, Toast.LENGTH_SHORT).show();}private void showImageDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);LayoutInflater inflater = getLayoutInflater();View dialogView = inflater.inflate(R.layout.custom_dialog_layout, null);ImageView dialogImageView = dialogView.findViewById(R.id.dialog_image_view);dialogImageView.setImageResource(R.drawable.cust);builder.setView(dialogView).setCancelable(true);AlertDialog alertDialog = builder.create();alertDialog.show();}private void initDaoHang() {ivlianxiren.setImageResource(R.drawable.lianxiren1);tvlianxiren.setTextColor(getResources().getColor(R.color.black));ivpindao.setImageResource(R.drawable.pingdao1);tvpindao.setTextColor(getResources().getColor(R.color.black));ivdonngtai.setImageResource(R.drawable.dongtai1);tvdongtai.setTextColor(getResources().getColor(R.color.black));ivxiaoxi.setImageResource(R.drawable.xiaoxi1);tvxiaoxi.setTextColor(getResources().getColor(R.color.black));}
}

XiaoXiFragment.java

package com.example.TheSixthExperiment;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;import java.util.ArrayList;
import java.util.List;public class XiaoXiFragment extends Fragment {private RecyclerView recyclerView;private FriendAdapter friendAdapter;private List<Friend> friendList;private DatabaseHelper dbHelper;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// 初始化布局View view = inflater.inflate(R.layout.fragment_xiao_xi, container, false);recyclerView = view.findViewById(R.id.recyclerView);dbHelper = new DatabaseHelper(getActivity()); // 使用getActivity()获取上下文// 从数据库读取数据friendList = getFriendsFromDatabase();// 设置RecyclerViewrecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));friendAdapter = new FriendAdapter(getActivity(), friendList);recyclerView.setAdapter(friendAdapter);return view;}private List<Friend> getFriendsFromDatabase() {List<Friend> friends = new ArrayList<>();SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query("friends", new String[]{"id", "avatar", "name", "last_message", "last_contact"},null, null, null, null, "id ASC");while (cursor.moveToNext()) {Friend friend = new Friend();friend.setAvatar(cursor.getBlob(cursor.getColumnIndex("avatar")));friend.setName(cursor.getString(cursor.getColumnIndex("name")));friend.setLastMessage(cursor.getString(cursor.getColumnIndex("last_message")));friend.setLastContact(cursor.getString(cursor.getColumnIndex("last_contact")));friends.add(friend);}cursor.close();return friends;}
}

MyHorizontalScrollVie.java

package com.example.TheSixthExperiment;import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;public class MyHorizontalScrollView extends HorizontalScrollView {//滚动条中的水平先行布局private LinearLayout mWrpper;//水平线性布局的左侧菜单menuprivate ViewGroup mMenu;//水平先行布局的右侧线性布局private ViewGroup mContent;//屏幕的宽private int mScreenWidth;//menu的宽离屏幕右侧的距离private int mMenuRightPadding=50;//menu的宽度private int mMenuWidth;private boolean once;/*** 未使用自定义属性时调用* */public MyHorizontalScrollView(Context context, AttributeSet attrs) {super(context, attrs);/** 获取屏幕的宽度* 通过context拿到windowManager,在通过windowManager拿到Metrics,用DisplayMetrics接收* */WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth=outMetrics.widthPixels;//把dp转换成pxmMenuRightPadding=(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50,context.getResources().getDisplayMetrics());}/** 设置子view的宽和高* */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubif(!once){mWrpper=(LinearLayout) getChildAt(0);mMenu=(ViewGroup) mWrpper.getChildAt(0);mContent=(ViewGroup) mWrpper.getChildAt(1);//menu的宽度等于屏幕的宽度减去menu离屏幕右侧的边距mMenuWidth=mMenu.getLayoutParams().width=mScreenWidth;//右边的先行布局的宽度直接等于屏幕的宽度mContent.getLayoutParams().width=mScreenWidth;once=true;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/** 通过设置偏移量将menu隐藏* */@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubsuper.onLayout(changed, l, t, r, b);/** 通过scrollTo(x,y)方法设置屏幕的偏移量,x为正* 内容向左移动* */if(changed){this.scrollTo(mMenuWidth, 0);}}/** 因为HorizontalScrollView自己控制move和down的事件* 所以我们还要判断一下up.如果当前的x偏移量大于menu宽度的一半* 隐藏menu,否则显示menu* */@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubint action=ev.getAction();switch(action){case MotionEvent.ACTION_UP:int scrollX=getScrollX();if(scrollX>=mMenuWidth/2){this.smoothScrollTo(mMenuWidth, 0);}else{this.smoothScrollTo(0, 0);}return true;}return super.onTouchEvent(ev);}
}

activity_ login.xml

<?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="match_parent"android:gravity="center"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Username:cust"android:inputType="text" /><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:hint="Password:12345"android:inputType="textPassword" /><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:text="Login" /></LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<com.example.TheSixthExperiment.MyHorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/mhsv"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:orientation="horizontal"><include layout="@layout/meum" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.fragment.app.FragmentContainerViewandroid:id="@+id/fcv_fragment"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"/><includelayout="@layout/daohang"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout></LinearLayout>
</com.example.TheSixthExperiment.MyHorizontalScrollView>

custom _dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageViewandroid:id="@+id/dialog_image_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/cust" />
</RelativeLayout>

daohang.xml

<?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"android:layout_alignParentBottom="true"android:background="@color/white"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/ll_xiaoxi"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="?attr/selectableItemBackground"android:clickable="true"android:gravity="center_horizontal"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_xiaoxi"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/xiaoxi1" /><TextViewandroid:id="@+id/tv_xiaoxi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="消息"android:textSize="20sp" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_pindao"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="?attr/selectableItemBackground"android:clickable="true"android:gravity="center_horizontal"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_pindao"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/pingdao1" /><TextViewandroid:id="@+id/tv_pindao"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="频道"android:textSize="20sp" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_lianxiren"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="?attr/selectableItemBackground"android:clickable="true"android:gravity="center_horizontal"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_lianxiren"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/lianxiren1" /><TextViewandroid:id="@+id/tv_lianxiren"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="联系人"android:textSize="20sp" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_dongtai"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="?attr/selectableItemBackground"android:clickable="true"android:gravity="center_horizontal"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_dongtai"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/dongtai1" /><TextViewandroid:id="@+id/tv_dongtai"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="动态"android:textSize="20sp" /></LinearLayout></LinearLayout>

fragment_ xiao_ xi.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/fragment_root_view"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".XiaoXiFragment"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="8dp"android:scrollbars="vertical" /></FrameLayout>

friend_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_touxiang"android:layout_width="60dp"android:layout_height="60dp"android:padding="5dp" /><TextViewandroid:id="@+id/tv_nicheng"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:layout_toRightOf="@+id/iv_touxiang"/><TextViewandroid:id="@id/tv_xiaoxi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="15sp"android:layout_toRightOf="@+id/iv_touxiang"android:layout_below="@+id/tv_nicheng"/><TextViewandroid:id="@+id/tv_shijian"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginRight="50dp"android:layout_marginTop="5dp"/></RelativeLayout>

meum.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffff"android:orientation="vertical"><ImageViewandroid:id="@+id/erweima"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentTop="true"android:layout_alignParentRight="true"android:layout_marginTop="163dp"android:padding="10dp"android:src="@drawable/erweima" /><ImageViewandroid:id="@+id/quxiao"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentTop="true"android:layout_alignParentRight="true"android:layout_marginRight="3dp"android:clickable="true"android:padding="10dp"android:src="@drawable/quxiao" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="175dp"android:orientation="vertical"android:padding="10dp"><LinearLayoutandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/selectableItemBackground"android:clickable="true"android:orientation="horizontal"><ImageViewandroid:id="@+id/imageView1"android:layout_width="41dp"android:layout_height="41dp"android:src="@drawable/xiaolian"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.3" /><TextViewandroid:id="@+id/textView1"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="10dp"android:paddingTop="10dp"android:text="笑脸"android:textColor="#000000"app:layout_constraintBottom_toBottomOf="@id/imageView1"app:layout_constraintStart_toEndOf="@id/imageView1"app:layout_constraintTop_toTopOf="parent" /></LinearLayout><LinearLayoutandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/selectableItemBackground"android:clickable="true"><ImageViewandroid:id="@+id/imageView2"android:layout_width="41dp"android:layout_height="41dp"android:src="@drawable/dianhua"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.3" /> <!-- 可选:设置相对宽度 --><TextViewandroid:id="@+id/textView2"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="10dp"android:paddingTop="10dp"android:text="电话"android:textColor="#000000"app:layout_constraintBottom_toBottomOf="@id/imageView1"app:layout_constraintStart_toEndOf="@id/imageView1"app:layout_constraintTop_toTopOf="parent" /></LinearLayout><LinearLayoutandroid:id="@+id/button3"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/selectableItemBackground"android:clickable="true"><ImageViewandroid:id="@+id/imageView3"android:layout_width="41dp"android:layout_height="41dp"android:src="@drawable/dianzan"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.3" /> <!-- 可选:设置相对宽度 --><TextViewandroid:id="@+id/textView3"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="10dp"android:paddingTop="10dp"android:text="点赞"android:textColor="#000000"app:layout_constraintBottom_toBottomOf="@id/imageView1"app:layout_constraintStart_toEndOf="@id/imageView1"app:layout_constraintTop_toTopOf="parent" /></LinearLayout><LinearLayoutandroid:id="@+id/button4"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/selectableItemBackground"android:clickable="true"><ImageViewandroid:id="@+id/imageView4"android:layout_width="41dp"android:layout_height="41dp"android:src="@drawable/faxian"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.3" /> <!-- 可选:设置相对宽度 --><TextViewandroid:id="@+id/textView4"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="10dp"android:paddingTop="10dp"android:text="发现"android:textColor="#000000"app:layout_constraintBottom_toBottomOf="@id/imageView1"app:layout_constraintStart_toEndOf="@id/imageView1"app:layout_constraintTop_toTopOf="parent" /></LinearLayout><LinearLayoutandroid:id="@+id/button5"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/selectableItemBackground"android:clickable="true"><ImageViewandroid:id="@+id/imageView5"android:layout_width="41dp"android:layout_height="41dp"android:src="@drawable/biaoqian"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.3" /> <!-- 可选:设置相对宽度 --><TextViewandroid:id="@+id/textView5"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="10dp"android:paddingTop="10dp"android:text="标签"android:textColor="#000000"app:layout_constraintBottom_toBottomOf="@id/imageView1"app:layout_constraintStart_toEndOf="@id/imageView1"app:layout_constraintTop_toTopOf="parent" /></LinearLayout></LinearLayout></RelativeLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="purple_200">#FFBB86FC</color><color name="purple_500">#FF6200EE</color><color name="purple_700">#FF3700B3</color><color name="teal_200">#FF03DAC5</color><color name="teal_700">#FF018786</color><color name="black">#FF000000</color><color name="white">#FFFFFFFF</color><color name="blue">#1296db</color>
</resources>

AndroidManifest.xml(请注意这个代码的结构)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.TheSixthExperiment"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.TheSecond"><activity android:name="com.example.TheSixthExperiment.LoginActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.example.TheSixthExperiment.MainActivity"></activity></application></manifest>

工程文件

通过网盘分享的文件:TheSixthExperiment.zip
链接:https://pan.baidu.com/s/1_3GeK8TAfbmL1ygiiV7xtQ?pwd=4v6d 提取码: 4v6d

gitee:android studio: 移动应用开发实验代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487321.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…

MaxEnt模型在物种分布模拟中如何应用?R语言+MaxEnt模型融合物种分布模拟、参数优化方法、结果分析制图与论文写作

目录 第一章 以问题导入的方式&#xff0c;深入掌握原理基础 第二章 常用数据检索与R语言自动化下载及可视化方法 第三章 R语言数据清洗与特征变量筛选 第四章 基于ArcGIS、R数据处理与进阶 第五章 基于Maxent的物种分布建模与预测 第六章 基于R语言的模型参数优化 第七…

数字图像处理(15):图像平移

&#xff08;1&#xff09;图像平移的基本原理&#xff1a;计算每个像素点的移动向量&#xff0c;并将这些像素按照指定的方向和距离进行移动。 &#xff08;2&#xff09;平移向量包括水平和垂直分量&#xff0c;可以表示为&#xff08;dx&#xff0c;dy&#xff09;&#xff…

海外的bug-hunters,不一样的403bypass

一种绕过403的新技术&#xff0c;跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 &#xff08;访问fsip.svc为403&#xff09; 在经过尝试后&#xff0…

WPF Prism 01-BootstrapperShell

Prism介绍 Prism 是一个用于在 WPF、.NET MAUI、Uno 平台和 Xamarin Forms 中构建松耦合、可维护和可测试的 XAML 应用程序的框架。每个平台都有单独的发布版本&#xff0c;并且这些版本将在独立的开发时间线上进行开发。Prism 提供了一组设计模式的实现&#xff0c;这些模式有…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Sketch中文版下载安装:一站式设计平台指南

Sketch&#xff0c;这个以轻量和高效著称的矢量设计工具&#xff0c;已经在全球设计领域创造了许多令人惊叹的成果。它以其矢量编辑、控件和样式等功能而闻名。而其中文版本——一站式设计平台“在线设计工具”&#xff0c;在功能全面性、中文操作环境、简洁界面以及设备兼容性…

机器学习决策树原理详解

一、引言 在当今蓬勃发展的人工智能与大数据领域&#xff0c;大模型正以前所未有的影响力改变着众多行业的格局。而决策树作为机器学习算法家族中的经典成员&#xff0c;以其简洁直观的特点和广泛的适用性&#xff0c;不仅能独立解决诸多实际问题&#xff0c;更是诸多先进大模…

Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例

1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…

物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉

0. 要实现的效果 让树莓派可以识别身边的一些物品&#xff0c;比如电脑&#xff0c;鼠标&#xff0c;键盘&#xff0c;杯子&#xff0c;行李箱&#xff0c;双肩包&#xff0c;床&#xff0c;椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…

大数据-245 离线数仓 - 电商分析 缓慢变化维 与 拉链表 SCD Slowly Changing Dimensions

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

【LeetCode: 160. 相交链表 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅

上一篇&#xff1a;《再用RNN神经网络架构设计生成式语言模型》 序言&#xff1a;本文探讨了如何通过多种方法改进模型的输出&#xff0c;包括扩展数据集、调整模型架构、优化训练数据的窗口设置&#xff0c;以及采用字符级编码。这些方法旨在提高生成文本的准确性和合理性&am…

51c大模型~合集86

我自己的原文哦~ https://blog.51cto.com/whaosoft/12772867 #MILP-StuDio 拆解高复杂运筹问题的砖石&#xff0c;打破数据稀缺的瓶颈&#xff0c;中科大提出高质量运筹数据生成方法 论文作者刘昊洋是中国科学技术大学 2023 级硕士生&#xff0c;师从王杰教授&#xff0c;…

从零用java实现 小红书 springboot vue uniapp (1)

前言 偶尔会用小红书发一些笔记 闲来无事 想自己实现一个小红书 正好可以学习一下 帖子 留言 im 好友 推送 等功能 下面我们就从零 开发一个小红书 后台依旧用我们的会员系统的脚手架 演示 http://120.26.95.195:8889/ 客户端我们使用uniapp 我们首先对主页进行一个分解 顶部我…

pyside6学习专栏(一)常用控件的使用(非QML方式)

前段业余时间在用pythonpyqt5边学边作一些小程序&#xff0c;总算作到了一个相对复杂的基本VTK三维显示地形图并计算挖填方工程量&#xff0c;作完后&#xff0c;又发现pyqt又是要收费的&#xff0c;就又看了下对应的替代库pyside6,对用此库的一些基本技能分享到此专栏中&#…

活动|华院计算董事长宣晓华应邀出席2024科创大会并作圆桌嘉宾

2024科创大会在上海举行&#xff0c;由中央广播电视总台和上海市人民政府共同主办。本次大会以“创新驱动 新质未来”为主题&#xff0c;来自知名院校、科研机构的专家学者以及科技企业、金融机构的相关负责人共聚一堂&#xff0c;探讨人工智能、生物医药等产业应用前景&#x…

计算机网络-IPSec VPN工作原理

一、IPSec VPN工作原理 昨天我们大致了解了IPSec是什么&#xff0c;今天来学习下它的工作原理。 IPsec的基本工作流程如下&#xff1a; 通过IKE协商第一阶段协商出IKE SA。 使用IKE SA加密IKE协商第二阶段的报文&#xff0c;即IPsec SA。 使用IPsec SA加密数据。 IPsec基本工作…

leetcode 3001. 捕获黑皇后需要的最少移动次数 中等

现有一个下标从 1 开始的 8 x 8 棋盘&#xff0c;上面有 3 枚棋子。 给你 6 个整数 a 、b 、c 、d 、e 和 f &#xff0c;其中&#xff1a; (a, b) 表示白色车的位置。(c, d) 表示白色象的位置。(e, f) 表示黑皇后的位置。 假定你只能移动白色棋子&#xff0c;返回捕获黑皇后…

linux 系统常用指令

1、查看内核版本 uname -r 2、列出占用空间最大的 10 个文件或目录 du -ah / | sort -rh | head -n 10 终于找到我虚拟机硬盘空间越来越少的原因了&#xff0c;类目......