上篇文章介绍了QQ界面的布局,这里写一下这个界面的相关代码(主要是账号栏和密码栏的小细节,还有下拉列表的实现)
<————最终的代码在文章最后贴出来————>
1、这是账号栏的设置
number.addTextChangedListener(new TextWatcher() {
//文本变化之前执行的方法
//start:开始的位置 count:被改变的原有的内容的个数 after:改变之后的内容的数量
//s: 表示改变之前的内容,通常start和count组合,可以在s中读取本次改变字段中被改变的内容
//after表示改变后新的内容的数量
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("TAG","beforeTextChanged方法被调用"+s+"----"+start+"----"+count);
}
//文本变化的时候执行的方法
//count表示新增的数量
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("TAG","onTextChanged方法被调用"+s+"----"+start+"----"+before+"----"+count);
}
//文本发生之后执行的方法
//s:表示最终的内容
@Override
public void afterTextChanged(Editable s) {
Log.d("TAG","onTextChanged方法被调用"+s);
String str = String.valueOf(s);
if(str.equals("1584677103")){
image.setImageResource(R.drawable.img2);
}else if(str.equals("1401720257")){
image.setImageResource(R.drawable.img140);
}else if(str.equals("193220847")){
image.setImageResource(R.drawable.img193);
}else if(str.equals("1243499510")){
image.setImageResource(R.drawable.img124);
}else if(str.equals("2842635969")){
image.setImageResource(R.drawable.img284);
}
if(s.length()>10){
Toast.makeText(MainActivity.this,"你的账号已超过10位",Toast.LENGTH_SHORT).show();
}
}
});
- 这是文本编辑框的一个监视器,他能对你输入前,输入中,输入后的内容做出相应的判断,可利用这个监视器对加入自己想要的逻辑
-
public void afterTextChanged(Editable s)
是对你输入的账号进行判断,如果equals对比成功,头像框中的头像就会通过image.setImageResource(R.drawable.img124);
发生相应变换
2、下拉列表的设置
private void initByXML() {
adapterXML = ArrayAdapter.createFromResource(this,R.array.datalist,android.R.layout.simple_list_item_1);
spinner.setAdapter(adapterXML);
}
- 通过下拉列表的适配器的createFromResource方法对下拉列表的内容进行初始化
- createFromResource的参数
R.array.datalist
是在value中自定义的内容,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="datalist">
<item>1584677103</item>
<item>1401720257</item>
<item>193220847</item>
<item>1243499510</item>
<item>2842635969</item>
</string-array>
</resources>
3、密码栏设置
password.addTextChangedListener(new TextWatcher() {
//文本变化之前执行的方法
//start:开始的位置 count:被改变的原有的内容的个数 after:改变之后的内容的数量
//s: 表示改变之前的内容,通常start和count组合,可以在s中读取本次改变字段中被改变的内容
//after表示改变后新的内容的数量
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("TAG","beforeTextChanged方法被调用"+s+"----"+start+"----"+count);
}
//文本变化的时候执行的方法
//count表示新增的数量
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("TAG","onTextChanged方法被调用"+s+"----"+start+"----"+before+"----"+count);
}
//文本发生之后执行的方法
//s:表示最终的内容
@Override
public void afterTextChanged(Editable s) {
if(s.length()>0){
visible.setImageDrawable(getResources().getDrawable(R.drawable.invisible));
}else{
visible.setImageDrawable(null);
}
}
});
- 和账号栏一样的功能
-
visible.setImageDrawable(getResources().getDrawable(R.drawable.invisible));
当输入开始输入密码时出现“密码密文显示”的提示图示,如果没输入密码或者删除完密码后,图示消失
4、按钮的设置
public void onClick(View v) {
switch (v.getId()){
case R.id.load:
// <————1、需要输入LS1234的情况下才能登陆成功————>
// String PW = new String(password.getText().toString());
// if(1584677103==Integer.parseInt(number.getText().toString())&&"LS1234".equals(PW)){
// Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// startActivity(intent);
// overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
// }else{
// Toast.makeText(MainActivity.this,"你的账号或者密码错误",Toast.LENGTH_SHORT).show();
// }
// <————2、不需要密码,直接登陆————>
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
break;
case R.id.visible:
if(check){
visible.setImageDrawable(getResources().getDrawable(R.drawable.invisible));
// visible.setImageResource(R.drawable.visible);
password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
password.setSelection(password.getText().length());
check = false;
}else{
visible.setImageDrawable(getResources().getDrawable(R.drawable.visible));
// visible.setImageResource(R.drawable.invisible);
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
password.setSelection(password.getText().length());
check = true;
}
break;
default:
break;
}
}
- 注释的代码是需要输入密码进行登陆的,没注释的代码可直接登陆
- 第一个按钮是登陆按钮
- 第二个按钮是密文显示按钮,当点击时,可将密码由“····”转换成数字“123”等等
- 在代码跳转的部分,我加入了自己写的画面切换动画(画面从左边出,下一个界面从右边进),即
overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
下面是在res下面建一个anim目录,然后写in_from_right和out_to_left,代码贴上:
<---in_from_right--->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="100%p"
android:interpolator="@android:anim/accelerate_interpolator"
android:toXDelta="0%p" >
</translate>
</set>
<---out_to_left--->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0%p"
android:toXDelta="-100%p"
android:toYDelta="0%p"
android:fromYDelta="0%p"
android:interpolator="@android:anim/accelerate_interpolator" >
</translate>
</set>
以上为代码的解析
下面是完整代码:
package com.example.qqlogin;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener {
private EditText number;
private EditText password;
private ImageButton load;
private ImageView image;
private ImageButton visible;
private boolean check = true;
private Spinner spinner;
private ArrayAdapter<CharSequence> adapterXML;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//用代码将状态栏变为透明,而不靠style;
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// if(Build.VERSION.SDK_INT >= 21) {
// Window window = getWindow();
// window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
// window.setStatusBarColor(Color.TRANSPARENT);
// //导航栏
// window.setNavigationBarColor(Color.TRANSPARENT);
// Log.d("MainActivity","这是第一一一处");
// }
//状态栏半透明效果
// if (Build.VERSION.SDK_INT >= 21) {
// getWindow().setFlags(
// WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
// WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// }
initData();
initByXML();
initListener();
visible.setOnClickListener(this);
load.setOnClickListener(this);
}
//重写Activity该方法,当窗口焦点变化时自动隐藏system bar,这样可以排除在弹出dialog和menu时,
//system bar会重新显示的问题。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideSystemUI();
}
}
private void hideSystemUI() {
View decorView = getWindow().getDecorView();
Log.d("MainActivity","这是第二处");
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //(修改这个选项,可以设置不同模式)
//使用下面三个参数,可以使内容显示在system bar的下面,防止system bar显示或
//隐藏时,Activity的大小被resize。
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// 隐藏导航栏和状态栏
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_FULLSCREEN
);
}
//显示system bar, 同时还是希望内容显示在system bar的下方。
private void showSystemUI() {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
private void initByXML() {
adapterXML = ArrayAdapter.createFromResource(this,R.array.datalist,android.R.layout.simple_list_item_1);
spinner.setAdapter(adapterXML);
}
private void initListener() {
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
number.setText(adapterXML.getItem(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
number.addTextChangedListener(new TextWatcher() {
//文本变化之前执行的方法
//start:开始的位置 count:被改变的原有的内容的个数 after:改变之后的内容的数量
//s: 表示改变之前的内容,通常start和count组合,可以在s中读取本次改变字段中被改变的内容
//after表示改变后新的内容的数量
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("TAG","beforeTextChanged方法被调用"+s+"----"+start+"----"+count);
}
//文本变化的时候执行的方法
//count表示新增的数量
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("TAG","onTextChanged方法被调用"+s+"----"+start+"----"+before+"----"+count);
}
//文本发生之后执行的方法
//s:表示最终的内容
@Override
public void afterTextChanged(Editable s) {
Log.d("TAG","onTextChanged方法被调用"+s);
String str = String.valueOf(s);
if(str.equals("1584677103")){
image.setImageResource(R.drawable.img2);
}else if(str.equals("1401720257")){
image.setImageResource(R.drawable.img140);
}else if(str.equals("193220847")){
image.setImageResource(R.drawable.img193);
}else if(str.equals("1243499510")){
image.setImageResource(R.drawable.img124);
}else if(str.equals("2842635969")){
image.setImageResource(R.drawable.img284);
}
if(s.length()>10){
Toast.makeText(MainActivity.this,"你的账号已超过10位",Toast.LENGTH_SHORT).show();
}
}
});
password.addTextChangedListener(new TextWatcher() {
//文本变化之前执行的方法
//start:开始的位置 count:被改变的原有的内容的个数 after:改变之后的内容的数量
//s: 表示改变之前的内容,通常start和count组合,可以在s中读取本次改变字段中被改变的内容
//after表示改变后新的内容的数量
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("TAG","beforeTextChanged方法被调用"+s+"----"+start+"----"+count);
}
//文本变化的时候执行的方法
//count表示新增的数量
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("TAG","onTextChanged方法被调用"+s+"----"+start+"----"+before+"----"+count);
}
//文本发生之后执行的方法
//s:表示最终的内容
@Override
public void afterTextChanged(Editable s) {
if(s.length()>0){
visible.setImageDrawable(getResources().getDrawable(R.drawable.invisible));
}else{
visible.setImageDrawable(null);
}
}
});
}
private void initData() {
number = findViewById(R.id.number);
password = findViewById(R.id.password);
load = findViewById(R.id.load);
image = findViewById(R.id.image);
visible = findViewById(R.id.visible);
spinner = findViewById(R.id.spinner);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.load:
// String PW = new String(password.getText().toString());
// if(1584677103==Integer.parseInt(number.getText().toString())&&"LS1234".equals(PW)){
// Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// startActivity(intent);
// overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
// }else{
// Toast.makeText(MainActivity.this,"你的账号或者密码错误",Toast.LENGTH_SHORT).show();
// }
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
break;
case R.id.visible:
if(check){
visible.setImageDrawable(getResources().getDrawable(R.drawable.invisible));
// visible.setImageResource(R.drawable.visible);
password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
password.setSelection(password.getText().length());
check = false;
}else{
visible.setImageDrawable(getResources().getDrawable(R.drawable.visible));
// visible.setImageResource(R.drawable.invisible);
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
password.setSelection(password.getText().length());
check = true;
}
break;
default:
break;
}
}
}
【注】代码中的
private void hideSystemUI()
方法
private void showSystemUI()
方法
以及protected void onCreate(Bundle savedInstanceState)
中注释的代码都是为了操作状态栏和导航栏的状态,一直在试着用代码去控制,但目前只能实现用XML中的属性去控制
网友评论