使用在另一个 class 中调用的方法设置 edittext 文本
setting edittext text with a method called in an another class
我在 activity 中初始化了 edittext,例如:
EditText date;
DateDialog date_class;
protected void onCreate(Bundle savedInstanceState) {
date = findViewById(R.id.date_input);
date.setOnClickListener(this);
date_class = new DateDialog();
........
}
并在 onclicklistner 处:
public void onClick(View v) {
.....
date_class.SetDateString();
.....
}
另一个 class (DateDialog) 中的 SetDateString() 方法是:
public void SetDateString() {
String name = "bla bla bla";
Activity act= new Activity();//defining the activity object
act.setdate(name);//sends the string to the activity's method where it will set a text for the edittext
}
所以它发送一个带有 act.setdate(name) 方法的字符串,该方法在 activity 中定义,例如:
public void setdate(String name){
date.setText(name);// sets a text for the edittext
}
我已经为您简化了代码来解释这一点,我正在使用其他 class 对此 activity 做一些工作,但不幸的是 returns 这个错误 :
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
这种方法与标准数据流相反,即使你让它工作,它也可能导致线程问题。你永远不应该试图从除它本身以外的任何 class 操纵 UI。
如果我的推断正确,您想单击一个文本框,打开一个对话框,在对话框中做一些事情,然后更新您的初始 activity?这是您要使用接口的情况。
暂时在封闭 class 之外的 activity 底部定义一个接口。
interface DialogCallback{
String doSomething(String name);
}
在你的 DateDialog class 添加一个变量
private DialogCallback dialogCallback;
在你的主 activity 中添加这个到你的 class 初始化:
implements DialogCallback
按 ALT+Enter 并执行方法 doSomething(String name)。当您初始化 DateDialog class 时,您需要设置回调变量,方法是在 init 调用中执行此操作或在 DateDialog class.
中作为单独的 setter
void setCallback(DialogCallback callback){
this.dialogCallback = callback;
}
然后在初始化后设置它 class:
date_class = new DateDialog();
date_class.setCallback(this);
最后,将您的功能从
更改为
public void SetDateString() {
String name = "bla bla bla";
Activity act= new Activity();//defining the activity object
act.setdate(name);//sends the string to the activity's method where it will set a text for the edittext
}
到
public void setDateString(){
String name = "foo";
dialogCallback.doStuff(name);
}
现在它将将该字符串传回您的主要 class 到已实现的“DoStuff(String name)”函数,您可以使用它来更新 UI.
此外,您的变量应该类似于“dateClass”而不是“date_class”,并且函数不应以大写字母开头。
至于为什么代码不起作用,我的猜测是 Activity = new Activity()。这没有任何意义,您没有创建任何特定 class 的实例,即使您创建了实例,它也将是“新的”,这意味着将无法访问任何先前定义的 ui 元素。
我在 activity 中初始化了 edittext,例如:
EditText date;
DateDialog date_class;
protected void onCreate(Bundle savedInstanceState) {
date = findViewById(R.id.date_input);
date.setOnClickListener(this);
date_class = new DateDialog();
........
}
并在 onclicklistner 处:
public void onClick(View v) {
.....
date_class.SetDateString();
.....
}
另一个 class (DateDialog) 中的 SetDateString() 方法是:
public void SetDateString() {
String name = "bla bla bla";
Activity act= new Activity();//defining the activity object
act.setdate(name);//sends the string to the activity's method where it will set a text for the edittext
}
所以它发送一个带有 act.setdate(name) 方法的字符串,该方法在 activity 中定义,例如:
public void setdate(String name){
date.setText(name);// sets a text for the edittext
}
我已经为您简化了代码来解释这一点,我正在使用其他 class 对此 activity 做一些工作,但不幸的是 returns 这个错误 :
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
这种方法与标准数据流相反,即使你让它工作,它也可能导致线程问题。你永远不应该试图从除它本身以外的任何 class 操纵 UI。
如果我的推断正确,您想单击一个文本框,打开一个对话框,在对话框中做一些事情,然后更新您的初始 activity?这是您要使用接口的情况。
暂时在封闭 class 之外的 activity 底部定义一个接口。
interface DialogCallback{
String doSomething(String name);
}
在你的 DateDialog class 添加一个变量
private DialogCallback dialogCallback;
在你的主 activity 中添加这个到你的 class 初始化:
implements DialogCallback
按 ALT+Enter 并执行方法 doSomething(String name)。当您初始化 DateDialog class 时,您需要设置回调变量,方法是在 init 调用中执行此操作或在 DateDialog class.
中作为单独的 settervoid setCallback(DialogCallback callback){
this.dialogCallback = callback;
}
然后在初始化后设置它 class:
date_class = new DateDialog();
date_class.setCallback(this);
最后,将您的功能从
更改为public void SetDateString() {
String name = "bla bla bla";
Activity act= new Activity();//defining the activity object
act.setdate(name);//sends the string to the activity's method where it will set a text for the edittext
}
到
public void setDateString(){
String name = "foo";
dialogCallback.doStuff(name);
}
现在它将将该字符串传回您的主要 class 到已实现的“DoStuff(String name)”函数,您可以使用它来更新 UI.
此外,您的变量应该类似于“dateClass”而不是“date_class”,并且函数不应以大写字母开头。
至于为什么代码不起作用,我的猜测是 Activity = new Activity()。这没有任何意义,您没有创建任何特定 class 的实例,即使您创建了实例,它也将是“新的”,这意味着将无法访问任何先前定义的 ui 元素。