我是编程的初学者。我在活动之外有一个函数,当用户在EditText中键入时,应用程序显示一个x来清除表单。当我调用这个函数时会发生错误:android.content.res.Resources android.content.Context.getResources ()
上的空对象引用上的android.content.ContextWrapper.getResources
如果我在同一个类中它可以工作,但是我会在其他活动中使用这个函数很多
我研究了很多,但找不到解决方案
activity.Java
public class Activity extends AppCompatActivity{
EditText edtName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acitivty);
edtName = (EditText)findViewById(R.id.edt1);
FormControl formcontrol = new FormControl();
formcontrol.ajustaEditText(edtName);
}
}
form control.Java
public class FormControl extends AppCompatActivity {
public void ajustaEditText(final EditText et){
String value = "";
final Drawable x = getResources().getDrawable( R.drawable.ic_action_navigation_close);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
et.setCompoundDrawables(null, null, value.equals("") ? null : x, null);
et.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (et.getCompoundDrawables()[2] == null) {
return false;
}
if (event.getAction() != MotionEvent.ACTION_UP) {
return false;
}
if (event.getX() > et.getWidth() - et.getPaddingRight() - x.getIntrinsicWidth()) {
et.setText("");
et.setCompoundDrawables(null, null, null, null);
}
return false;
}
});
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
et.setCompoundDrawables(null, null, et.getText().toString().equals("") ? null : x, null);
}
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
});
}
}
你的FormControl
类扩展了Activity
,这似乎是问题所在。
1 - 删除班上的extend
关系。
public class FormControl
2 - 通过Activity
的当前FormControl
的上下文
private Context context;
public FormControl(Context context){
this.context = context
}
3 - 从当前上下文中获取资源。
final Drawable x = context.getResources().getDrawable( R.drawable.ic_action_navigation_close);
4 - 获取你的FormClass
的对象
FormControl formcontrol = new FormControl(this);
这是不允许的。
FormControl formcontrol = new FormControl();
formcontrol.ajustaEditText(edtName);
您具有intent的启动活动,将数据作为intent bundle对象传递。检查下面的例子。
How do I pass data between Activities in Android application?
FormControl是您无法创建活动实例的活动,您可以获取活动实例。
public static FormControl instance;
public class FormControl extends AppCompatActivity {
public static FormControl getInstance() {
return instance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
}
}
您将不得不将Context
传递给您想要访问getResources()
的任何地方。
所以这样......
活动类
public class Activity extends AppCompatActivity{
EditText edtName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acitivty);
edtName = (EditText)findViewById(R.id.edt1);
FormControl formcontrol = new FormControl();
formcontrol.ajustaEditText(this, edtName);
}
}
FormControl类
public class FormControl {
public void ajustaEditText(Context context,final EditText et){
String value = "";
final Drawable x = context.getResources().getDrawable( R.drawable.ic_action_navigation_close);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
et.setCompoundDrawables(null, null, value.equals("") ? null : x, null);
et.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (et.getCompoundDrawables()[2] == null) {
return false;
}
if (event.getAction() != MotionEvent.ACTION_UP) {
return false;
}
if (event.getX() > et.getWidth() - et.getPaddingRight() - x.getIntrinsicWidth()) {
et.setText("");
et.setCompoundDrawables(null, null, null, null);
}
return false;
}
});
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
et.setCompoundDrawables(null, null, et.getText().toString().equals("") ? null : x, null);
}
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
});
}}