目录

一、测试环境说明

二、项目简介

三、项目演示

四、部设计详情(部分)

登录页

首页

五、项目源码 


一、测试环境说明

电脑环境

Windows 11

编写语言

JAVA

开发软件

Android Studio  (2020)

开发软件只要大于等于测试版本即可(近几年官网直接下载也可以),若是版本低于测试版本请自行测试。项目需要根据你的软件自行适配

二、项目简介

该项目简介来自网络,具体内容需要自行测试

该项目使用Android Studio软件Java语言SQLite数据库完成开发的新闻App,主要功能包括新闻列表展示、分类搜索、新闻详情查看以及本地记录存储。

App采用了SQLite数据库实现浏览记录和收藏功能的本地存储,界面方面使用了RecyclerView、ViewPager、TabLayout等控件实现流畅的交互体验。

并通过Retrofit框架处理网络请求和JSON数据解析。额外实现了登录注册页面和自定义字体等增强用户体验的功能。

该项目由编程乐学团队介入,优化布局完善功能

三、项目演示

网络资源模板--基于Android studio 新闻App

四、部设计详情(部分)

登录页

1. 页面的结构

该登录页面采用垂直线性布局,整体结构清晰简洁。顶部显示"华清闻新"艺术字标题,中间是半透明背景的登录表单区,包含用户名输入框、密码输入框、登录按钮和注册按钮。

底部显示版权信息。所有元素居中排列,背景使用图片填充,整体设计注重视觉层次和用户体验,通过合理的边距和间距营造舒适的视觉效果,色彩搭配以白色和蓝色为主,保持界面清爽美观。

2. 使用到的技术

该页面运用了多种Android开发技术:通过SQLite数据库实现用户信息存储和验证功能;使用Intent实现页面跳转至注册和欢迎页面;

采用Typeface自定义艺术字体增强视觉效果;通过Toast提示用户操作反馈;利用EditText和Button等基础控件构建交互界面。

布局方面采用透明度设置和背景色调营造现代感界面,同时通过elevation属性添加阴影效果提升立体感。

3. 页面详细介绍

这是一个标准的移动端登录页面,主要功能包括用户身份验证和注册跳转。页面启动时隐藏ActionBar以获得更大显示空间。

用户输入用户名密码后,系统会查询数据库进行验证,成功则跳转至欢迎页,失败则提示错误。

注册按钮可跳转至注册页面。界面设计上注重用户体验,输入框有明确提示文字,密码字段自动隐藏,按钮有明确的视觉反馈。

整体风格简约现代,半透明元素和精心选择的配色方案使界面既美观又不失功能性。

/*建立登录页面*/
package com.example.news.signup;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.database.sqlite.SQLiteDatabase;
import android.widget.Button;
import android.widget.EditText;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import android.graphics.Typeface;import com.example.news.R;public class LogIn extends AppCompatActivity {private EditText inf,passwd;private Button loginbtn,regbtn;private MyDatabaseHelper myDatabaseHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);//隐藏 ActionBargetSupportActionBar().hide();/*建立用户名输入框*/inf=(EditText) findViewById(R.id.name);/*建立密码输入框*/passwd=(EditText) findViewById(R.id.pwd);/*建立登录按钮*/loginbtn=(Button) findViewById(R.id.login);/*建立注册按钮*/regbtn=(Button) findViewById(R.id.reg);/*启动数据库*/myDatabaseHelper =new MyDatabaseHelper(this,"UserDB.db",null,1);/*按动注册键*/regbtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {registerClicked(view);}});loginbtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String username=inf.getText().toString();String userpassword=passwd.getText().toString();SQLiteDatabase db= myDatabaseHelper.getWritableDatabase();Cursor cursor = db.rawQuery("select * from User where name=?", new String[]{username});if (cursor.getCount() == 0) {Toast.makeText(LogIn.this, "用户名不存在!", Toast.LENGTH_SHORT).show();} else {if (cursor.moveToFirst()) {String userpassword_db = cursor.getString(cursor.getColumnIndexOrThrow("password"));if (userpassword.equals(userpassword_db)) {Toast.makeText(LogIn.this,"登录成功",Toast.LENGTH_SHORT).show();Intent intent = new Intent(LogIn.this, Welcome.class);startActivity(intent);finish();} else {Toast.makeText(LogIn.this, "密码错误,请重新登录", Toast.LENGTH_SHORT).show();}}}cursor.close();db.close();}});/*设定艺术字*/TextView title=findViewById(R.id.tit);TextView ps1=findViewById(R.id.ps);Typeface typeface = Typeface.createFromAsset(getAssets(), "character.ttf");title.setTypeface(typeface);ps1.setTypeface(typeface);}public void registerClicked(View view){Intent intent=new Intent(LogIn.this, Register.class);startActivity(intent);}
}

