一、主要实现:

  • 手机QQ登录界面的设计
  • Intent的显式跳转和隐式跳转
  • EditText点击小图标清除输入框内容
  • EditText密码输入框中密码可见与不可见的切换
  • 使用Fragment实现底部导航栏切换界面
  • PopupMenu的简单使用

二、实验环境:

  • Android Studio 3.5.2
  • SDK版本:API 29
  • JDK 1.8

三、实现效果:

四、重点源码:

1.登录界面布局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_horizontal"android:orientation="vertical"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="80dp"android:src="@drawable/smallqq" /><FrameLayoutandroid:layout_width="350dp"android:layout_height="70dp"android:layout_marginTop="50dp" ><EditTextandroid:id="@+id/qq_num"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/et_smallqq"android:hint="QQ号/手机号/邮箱"android:inputType="number"android:maxLines="1"android:textSize="20sp"android:gravity="center"/><ImageViewandroid:id="@+id/iv_et_num_delete"android:layout_width="25dp"android:layout_height="25dp"android:layout_gravity="right|center_vertical"android:layout_marginRight="20dp"android:background="@drawable/et_delete" /></FrameLayout><FrameLayoutandroid:layout_width="350dp"android:layout_height="70dp"android:layout_marginTop="20dp" ><EditTextandroid:id="@+id/qq_pwd"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/et_smallqq"android:hint="输入密码"android:inputType="textPassword"android:maxLines="1"android:textSize="20sp"android:gravity="center"/><ImageViewandroid:id="@+id/iv_et_pwd_delete"android:layout_width="25dp"android:layout_height="25dp"android:layout_gravity="right|center_vertical"android:layout_marginRight="20dp"android:background="@drawable/et_delete" /><ImageViewandroid:id="@+id/iv_et_pwd_see"android:layout_width="30dp"android:layout_height="20dp"android:layout_gravity="left|center_vertical"android:layout_marginLeft="20dp"android:src="@drawable/et_pwd_no" /></FrameLayout><ImageViewandroid:id="@+id/qq_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="80dp"android:src="@drawable/go_no" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:layout_marginTop="60dp"android:gravity="center"android:orientation="horizontal"><TextViewandroid:id="@+id/qq_forgetpwd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="忘记密码"android:textColor="@color/colorBlack" /><Viewandroid:layout_width="1dp"android:layout_height="10dp"android:layout_marginLeft="50dp"android:background="@color/colorBlackGery" /><TextViewandroid:id="@+id/qq_register"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:text="用户注册"android:textColor="@color/colorBlack" /></LinearLayout>
</LinearLayout>

2.登录界面代码java

