登陆界面--记住密码、最近用户、修改密码

     一个App,登陆界面是少不了的,因为我这个项目对登陆的要求不是很高,所以最初我就是用一个数据库做的。后来发现网上别人都是用sharedpreferences做的。然后我就把两者结合在一起做了一个,其实都是保存数据。不多说,直接上图,看效果。(一些隐私显示信息我已经删掉,就是裸的登陆界面)

      如果上一次登陆是记住密码,那么下次登陆就是记住上次登陆的用户名和密码,类似扣扣的登陆设计。

       如果你是管理员,你可以添加新用户,如果添加的用户是已经存在的用户,就认为是修改密码。

       这里可以显示出已存在的用户索引。

       界面的设计主要用到的是Tab,把登陆界面和添加用户、修改密码分开。其他的控件都很简单。

//标签
		TabHost tabHost = (TabHost) findViewById(R.id.mytab);

        // 如果不是继承TabActivity,则必须在得到tabHost之后,添加标签之前调用tabHost.setup()
        tabHost.setup();

        // 这里content的设置采用了布局文件中的view
        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("用户登录").setContent(R.id.tab1));
        tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("用户管理")
                .setContent(R.id.tab2));

         数据库的列只有两条,用户名和密码,当然还有唯一的key:id。创建数据库,向数据库里面插入,修改记录和查询数据库记录,这些在前面的文章中都多次说到了,这里不再说。可以参考以前博文。http://blog.csdn.net/jishucai/article/details/24287841

       思路是,在管理员界面把用户的信息添加到数据库。如果用户信息已经存在,就表示他的操作是修改密码,也就是对数据库的记录进行修改,改成新密码。而登陆界面的判断就是对数据库的查询,如果能找到记录,且密码和数据库中一致,则通过验证,否则提示各种错误,比方说信息不完整、用户不存在,密码错误等。

       还要实现的功能是,如果这次选择记住了密码,下次登陆就会直接记住密码和用户名,用户可以直接点登陆就可以了。

       我这里是用sharedpreferences做的,因为不想每次都向数据库插入两条记录,再次打开程序又重新读那两条记录,所以我去查资料,发现原来大家的登陆都是用这个做的,基本没有用数据库的,不过不想改,所以我把两者结合做了,用户信息放在数据库,而最近一次的用户登陆和是否记住密码这个checkbox信息放在了这个xml文件中。

       这个sharedpreferences用起来很简单,类似于bundle,有很多文章都说了,我这里简单的说,就是你首先创建一个用来存的文件,getSharedPreferences(),他的参数两个,第一个是你要存的文件名,第二个是你存的形式,一般是MODE_PRIVATE;然后向这个文件写内容,edit().putInt(),这是int型数据,字符型就是putString();最后就是你要用到这个文件的时候,获取就可以了,getString();这里的参数都是两个,第一个都是你定义的key,他是根据你的key来写入和读出的,第二个肯定就是value,就是这个key对应的值。

        还要实现用户输入一个字符(可以是汉字),就可以把数据库中符合这样开头的用户名列出来,用户可以直接选择。

        这个使用AutocompleteTextView做的,他也是EditText的一种。可以设置他从第几个字符开始显示记录,我这里是第一个,然后就是设置对这个的监听事件。这个改变监听事件有三个方法:beforeTextChanged(),onTextChanged(),afterTextChanged()。从名字可以知道是做什么的。这里用到的是第二个和第三个方法。在第二个方法中,我们从sharedpreferences中把所有符合的记录显示出来;在第三个方法中,我们是判断上一次是否记住了密码,如果记住了,我们这次是直接查询数据库,把用户的密码显示出来,不用用户手动输入。

       