首页

1. 页面结构

该页面采用CoordinatorLayout作为根布局,整体分为顶部标题栏和内容区域两部分。顶部标题栏包含搜索按钮、分类选择区域和滑动标签栏,采用蓝色背景和白色文字形成鲜明对比。

内容区域使用ViewPager承载不同分类的新闻片段,实现左右滑动切换。页面结构层次分明,顶部固定导航区与下方可滑动内容区相结合,既保证了功能完整性,又确保了操作便捷性。色彩搭配以蓝白为主,符合新闻类应用的简洁风格。

2. 使用技术

该页面运用了多种高级技术:通过SlidingTabLayout实现可滑动的分类标签栏;

使用ViewPager配合FragmentPagerAdapter管理多个新闻分类页面;采用Fragment间通信机制实现分类数据的传递和更新;

利用CoordinatorLayout协调滚动行为;通过自定义FixedPager解决滑动冲突问题。界面交互方面实现了点击下拉选择分类、搜索跳转等功能,整体技术方案既保证了性能又提供了流畅的用户体验。

3. 功能详解

这是一个新闻应用首页,核心功能包括新闻分类展示和内容浏览。顶部搜索框可跳转至搜索页面,右侧按钮展开分类选择弹窗。

滑动标签栏展示当前选中的新闻分类,左右滑动可切换不同分类内容。

页面采用懒加载优化性能,通过setOffscreenPageLimit控制预加载数量。分类管理功能允许用户自定义显示的分类和顺序,变更后会实时更新界面。

整体设计注重实用性和交互体验,色彩和布局符合Material Design规范,操作反馈及时明确。

package com.example.news.Fragment;import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.ViewPager;import com.flyco.tablayout.SlidingTabLayout;
import com.example.news.R;
import com.example.news.SearchActivity;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class HomeFragment extends Fragment implements CategoriesFragment.DL{private ArrayList<Fragment> fragments = new ArrayList<>();private List<String> myup=new ArrayList<>();private List<String> mydown=new ArrayList<>();private ViewPager viewPager;private SlidingTabLayout slidingTabLayout;private ImageButton imageButton;private Button search;private MyPagerAdapter myPagerAdapter;@Overridepublic void DC(List<String> TitlesOn, List<String> TitlesOff) {FragmentTransaction ft = getChildFragmentManager().beginTransaction();for (int i=0;i<fragments.size();i++) {ft.remove(fragments.get(i));}ft.commitNow();fragments.clear();for(int i=0;i<myup.size();i++){fragments.add(NewsFragment.newInstance(myup.get(i)));}viewPager.setAdapter(myPagerAdapter);slidingTabLayout.notifyDataSetChanged();slidingTabLayout.onPageSelected(0);}public static HomeFragment newInstance() {HomeFragment fragment = new HomeFragment();String[] title = {"头条", "娱乐", "军事", "教育", "文化","健康", "财经", "体育", "汽车", "科技", "社会"};Collections.addAll(fragment.myup,title);return fragment;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View v = inflater.inflate(R.layout.fragment_home, container, false);initview(v);return v;}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);for(String title : myup){fragments.add(NewsFragment.newInstance(title));}viewPager.setOffscreenPageLimit(fragments.size());myPagerAdapter = new MyPagerAdapter(getChildFragmentManager());viewPager.setAdapter(myPagerAdapter);slidingTabLayout.setViewPager(viewPager);search.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent(getActivity(), SearchActivity.class);startActivity(intent);}});imageButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {transformdata();}});}private class MyPagerAdapter extends FragmentPagerAdapter {public MyPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic int getCount() {return fragments.size();}@Overridepublic CharSequence getPageTitle(int position) {return myup.get(position);}@Overridepublic Fragment getItem(int position) {return fragments.get(position);}}public void transformdata(){CategoriesFragment mBottomCategory = CategoriesFragment.newInstance(myup,mydown);View _view = getLayoutInflater().inflate(R.layout.fragment_category, null);mBottomCategory.setDataChangeListener(HomeFragment.this);mBottomCategory.show(getActivity().getSupportFragmentManager(), "bottom_category");}public void initview(View view){viewPager = view.findViewById(R.id.vp);slidingTabLayout = view.findViewById(R.id.SlidingTabLayout);search=view.findViewById(R.id.search_btn);imageButton=view.findViewById(R.id.ib);imageButton.setImageResource(R.drawable.copy);TextView title=view.findViewById(R.id.headtitle);Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "character.ttf");title.setTypeface(typeface);}
}