package com.asyyy.androidkaifa.smallqq;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.asyyy.androidkaifa.R;public class SmallQQ_LoginActivity extends AppCompatActivity {private EditText et_qqnum, et_qqpwd;private ImageView iv_login, et_delete_num, et_delete_pwd, et_pwd_see;private TextView tv_forgetpwd, tv_register;private String qq_numtext, qq_pwdtext;private boolean pwdCanSee;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.smallqq_login_layout);findId();//QQ账号输入状态监听et_qqnum.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {qq_pwdtext = et_qqpwd.getText().toString().trim();qq_numtext = et_qqnum.getText().toString().trim();if(!TextUtils.isEmpty(qq_numtext) && !TextUtils.isEmpty(qq_pwdtext)){//如果账号和密码都不为空,打开图片响应事件,并且更换图片iv_login.setEnabled(true);iv_login.setImageResource(R.drawable.go_yes);}else {iv_login.setEnabled(false);iv_login.setImageResource(R.drawable.go_no);}}});//QQ密码输入状态监听et_qqpwd.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {qq_pwdtext = et_qqpwd.getText().toString().trim();qq_numtext = et_qqnum.getText().toString().trim();if(!TextUtils.isEmpty(qq_numtext) && !TextUtils.isEmpty(qq_pwdtext)){//如果账号和密码都不为空,打开图片响应事件,并且更换图片iv_login.setEnabled(true);iv_login.setImageResource(R.drawable.go_yes);}else {iv_login.setEnabled(false);iv_login.setImageResource(R.drawable.go_no);}}});//QQ密码输入焦点监听et_qqpwd.setOnFocusChangeListener((v, hasFocus) -> {if(hasFocus){et_pwd_see.setVisibility(View.VISIBLE);}else {et_pwd_see.setVisibility(View.INVISIBLE);}});//密码可见小图标pwdCanSee = false;//true密码可见,false密码不可见et_pwd_see.setOnClickListener(v -> {if(pwdCanSee){//设置不可见et_qqpwd.setTransformationMethod(PasswordTransformationMethod.getInstance());et_pwd_see.setImageResource(R.drawable.et_pwd_no);et_qqpwd.setSelection(et_qqpwd.getText().length());pwdCanSee = false;}else {//设置可见et_qqpwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());et_pwd_see.setImageResource(R.drawable.et_pwd_yes);et_qqpwd.setSelection(et_qqpwd.getText().length());pwdCanSee = true;}});//删除小图标EditTextUtils.clearButtonListener(et_qqnum, et_delete_num);EditTextUtils.clearButtonListener(et_qqpwd, et_delete_pwd);//登录//iv_login.setClickable(true);//setOnClickListener方法会默认把控件的setClickable设置为true。//设置login图片无事件响应iv_login.setEnabled(false);iv_login.setOnClickListener(v -> {qq_numtext = et_qqnum.getText().toString().trim();qq_pwdtext = et_qqpwd.getText().toString().trim();Toast.makeText(this,"登录成功!账号:" + qq_numtext + ",密码:" + qq_pwdtext,Toast.LENGTH_SHORT).show();Intent intent = new Intent(SmallQQ_LoginActivity.this, SmallQQ_MainChatActivity.class);startActivity(intent);});//忘记密码tv_forgetpwd.setOnClickListener(v -> {Intent intent = new Intent();intent.setAction("SmallQQ.error");startActivity(intent);});//用户注册tv_register.setOnClickListener(v -> startActivity(new Intent().setAction("SmallQQ.error")));}private void findId(){et_qqnum = findViewById(R.id.qq_num);et_qqpwd = findViewById(R.id.qq_pwd);iv_login = findViewById(R.id.qq_login);tv_forgetpwd = findViewById(R.id.qq_forgetpwd);tv_register = findViewById(R.id.qq_register);et_delete_num = findViewById(R.id.iv_et_num_delete);et_delete_pwd = findViewById(R.id.iv_et_pwd_delete);et_pwd_see = findViewById(R.id.iv_et_pwd_see);}
}

3.显示主界面布局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="match_parent"android:orientation="vertical"><RelativeLayoutandroid:id="@+id/top_bar"android:layout_width="match_parent"android:layout_height="60dp"android:background="@color/colorSmallQQ"><ImageViewandroid:id="@+id/user_photo"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:layout_centerVertical="true"android:src="@drawable/photo"/><TextViewandroid:id="@+id/user_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textSize="24sp"android:textColor="@color/colorWhite"android:textStyle="bold"android:text="消息"/><ImageViewandroid:id="@+id/menu_add"android:layout_width="24dp"android:layout_height="24dp"android:layout_marginRight="20dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:src="@drawable/add"/></RelativeLayout><FrameLayoutandroid:id="@+id/fragment_content"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/top_bar"android:layout_above="@id/bottom_bar"></FrameLayout><LinearLayoutandroid:id="@+id/bottom_bar"android:layout_width="match_parent"android:layout_height="60dp"android:layout_alignParentBottom="true"android:orientation="horizontal"><TextViewandroid:id="@+id/tvbar_user"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:drawableTop="@drawable/bar_news"android:drawablePadding="3dp"android:gravity="center"android:textColor="@drawable/bar_text"android:text="消息"/><TextViewandroid:id="@+id/tvbar_friend"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:drawableTop="@drawable/bar_friend"android:drawablePadding="3dp"android:gravity="center"android:textColor="@drawable/bar_text"android:text="联系人"/><TextViewandroid:id="@+id/tvbar_dongtai"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:drawableTop="@drawable/bar_dongtai"android:drawablePadding="3dp"android:gravity="center"android:textColor="@drawable/bar_text"android:text="动态"/></LinearLayout>
</RelativeLayout>

4.显示主界面代码java

