安卓实现用户登录界面

这个是我们社团的作业,本人大一,也是刚刚接触安卓,很多东西都很陌生,不懂得问我们的学长,学长觉得问题太简单了不予回答O__O "…然而很多细节困扰了我很久,去网上找方法也费了好多的冤枉时间,所以总结一下这次的经验,希望能为其他初学者省下时间
guyhub:https://github.com/Zzzia/Login/tree/master/app/src/main


首先布局实现用户界面

ezgif.com-resize.gif

作业要求大致布局就是这样了,一个登录界面,一个注册界面,还是很简单的,不多说了

小细节:

1.注意RelativeLayoutFrameLayout的配合使用

2.方块周围的阴影用

android:elevation="3dip"

3.之前把图片放在了drawable文件夹里,设置背景导致了停止运行,其解决方案为把图片放在mipmap-xxxhdpi这个文件夹下,测试1m一下的图片应该是没问题的,而drawable文件夹300k就boom了。

4.建立第二个activity后一定要记得在manifest里注册,代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    <application
        android:allowBackup="true"
        ...
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        //添加在这个位置,我添加了两个
        <activity android:name=".LoginActivity" />
        <activity android:name=".MyActivity" />
    </application>
</manifest>

5.按钮用TextView来构建,这样会好看一点,用这个代码会产生水波纹效果:

android:foreground="?attr/selectableItemBackground"

6.EditView可以使用代码达到提示效果:

android:hint="输入账号"

7.设置返回键

是不是有时候进入了注册界面后习惯性的点返回,想要回到主界面时,程序关闭了?用一下方法可以解决

public class MainActivity extends Activity {  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
        }  
        /** 
         * 注意: 
         * super.onBackPressed()会自动调用finish()方法,关闭 
         * 当前Activity. 
         * 若要屏蔽Back键盘,注释该行代码即可 
         */  
        @Override  
        public void onBackPressed() {  
        //这里是重点
            super.onBackPressed();  
            System.out.println("按下了back键   onBackPressed()");         
        }  

标题栏设置

这里说的是自带的默认标题栏,我在网上找了很多方法去设置,最后只得出这一套方案实现

隐藏标题栏:
getSupportActionBar().hide();

设置标题:

getSupportActionBar().setTitle("登录");
出现返回箭头:

空白activity默认有标题栏,在继承AppCompatActivity的Activity中,直接使用下面代码出现返回箭头

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

设置返回箭头:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == android.R.id.home){
        //...
            //按下效果设置为返回
            onBackPressed();
        //...    
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

这里我设置按下效果是模拟返回键onBackPressed();

若要自定义设置标题栏,可以百度ToolBar使用教程


Activity跳转

有两种跳转方式

第一种是没有传回来信息的方式

Intent intent = new Intent();
//第一个是当前Activity,第二个是要跳转的Activity
intent.setClass(LoginActivity.this,MyActivity.class);
startActivity(intent);
LoginActivity.this.finish();

第二种(startActivityForResult)比较高级,可以实现业务逻辑,得到子页面传回来的信息,比如说这次我需要搜集用户注册的信息,然后把用户名在登录页面显示出来,以便用户直接输入密码登录。

在主页面里使用startActivityForResult(int requestCode, int resultCode, Intent data),同时重写onActivityResult(与onCreate同级),这里requestCode设置为1

在跳转页面里使用Intent,并putExtra传输数据,最后使用this.setResult(int requestCode,Intent intent)

主页面代码:

Intent intent = new Intent();
                intent.setClass(MainActivity.this,LoginActivity.class);
                MainActivity.this.startActivityForResult(intent,1);
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    ...
        switch(requestCode){
        case (1):{...}
        }
    ...     
    }

这里switch的是requestCode,也就是设置里输入的数字标志,用于多个页面的结果返回,例如,我要再从第三个页面接收返回信息:

MainActivity.this.startActivityForResult(intent,2);

可以添加case(2)来接收第三个页面的返回信息

跳转页面代码:

//设置regist按钮监听
regist.setOnClickListener(new TextView.OnClickListener(){
            @Override
            public void onClick(View view) {
            //number psw 为 EditText
            //psw =                  //(EditText)findViewById(R.id.Regist_password);
            
                username = number.getText().toString();
                password = psw.getText().toString();
            }
                Intent intent = new Intent();
 intent.setClass(LoginActivity.this,MainActivity.class);
                //将输入传递给主界面
                intent.putExtra("username",username);
                intent.putExtra("password",password);
            //关键语句
          LoginActivity.this.setResult(1,intent);
                //传递完毕
                LoginActivity.this.finish();
            }
        });

这里,顺序是先执行LoginActivity.this.setResult(1,intent);

然后执行LoginActivity.this.finish();

才能将信息返回,因此,finish是很重要的


文件读写,实现保存账号密码

这个我想了好久好久的,我刚刚入门比较辣鸡O__O "…最后也只能想出以txt保存,然后用集合来搜集数据的解决方式

首先是在注册页面搜集用户输入的数据并保存为txt文件