//AutoCompleteTextView设置
          sp_passwd = this.getSharedPreferences("password", MODE_PRIVATE);
          sp_cb = this.getSharedPreferences("checkbox", MODE_PRIVATE);
          username = (AutoCompleteTextView)findViewById(R.id.username);
          username.setThreshold(1);
          passwd = (EditText)findViewById(R.id.password);
          passwdCB = (CheckBox)findViewById(R.id.checkBox_save);

          //显示最近一次输入,如果记住密码就直接全部显示出来
          username.setText(sp_cb.getString("USERNAME", ""));
          if(sp_cb.getInt("CHECKBOX", 0)==0){
        	  passwdCB.setChecked(false);
          }else{
        	  passwdCB.setChecked(true);
        	  passwd.setText(sp_cb.getString("PASSWD", ""));
          }
          
          username.addTextChangedListener(new TextWatcher(){
          @Override
  			public void afterTextChanged(Editable arg0) {
  				// TODO Auto-generated method stub
        	    if(sp_cb.getInt("CHECKBOX", 0)==1){
	  				//查询数据库记录
	  				String user = username.getText().toString();
	  				Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+SQLite.TABLE_NAME+" WHERE name='"+user+"'", null); 
	                  String temp = "";  
	                  while(cur.moveToNext()){  
	                      temp += cur.getString(2);  //2代表数据列的第三列,即password
	                  } 
	  				passwd.setText(temp);
        	    }else{
        	    	passwd.setText("");
        	    }
  			}

          @Override
  			public void beforeTextChanged(CharSequence arg0, int arg1,
  					int arg2, int arg3) {
  				// TODO Auto-generated method stub
  				
  			}

          @Override
  			public void onTextChanged(CharSequence arg0, int arg1, int arg2,
  					int arg3) {
  				// TODO Auto-generated method stub
        	  	user = new String[sp_passwd.getAll().size()];// sp.getAll().size()返回的是有多少个键值对
        	    user = sp_passwd.getAll().keySet().toArray(new String[0]);
        	    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_dropdown_item_1line,user);
                username.setAdapter(adapter);
        	    
  				//查询数据库记录
  				/*Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+SQLite.TABLE_NAME, null); 
                  int i = 0;
                  while(cur.moveToNext()){  
                	   user[i++] = cur.getString(1);//1代表数据列的第二列,即username	
                  }
                  //String[] user =new String[]{"chz","chzz","chzzz","1",""};
                  ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_dropdown_item_1line,user);
                  username.setAdapter(adapter);*/
  			}});

        这就是整个的核心。嗯,登陆按键的响应就是查询数据库,看用户名和密码是否和数据库中一致。保存按键的响应就是向数据库中写入记录,也向sharedpreferences中写入,但是不写入密码,只写入用户名,供索引用。退出和登陆都会向sharedpreferences写入checkbox和最近一次用户名的信息,供下次登陆使用。

       我省去了数据库的代码。这里是全部代码。
http://download.csdn.net/download/u012321815/7370705




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF 用户登录界面通常由以下几个元素组成: 1. 用户名输入框 2. 密码输入框 3. 登录按钮 4. 记住密码复选框 5. 用户选择下拉框 其中,记住密码复选框用于保存用户的登录信息,方便用户下次登录时直接使用已经保存的信息,而用户选择下拉框用于选择不同的用户账号,如果该应用程序支持多用户登录的话。 以下是一个简单的WPF用户登录界面的示例代码: ```xaml <Window x:Class="WpfApp1.LoginWindow" ... Title="Login" Height="250" Width="350"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Label Grid.Row="0" Grid.Column="0" Margin="5" Content="Username:"/> <TextBox Grid.Row="0" Grid.Column="1" Margin="5" Name="TxtUsername"/> <Label Grid.Row="1" Grid.Column="0" Margin="5" Content="Password:"/> <PasswordBox Grid.Row="1" Grid.Column="1" Margin="5" Name="TxtPassword"/> <CheckBox Grid.Row="2" Grid.Column="1" Margin="5" Name="ChkRememberMe" Content="Remember me"/> <Label Grid.Row="3" Grid.Column="0" Margin="5" Content="User type:"/> <ComboBox Grid.Row="3" Grid.Column="1" Margin="5" Name="CmbUserType"> <ComboBoxItem Content="Admin"/> <ComboBoxItem Content="User"/> </ComboBox> <Button Grid.Row="4" Grid.Column="1" Margin="5" Content="Login" Click="BtnLogin_Click"/> </Grid> </Window> ``` 在代码中,我们通过 Grid 控件来布局界面中的各个元素,其中第一列为固定的标签,第二列为输入控件。 在登录按钮的 Click 事件中,我们可以获取用户输入的用户名、密码记住密码选项和用户类型,然后根据这些信息进行登录验证和授权操作。如果用户勾选了记住密码选项,我们可以将用户名和密码保存到本地,以便下次登录时自动填充。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值