package com.asyyy.androidkaifa.smallqq;import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.menu.MenuPopupHelper;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;import com.asyyy.androidkaifa.R;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class SmallQQ_MainChatActivity extends AppCompatActivity implements View.OnClickListener {private TextView user_title, bar_news, bar_friend, bar_dongtai;private ImageView menu_add;private NewsFragment newsFragment;private FriendFragment friendFragment;private DongtaiFragment dongtaiFragment;private FragmentManager fManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.smallqq_mainchat_layout);user_title = findViewById(R.id.user_title);bar_news = findViewById(R.id.tvbar_user);bar_friend = findViewById(R.id.tvbar_friend);bar_dongtai = findViewById(R.id.tvbar_dongtai);menu_add  = findViewById(R.id.menu_add);bar_news.setOnClickListener(this);bar_friend.setOnClickListener(this);bar_dongtai.setOnClickListener(this);fManager = getSupportFragmentManager();bar_news.performClick();//模拟一次点击,既进去后选择消息界面menu_add.setOnClickListener(v -> {PopupMenu popupMenu = new PopupMenu(SmallQQ_MainChatActivity.this, menu_add);popupMenu.getMenuInflater().inflate(R.menu.menu_add,popupMenu.getMenu());popupMenu.setOnMenuItemClickListener(item -> {String str = "";switch (item.getItemId()){case R.id.menu_add1:str = item.getTitle() + "";break;case R.id.menu_add2:str = item.getTitle() + "";break;case R.id.menu_add3:str = item.getTitle() + "";break;case R.id.menu_add4:str = item.getTitle() + "";break;case R.id.menu_add5:str = item.getTitle() + "";break;case R.id.menu_add6:str = item.getTitle() + "";break;}Toast.makeText(SmallQQ_MainChatActivity.this,"你点击了 " + str, Toast.LENGTH_SHORT).show();return true;});popupMenu.show();});}//重置所有文本的选中状态private void setSelected(){bar_news.setSelected(false);bar_friend.setSelected(false);bar_dongtai.setSelected(false);}//隐藏所有Fragmentprivate void hideAllFragment(FragmentTransaction transaction){if(newsFragment != null) transaction.hide(newsFragment);if(friendFragment != null) transaction.hide(friendFragment);if(dongtaiFragment != null) transaction.hide(dongtaiFragment);}@Overridepublic void onClick(View v) {//FragmentTransaction只能使用一次//每次使用都要调用FragmentManager的beginTransaction()方法获得FragmentTransaction事务对象FragmentTransaction transaction = fManager.beginTransaction();hideAllFragment(transaction);switch (v.getId()){case R.id.tvbar_user:setSelected();bar_news.setSelected(true);user_title.setText("消息");if(newsFragment == null){newsFragment = new NewsFragment();transaction.add(R.id.fragment_content, newsFragment);}else {transaction.show(newsFragment);}break;case R.id.tvbar_friend:setSelected();bar_friend.setSelected(true);user_title.setText("联系人");if(friendFragment == null){friendFragment = new FriendFragment();transaction.add(R.id.fragment_content, friendFragment);}else {transaction.show(friendFragment);}break;case R.id.tvbar_dongtai:setSelected();bar_dongtai.setSelected(true);user_title.setText("动态");if(dongtaiFragment == null){dongtaiFragment = new DongtaiFragment();transaction.add(R.id.fragment_content, dongtaiFragment);}else {transaction.show(dongtaiFragment);}break;}//把newsFragment添加到Activity中的指定位置,最后调用commit()或者commitAllowingStateLoss()transaction.commitAllowingStateLoss();}
}

五、源码下载:

积分下载(包含源码,用到的各种图片)

注:当初上传的时候设置的是0积分,但是积分会自动慢慢加,当初的文件我现在也不太好找了,不过重要的代码也粘贴出来了

https://download.csdn.net/download/qq_40907345/12377480