number = (EditText)findViewById(R.id.Regist_username);
psw = (EditText)findViewById(R.id.Regist_password);
regist = (TextView)findViewById(R.id.Regist_regist);

        //注册按钮监听
        regist.setOnClickListener(new TextView.OnClickListener(){
            @Override
            public void onClick(View view) {
                    username = number.getText().toString();
                    password = psw.getText().toString();
                //判断输入是否为空
                if(username.isEmpty()||password.isEmpty()||username.contains("#")){
                    Toast.makeText(LoginActivity.this, "用户名密码不能为空", Toast.LENGTH_SHORT).show();
                }
                else {
                    //若不为空,保存信息,传递信息,跳转页面
                    save();
                    //sava函数一定要看一下
                    Intent intent = new Intent();
                    intent.setClass(LoginActivity.this,MainActivity.class);
                    //将输入传递给主界面
                    intent.putExtra("username",username);
                    intent.putExtra("password",password);
                    LoginActivity.this.setResult(1,intent);
                    //传递完毕
                    LoginActivity.this.finish();
                }
            }
        });

sava函数:

    //用户信息保存
    //将用户名和密码分别放入两个不同的txt文件中
    public void save(){
    String registfile = "registfile.txt";
    String pswfile = "pswfile.txt";
        try {
        //以#号方式分割用户的信息
            String space = "#";
            FileOutputStream outputUsername = openFileOutput(registfile, Activity.MODE_APPEND);
            FileOutputStream outputPsw = openFileOutput(pswfile, Activity.MODE_APPEND);
            //保存数据并添加#号,以便一会儿用split()分割
            String name = username+space;
            String psw = password+space;
            outputUsername.write(name.getBytes());
            outputPsw.write(psw.getBytes());
            outputPsw.flush();
            outputUsername.flush();
            outputPsw.close();
            outputUsername.close();
            //提示保存txt成功
            Toast.makeText(this, "OK!", Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

MainActivity代码:

//在onCreate之前,我写了两组集合用于临时存放账号密码
//ArrayList<String> ListUser = new ArrayList<String>();
//ArrayList<String> ListPassword = new ArrayList<String>();
        //登录按钮监听
        login.setOnClickListener(new TextView.OnClickListener(){
            @Override
            public void onClick(View view) {
                try{
                    FileInputStream inputUsername = openFileInput(registfile);
                    byte[] bytes = new byte[1024];
                    ByteArrayOutputStream userOutputStream = new ByteArrayOutputStream();
                    while(inputUsername.read(bytes)!=-1){
                        userOutputStream.write(bytes,0,bytes.length);
                    }
                    inputUsername.close();
                    userOutputStream.close();
                    String username = new String(userOutputStream.toByteArray());
                    System.out.println(username);
                    //读取密码
                    FileInputStream inputPassword = openFileInput(pswfile);
                    ByteArrayOutputStream pswOutputStream = new ByteArrayOutputStream();
                    while(inputPassword.read(bytes)!=-1){
                        pswOutputStream.write(bytes,0,bytes.length);
                    }
                    inputPassword.close();
                    pswOutputStream.close();
                    String password = new String(pswOutputStream.toByteArray());

                    //将账号密码写入List
                    String[] tokenName = username.split("#");
                    for(int i = 0;i<tokenName.length-1;i++){
                        ListUser.add(tokenName[i]);
                    }
                    String[] tokenPsw = password.split("#");
                    for(int i = 0;i<tokenPsw.length-1;i++){
                        ListPassword.add(tokenPsw[i]);
                    }
                    //写入完成

                    //账号密码匹配
                    String username1 = Euesrname.getText().toString();
                    String password1 = Epassword.getText().toString();
                    
                    int i;
                    for(i=0;i<ListUser.size();i++){
                        //先检查是否有输入的账号
                        if(ListUser.get(i).equals(username1)){
                            //匹配密码
                            if(ListPassword.get(i).equals(password1)){
         Toast.makeText(MainActivity.this, "登录成功!", Toast.LENGTH_SHORT).show();
                           //跳转到登录成功后的界面
                                Intent intent = new Intent();
                                intent.setClass(MainActivity.this,MyActivity.class);
                                startActivity(intent);
                                MainActivity.this.finish();
                            }
                            else
                                Toast.makeText(MainActivity.this, "请检查密码是否正确", Toast.LENGTH_SHORT).show();
                        }
                    }
                    if(i==ListUser.size()-1){
                        Toast.makeText(MainActivity.this, "账号不存在", Toast.LENGTH_SHORT).show();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

到此也就结束了,能够实现图片上的功能了

在这次作业中,我添加了很多有趣的元素,与大家分享下


实现再次按下返回键结束程序

这种方案无疑是很人性友好的,不必弹出烦人的对话框,也不会手滑关掉,代码如下,添在onCreate后面

private long exitTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){   
        if((System.currentTimeMillis()-exitTime) > 2000){  
            Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();                                
            exitTime = System.currentTimeMillis();   
        } else {
            finish();
            System.exit(0);
        }
        return true;   
    }
    return super.onKeyDown(keyCode, event);
}

最简单的播放音乐方案

Mediaplayer = new MediaPlayer();
Mediaplayer = MediaPlayer.create(MyActivity.this, R.raw.bravesong);
Mediaplayer.start();

这东西可以后台,但是我并不知道后台时间长短,貌似各个安卓版本不一样?

停止播放的方法是

Mediaplayer.pause();

启动默认浏览器打开想要打开的网址

//设置跳转按钮启动浏览器
        go_web.setOnClickListener(new TextView.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
                MyActivity.this.onPause();
            }
        });
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容