五、项目源码 

👇👇👇👇👇快捷方式👇👇👇👇👇

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

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

相关文章

通过Location API精准获取位置信息并优化定位精度!

&#x1f44b; 你好&#xff0c;欢迎来到我的博客&#xff01;我是【菜鸟不学编程】    我是一个正在奋斗中的职场码农&#xff0c;步入职场多年&#xff0c;正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上&#xff0c;我决定记录下自己的学习与成…

构建可扩展的状态系统:基于 ArkTS 的模块化状态管理设计与实现

摘要 在 HarmonyOS 的日常开发中&#xff0c;很多人都会遇到一个问题&#xff1a;多个页面之间的数据状态如何共享&#xff1f;尤其是在组件结构越来越复杂的场景下&#xff0c;如果还用传统方式来传值&#xff0c;不仅代码混乱&#xff0c;维护也很吃力。 为了解决这个问题&am…

重生之我在暑假学习微服务第二天《MybatisPlus-下篇》

本系列参考黑马程序员微服务课程&#xff0c;有兴趣的可以去查看相关视频&#xff0c;本系列内容采用渐进式方式讲解微服务核心概念与实践方法&#xff0c;每日更新确保知识点的连贯性。通过系统化学习路径帮助开发者掌握分布式系统构建的关键技术。读者可通过平台订阅功能获取…

系统整理Python的条件语句和常用方法

Python 的条件语句&#xff08;if 语句&#xff09;是控制程序流程的基础之一&#xff0c;结构清晰、语法简洁&#xff0c;非常适合初学者掌握。一、基本语法结构if 条件:执行代码块1 elif 条件2:执行代码块2 else:执行代码块3示例&#xff1a;score 85if score > 90:print…

记录个IAR程序下载后硬件复位不运行,必须断电复位才运行的问题

【问题测试】有个F407的跑马灯的例子&#xff0c;是MDK和IAR两个版本&#xff0c;MDK版本的例子下载并复位后可以正常看到LED闪烁&#xff0c;而IAR的例子下进去后&#xff0c;不会闪烁。使用TOOL的上位机内核寄存器监测工具测试发现&#xff0c;硬件复位后竟然还在调试状态&am…

观察者模式(Observer Pattern)和 发布-订阅模式(Publisher-Subscriber Pattern)

你对 观察者模式&#xff08;Observer Pattern&#xff09;和 发布-订阅模式&#xff08;Publisher-Subscriber Pattern&#xff09;的描述是非常准确的&#xff0c;并且阐明了它们的核心区别。为了帮助你更好地理解这两者的细微差异&#xff0c;下面是一个更详细的对比分析&am…

2025年接口技术的十字路口:当MCP遇见REST、GraphQL与gRPC

在当今这个由数据驱动、万物互联的时代&#xff0c;应用程序接口&#xff08;API&#xff09;已成为现代软件架构的基石。它们是不同服务之间沟通的桥梁&#xff0c;支撑着从网页应用到复杂的微服务生态系统的一切。长久以来&#xff0c;开发者们在REST、GraphQL和gRPC这几种主…

【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php

题目 页面提示输入?code&#xff0c;那我们在网址里get一下出现了新页面的提示&#xff0c;进入看看下面有个help.php页面的提示&#xff0c;进入看看有一段php代码&#xff0c;仔细分析&#xff0c;应该是要用反序列法代码如下 class FileClass{ public $filename error.log…

在 github.com 与 sourceforge.net 上创建免费个人静态网站、博客的区别

github.com github 属于 git 版本管理专业网站&#xff0c;有免费和收费两种套餐。git 的数据是存放在数据库中的&#xff0c;要将数据库中的数据显示为网站的网页&#xff0c;这需要服务器端提供专门的中间件支持才能实现。 特点&#xff1a; 官方支持&#xff1a;提供长期…

jenkins 入门指南:从安装到启动的完整教程