Android模拟手机QQ登录界面和主界面(含源码)相关推荐

  1. Python桌面可视化+自动登录学校教务系统(含源码!!!)

    前言:通过Python爬虫与tkinter模块实现桌面快捷自动化登录教务系统 目录: 前言:通过Python爬虫与tkinter模块实现桌面快捷自动化登录教务系统 效果展示: 整体思路: 总体框架: ...

  2. Qt之天气预报——界面优化篇(含源码+注释)

    一.界面优化效果 下方为界面优化完成和优化前的效果对比. 优化前: 优化后: 二.优化内容 添加标题栏 添加图片(图图标素材源自阿里巴巴矢量图标库) 更新UI内容(微调大小.布局比例) 添加鼠标事件函 ...

  3. 使用手机控制PPT播放实现方法(含源码)

    本文教你如何实现通过手机控制PC的幻灯片放映. 本篇文章是基于我的上一篇文章,上一篇文章中分享了这样一个小工具,这里把源码什么的分享出来. 本工具的制作使用Node.JS以及WebSocket技术,大 ...

  4. Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 动感影集就是只要用户添加一张图片,动感影集就能给每张图片渲染不同的动画效果,让原本静止的图片变得活泼起来,辅以各种精致的动画特效,营造一种赏心悦目的感 ...

  5. 计算机毕业设计android的手机点名签到学生请假考勤系统app(源码+系统+mysql数据库+Lw文档)

    项目介绍 完成基于安卓的点名签到学生请假考勤系统的设计和开发.有效地实现学生考勤信息管理的信息化,减轻管理人员的工作负担,高效率.规范化地管理大量的学生考勤信息,并避免人为操作的错误和不规范行为.运用 ...

  6. 基于android开发共享停车位的设计与实现(含源码及毕业设计)

    [摘 要]随着人们生活水平的不断提高,家用轿车保有量每年都在不断的攀升,导致城市交通问题日益突出.为缓解城市停车难的问题,本文提出了基于android平台下开发的共享停车系统app,意在帮助用户在高峰 ...

  7. QQ域名拦截检测工具(含源码)

    提供一个ip或域名,如何判断它在QQ里呈现什么状态呢? 目录 一.需求概述 二.解决方案 一.需求概述 在QQ中,发送一个域名,一般情况下会呈现以下三种状态: 1.危险网站:不能够直接访问的网站 2. ...

  8. Android项目:手机安全卫士(3)—— 主界面布局

    Android项目:手机安全卫士(3)-- 主界面布局 1 总纲 前面实现了"手机安全卫士"的闪屏界面与版本检测升级问题,接下来的任务就是实现主界面了,这个相对简单,因为没有涉及到 ...

  9. ​Android实现仿QQ登录可编辑下拉菜单

    Android实现仿QQ登录可编辑下拉菜单 在Android里,直接提供的Spinner控件虽然可以实现下拉菜单的效果,但其效果并不理想,很多时候我们需要类似手机QQ那样既可以在文本框中直接输入编辑文 ...

  10. android 实现仿QQ登录可编辑下拉菜单

    今天,简单讲讲android里如何实现向QQ一样的登录后记住用户名的下拉框. 这个其实也很简单,网上搜索了一下,很多相关的资料,基本都是PopupWindow+ListView的方式,实现起来比较灵活 ...

最新文章

  1. JavaScript系列-(原型-原型连-call-apply-继承)
  2. 石嘴山考计算机在哪里报名,石嘴山中考报名系统
  3. win7如何设置通电自动开机_电脑自动开机,教您怎么设置电脑自动开机
  4. 错误: libstdc++.so.6: cannot open shared object file: No such file or directory
  5. Luogu 3698 [CQOI2017]小Q的棋盘
  6. clock_gettime参数中不同clock ID含义的差别
  7. word怎么改一张纸的方向_折纸手工DIY,纸碗怎么折?一张纸就搞定,折法简单,宝宝也能折...
  8. Java 接口(interface)的三种类型
  9. python画柱状图-python 使用 matplotlib.pyplot来画柱状图和饼图
  10. bigsur降级回catalina_big sur怎么降到Catalina,macOS Big Sur降级教程
  11. 静默安装Oracle19c软件与数据库
  12. 开普勒行星运动三定律
  13. Protocol Buffer 简介
  14. 讲解图层样式中的混合颜色带
  15. 用js判断图片地址是否有效
  16. 思科交换机IOS备份和升级
  17. 解决DedeCMS搜索结果每页显示10条无法修改方法
  18. pwm控制直流电机转速流程图_直流电机的PWM速度控制程序
  19. 微积分位于基础数学的核心部分
  20. 计算机桌面怎么添加便签,桌面记事本,详细教您怎么在桌面添加便签

热门文章

  1. AI数据服务行业进入“认知战争”,云测数据凭什么稳居行业TOP1?
  2. python读取excel文件数据并且画折线图(入门级)
  3. 05 js面向对象(属性操作符,创建对象)
  4. Mysql 索引存放位置
  5. Outlook的服务器设置中POP3协议,在outlook的服务器设置中pop3协议是指什么
  6. python正则匹配数字_python——正则匹配数字
  7. linux下载navicat
  8. go语言swag注解示例
  9. ccs定义的函数不变色_ccs使用问题及解决办法
  10. signature=cc8d613f503e9b933c233da06afc0fc6,襄阳市公安局交通警察支队违法车辆信息公告20210118...