.setOnClickListener报错NullPointerException

本文介绍如何在Android应用中创建自定义登录对话框,并使用SharedPreferences保存用户登录状态及设置。文章详细展示了如何处理布局文件中的组件引用问题,以及解决点击事件NullPointerException的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AlertDialog.Builder ad=new AlertDialog.Builder(this);
		ad.setTitle("请登录");
		View ldView=LayoutInflater.from(MainActivity.this).inflate(R.layout.login_dialog,null, false);
		ad.setView(ldView);
		//通过sp对象在/data/data/SharedPreferences/目录下的创建或打开user.xml,指定只能被本应用程序读写
		sp=this.getSharedPreferences("user", Context.MODE_PRIVATE);
		//初始化登录框数据
		if(sp.getBoolean("isRemenber", false))
		{
			etUserName.setText(sp.getString("userName",""));
            etPassword.setText(sp.getString("password",""));            
			cbShowPw.setChecked(sp.getBoolean("isShowPw",false));
			cbRemenber.setChecked(sp.getBoolean("isRemenber", false));
		}
		
		cbRemenber.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Editor edit=sp.edit();
				String name=etUserName.getText().toString().trim();
				String password=etPassword.getText().toString().trim();
				if(cbRemenber.isChecked()){
					edit.putString("userName", name);
					edit.putString("password", password);
					edit.putBoolean("isRember", true);
					edit.putBoolean("isShowPw", cbShowPw.isChecked());
					edit.commit();
				}else{
					edit.putString("userName","");
					edit.putString("password","");
					edit.putBoolean("isRember", false);
					edit.putBoolean("isShowPw", cbShowPw.isChecked());
					edit.commit();
				}
			}
		});
		
		cbShowPw.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Editor edit=sp.edit();
				if(cbShowPw.isChecked())
				{
					edit.putBoolean("isShowPw", true);
					edit.commit();
					//密码由密文变为明文
					etPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
				}
				else{
					//密码由明文变为密文
					etPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
				}
			}
		});


我在这个对话框里插入一个布局文件,变量的实例化直接写成 下面这样

etUserName=(EditText)this.findViewById(R.id.et_userName);
etPassword=(EditText)this.findViewById(R.id.et_passWord);
btLogin=(Button)this.findViewById(R.id.bt_login);
btCancel=(Button)this.findViewById(R.id.bt_cancel);
cbShowPw=(CheckBox)this.findViewById(R.id.cb_showPw);
cbRemenber=(CheckBox)this.findViewById(R.id.cb_rember);

结果是运行的时候报错

两个checkbox的.setOnClickListener都是NullPointerException


后来想到,这是在main.xml中寻找id,但我需要的是login_dialog.xml中的id

故改成下面这样

AlertDialog.Builder ad=new AlertDialog.Builder(this);
		ad.setTitle("请登录");
		View ldView=LayoutInflater.from(MainActivity.this).inflate(R.layout.login_dialog,null, false);
		etUserName=(EditText)ldView.findViewById(R.id.et_userName);
		etPassword=(EditText)ldView.findViewById(R.id.et_passWord);
		btLogin=(Button)ldView.findViewById(R.id.bt_login);
		btCancel=(Button)ldView.findViewById(R.id.bt_cancel);
		cbShowPw=(CheckBox)ldView.findViewById(R.id.cb_showPw);
		cbRemenber=(CheckBox)ldView.findViewById(R.id.cb_rember);
		ad.setView(ldView);
		//通过sp对象在/data/data/SharedPreferences/目录下的创建或打开user.xml,指定只能被本应用程序读写
		sp=this.getSharedPreferences("user", Context.MODE_PRIVATE);
		//初始化登录框数据
		if(sp.getBoolean("isRemenber", false))
		{
			etUserName.setText(sp.getString("userName",""));
            etPassword.setText(sp.getString("password",""));            
			cbShowPw.setChecked(sp.getBoolean("isShowPw",false));
			cbRemenber.setChecked(sp.getBoolean("isRemenber", false));
		}
		
		cbRemenber.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Editor edit=sp.edit();
				String name=etUserName.getText().toString().trim();
				String password=etPassword.getText().toString().trim();
				if(cbRemenber.isChecked()){
					edit.putString("userName", name);
					edit.putString("password", password);
					edit.putBoolean("isRember", true);
					edit.putBoolean("isShowPw", cbShowPw.isChecked());
					edit.commit();
				}else{
					edit.putString("userName","");
					edit.putString("password","");
					edit.putBoolean("isRember", false);
					edit.putBoolean("isShowPw", cbShowPw.isChecked());
					edit.commit();
				}
			}
		});
		
		cbShowPw.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Editor edit=sp.edit();
				if(cbShowPw.isChecked())
				{
					edit.putBoolean("isShowPw", true);
					edit.commit();
					//密码由密文变为明文
					etPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
				}
				else{
					//密码由明文变为密文
					etPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
				}
			}
		});

运行正常


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值