jenkins 入门指南&#xff1a;从安装到启动的完整教程 持续集成&#xff08;CI&#xff09;是现代开发流程中的核心环节&#xff0c;而 Jenkins 作为一款开源的 CI 工具&#xff0c;凭借简单安装、开箱即用、插件丰富、易于扩展等优势&#xff0c;成为开发者的首选工具。它能自…

机器学习(重学版)基础篇(概念与评估)

本篇参考周志华老师的西瓜书&#xff0c;但是本人学识有限仅能理解皮毛&#xff0c;如有错误诚请读友评论区指正&#xff0c;万分感谢。一、基础概念与评估方法本节目标&#xff1a;建立理论基础框架​1、机器学习定义机器学习是一门通过计算手段利用经验&#xff08;以数据形式…

spring/springboot SPI(二)配合使用的接口

spring.factories 里&#xff0c;Spring 会根据接口来加载实现类&#xff0c;常见的几个接口包括&#xff1a;一、org.springframework.context.ApplicationListener1、作用监听 Spring 容器事件&#xff0c;如 ApplicationReadyEvent。2、使用方法项目结构Spring Boot 2.xSpri…

基于Zig语言,opencv相关的c++程序静态交叉编译

一、写在前面 1.什么是zig? Zig 是一种通用编程语言&#xff1b; Zig 最初的定位就是代替C语言的系统级语言&#xff0c;它提供了与 C 语言几乎 100% 兼容&#xff08;可直接调用 C 头文件、链接 C 库&#xff09;&#xff0c;同时不需要任何依赖构建系统。 Zig 同时附带一…

基于 LSTM 与 SVM 融合的时间序列预测模型:理论框架与协同机制—实践算法(1)

目录 1、单一模型的局限性&#xff1a;混合架构的设计动机 2、LSTM 的时序特征提取&#xff1a;从原始序列到高阶表征 2.1、门控机制的时序过滤能力 2.2、隐藏状态的特征压缩作用 2.3、预训练的特征优化逻辑 3、SVM 的非线性映射&#xff1a;从高阶特征到预测输出 3.1、…

如何查看docker实例是否挂载目录,以及挂载了哪些目录

一条命令即可一次性列出当前容器里所有挂载点&#xff1a; docker inspect <容器ID或名称> --format{{range .Mounts}}{{printf "%-8s %-35s -> %s\n" .Type .Source .Destination}}{{end}}示例输出&#xff1a; bind /host/owrt/src …

Opentrons 模块化平台与AI技术助力智能移液创新,赋能AAW™自动化工作站

在生命科学领域加速拥抱自动化的关键节点&#xff0c;全球开源实验室自动化领导者 Opentrons 携手全球领先生命科学公司默克生命科学&#xff0c;重磅推出 AAW™智能自动化液体处理平台。这一战略合作的核心技术引擎 ——Opentrons Flex 第三代全自动移液工作站&#xff0c;正以…

C++学习笔记(八:函数与变量)

往篇内容&#xff1a; C学习笔记&#xff08;一&#xff09; 一、C编译阶段※ 二、入门案例解析 三、命名空间详解 四、C程序结构 C学习笔记&#xff08;二&#xff09; 五、函数基础 六、标识符 七、数据类型 补充&#xff1a;二进制相关的概念 sizeof 运算符简介 补…

智慧施工:施工流程可视化管理系统

图扑智慧施工全流程可视化管理系统&#xff0c;通过可视化界面&#xff0c;可直观掌握各工序衔接进度、资源调配情况&#xff0c;快速识别违规作业、设备故障等风险点 —— 如塔吊运行半径重叠、深基坑支护位移预警等。同时&#xff0c;系统支持施工方案模拟推演&#xff0c;对…

单链表的冒泡排序实现:从原理到代码详解

单链表的冒泡排序实现&#xff1a;从原理到代码详解 引言 单链表作为一种常见的数据结构&#xff0c;其排序操作因节点无法随机访问&#xff08;需通过指针遍历&#xff09;而与数组排序存在差异。冒泡排序因其实现简单、无需额外空间&#xff08;仅需指针操作&#xff09;&…

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

APT 是 Ubuntu 上安装需要外部依赖项的 Debian 包的一种方式,但还有另一种选择,即 GDebi。本文将介绍如何在 Ubuntu 24.04 上安装 GDebi,以及如何使用它来安装 .deb 包所需的依赖项。 什么是 GDebi? GDebi 是默认的 .deb 包安装器 DPKG 的轻量级替代品。与 DPKG 不同,GD…