自定义Dialog+OnKeyListener

hzgmm 2012-12-24 03:15:15
在FirstActivity中,点击button后,弹出一个输入密码对话框,在CustomDialog 这边实现按键输入,并判断输入的密码是否正确!
问题:怎样让CustomDialog这边无论输入密码正确与否,都要返回一个值给FirstActivity这边,因为FirstActivity这样要根据返回值来判断是否继续执行下面的函数。
CustomDialog.java

public class CustomDialog extends Dialog implements Constants{

private Context mContext;
private int iDoWhat;
private LayoutInflater mInflater;
private View passwordView;
private Dialog passwordDialog;
private int passwordValue;
private StringBuffer strBufferPassword;
private boolean bReturn = false;

private ImageView passNormalImage1;
private ImageView passNormalImage2;
private ImageView passNormalImage3;
private ImageView passNormalImage4;

private dbaseManager dbase;
private BOX_INFO_STRUCT stBoxInfo;

public CustomDialog(Context context)
{
super(context);
this.mContext = context;
this.mInflater = LayoutInflater.from(mContext);

strBufferPassword = new StringBuffer();

setView();
initDialog();
}

private void setView()
{
passwordView = mInflater.inflate(R.layout.input_password_layout, null);
passNormalImage1 = (ImageView) passwordView.findViewById(R.id.pass_normal1_id);
passNormalImage2 = (ImageView) passwordView.findViewById(R.id.pass_normal2_id);
passNormalImage3 = (ImageView) passwordView.findViewById(R.id.pass_normal3_id);
passNormalImage4 = (ImageView) passwordView.findViewById(R.id.pass_normal4_id);
}

private void initDialog()
{
passwordDialog = new Dialog(mContext, R.style.Theme_password);

Window dialogWindow = passwordDialog.getWindow();
dialogWindow.setGravity(Gravity.CENTER_VERTICAL);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
// params.width = LayoutParams.MATCH_PARENT;
// params.height = LayoutParams.MATCH_PARENT;
passwordDialog.setCancelable(true);

passwordDialog.setCanceledOnTouchOutside(false);
passwordDialog.addContentView(passwordView, params);
}

public void show()
{
passwordDialog.show();
passwordDialog.setOnKeyListener(inputPassword);
}

private OnKeyListener inputPassword = new OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
switch (keyCode) {
case KEY_0:
// System.out.println("It's 0");
SetImageAlpha(0);
break;
case KEY_1:
// System.out.println("It's 1");
SetImageAlpha(1);
break;
case KEY_2:
// System.out.println("It's 2");
SetImageAlpha(2);
break;
case KEY_3:
// System.out.println("It's 3");
SetImageAlpha(3);
break;
case KEY_4:
// System.out.println("It's 4");
SetImageAlpha(4);
break;
case KEY_5:
// System.out.println("It's 5");
SetImageAlpha(5);
break;
case KEY_6:
// System.out.println("It's 6");
SetImageAlpha(6);
break;
case KEY_7:
// System.out.println("It's 7");
SetImageAlpha(7);
break;
case KEY_8:
// System.out.println("It's 8");
SetImageAlpha(8);
break;
case KEY_9:
// System.out.println("It's 9");
SetImageAlpha(9);
break;
case KEY_EXIT:
passwordValue = 0;
strBufferPassword.setLength(0);
// System.out.println("Now after Key back the strBufferPassword is " + strBufferPassword);
passwordDialog.dismiss();
return true;
default:
break;
}
}
return false;
}};

private boolean SetImageAlpha(int KeyCode) {
System.out.println("your input number is " + KeyCode);
if(0 <= passwordValue && passwordValue < 4)
{
strBufferPassword.append(String.valueOf(KeyCode));
switch(passwordValue){
case 0:
passNormalImage1.setAlpha(0);
break;
case 1:
passNormalImage2.setAlpha(0);
break;
case 2:
passNormalImage3.setAlpha(0);
break;
case 3:
passNormalImage4.setAlpha(0);
break;
default:
break;
}

if(3 == passwordValue)
{
System.out.println("After input finished : "+strBufferPassword);
if(strBufferPassword.toString().equals("1234"))
{
// bReturn = true;

passwordDialog.dismiss();
System.out.println("Congratulation!Pass!");
return true;
}
else{
bReturn = false;
strBufferPassword.setLength(0);
System.out.println("Now after setLength() the strBufferPassword is " + strBufferPassword);
passwordValue = 0;
passNormalImage1.setAlpha(255);
passNormalImage2.setAlpha(255);
passNormalImage3.setAlpha(255);
passNormalImage4.setAlpha(255);
}
}
else
{
passwordValue ++;
}
}
return false;
}
}




FirstActivity.java:

private Button myBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

myBtn = (Button) findViewById(R.id.myBtn_id);
myBtn.setOnClickListener(passwordListner);

}

private OnClickListener passwordListner = new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
customDialog = new CustomDialog(FirstActivity.this);
customDialog.show();
//通过判断返回值,再执行下面函数,问题是怎么让那边输入完密码后,返回一个值
//...

}
};
...全文
282 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
loginnum 2012-12-25
  • 打赏
  • 举报
回复
可以这样
dialog里定义接口
class dialog extends Dialog implements Constants{
private ResultListener mListener;



@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mListener = (FirstActivity)activity;

}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
EditText text = dialog.findViewById(输入框的id);
text.addTextChangedListener(textWatcher);
}

private TextWatcher textWatcher = new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {

}

@Override
public void afterTextChanged(Editable s) {
mListener.editResult(s.toString());
}
};


public interface ResultListener{
public void editResult(String msg);
}

}



FirstActivity.java:

public class FirstActivity extends Activity implements ResultListener{

@Override
public void editResult(String msg){
//TODO
}
}
搬不搬砖 2012-12-25
  • 打赏
  • 举报
回复
public interface SampleInterface { void onFinish(String input); } 用的时候先在firstactivity中实现这个接口,然后把这个接口传到自定义对话框中,然后给对话框的确认按钮增加点击监听,在监听中调用onFinish。参数input就是你要的返回值。 或者不加接口,用handler也是可以的,广播也行。。。
hzgmm 2012-12-25
  • 打赏
  • 举报
回复
引用 5 楼 susuifeng 的回复:
引用 4 楼 hzgmm 的回复:引用 2 楼 susuifeng 的回复:一般都是给setPositiveButton加个监听事件,然后直接获取EditText的内容即可. 你可以把CustomDialog设置成内部类,加一个密码输入结束的判断,然后取出密码框的内容,然后调用FirstActivity的其他方法进行密码验证,或者让对话框消失. 不是很明白你的意思……
我明白你的意思了(原谅我吧!我是初学者),但是,我就是想把CustomDialog抽象成一个类,方便其他地方也能使用这个CustomDialog类,而不是只有一个地方在使用
hzgmm 2012-12-25
  • 打赏
  • 举报
回复
引用 6 楼 zyxel60b 的回复:
可以添加一个回调的方法,把对话框关闭时要做的事放在里面
怎么添加?求指点啊
zyxel60b 2012-12-25
  • 打赏
  • 举报
回复
可以添加一个回调的方法,把对话框关闭时要做的事放在里面
susuifeng 2012-12-25
  • 打赏
  • 举报
回复
引用 4 楼 hzgmm 的回复:
引用 2 楼 susuifeng 的回复:一般都是给setPositiveButton加个监听事件,然后直接获取EditText的内容即可. 你可以把CustomDialog设置成内部类,加一个密码输入结束的判断,然后取出密码框的内容,然后调用FirstActivity的其他方法进行密码验证,或者让对话框消失. 不是很明白你的意思,但是我是想让CustomDial……
写成内部类不影响其他类对CustomDialog的使用. 判断密码输入结束的代码放在CustomDialog类里,如果写成内部类就可以在密码输完之后直接调用FirstActivity的密码验证方法, FirstActivity也就不用知道到底什么时候输入完毕.
hzgmm 2012-12-25
  • 打赏
  • 举报
回复
引用 2 楼 susuifeng 的回复:
一般都是给setPositiveButton加个监听事件,然后直接获取EditText的内容即可. 你可以把CustomDialog设置成内部类,加一个密码输入结束的判断,然后取出密码框的内容,然后调用FirstActivity的其他方法进行密码验证,或者让对话框消失.
不是很明白你的意思,但是我是想让CustomDialog成为一个独立 的类,其他地方只要new一个对象,就可以使用了
Utopia 2012-12-25
  • 打赏
  • 举报
回复
onclick执行完才会弹出对话框,一定要把处理函数放在onclick里面吗
susuifeng 2012-12-25
  • 打赏
  • 举报
回复
一般都是给setPositiveButton加个监听事件,然后直接获取EditText的内容即可. 你可以把CustomDialog设置成内部类,加一个密码输入结束的判断,然后取出密码框的内容,然后调用FirstActivity的其他方法进行密码验证,或者让对话框消失.
hzgmm 2012-12-25
  • 打赏
  • 举报
回复
没人知道吗?
susuifeng 2012-12-25
  • 打赏
  • 举报
回复
引用 14 楼 hzgmm 的回复:
引用 13 楼 susuifeng 的回复:引用 12 楼 hzgmm 的回复:CustomDialog类中: Java code?1234567891011121314151617181920212223242526private ResultListener mListener; public interface ResultListener { ……
没初始化mListener.
hzgmm 2012-12-25
  • 打赏
  • 举报
回复
引用 13 楼 susuifeng 的回复:
引用 12 楼 hzgmm 的回复:CustomDialog类中: Java code?1234567891011121314151617181920212223242526private ResultListener mListener; public interface ResultListener { public void editResul……
就是这行啊 mListener.editResult(msg);
susuifeng 2012-12-25
  • 打赏
  • 举报
回复
引用 12 楼 hzgmm 的回复:
CustomDialog类中: Java code?1234567891011121314151617181920212223242526private ResultListener mListener; public interface ResultListener { public void editResult(String msg); ……
看CustomDialog.java第57行啊
hzgmm 2012-12-25
  • 打赏
  • 举报
回复
CustomDialog类中:

private ResultListener mListener;

public interface ResultListener
	{
		public void editResult(String msg);
	}

public CustomDialog(Context context)
	{
		super(context);
		this.mContext = context;
		this.mInflater = LayoutInflater.from(mContext);
		
		
		
		setView();
		initDialog();
		passwordDialog.setOnKeyListener(inputPassword);
		passwordDialog.setOnDismissListener(new OnDismissListener() {
			
			public void onDismiss(DialogInterface dialog) {
				String msg = "dialog";
				mListener.editResult(msg);
			}
		});
	}
FirstActivity类中:
	public void editResult(String msg) {
		System.out.println(msg);

	}
结果却是报错,为什么呢?
12-25 08:07:52.216: E/AndroidRuntime(7809): FATAL EXCEPTION: main
12-25 08:07:52.216: E/AndroidRuntime(7809): java.lang.NullPointerException
12-25 08:07:52.216: E/AndroidRuntime(7809): 	at com.example.CustomDialog.<init>(CustomDialog.java:57)
loginnum 2012-12-25
  • 打赏
  • 举报
回复
写错了 从 @Override public void onAttach(Activity activity) { 是在Activity里的

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